APP下载

FTP实时速率计算实现方法

2011-07-05袁春兰任家富

仪器仪表用户 2011年5期
关键词:拷贝传输速率端口

袁春兰,任家富,童 睿

(成都理工大学信息科学与技术学院,成都610059)

0 引言

FTP(File Transfer Protocol)是一种文件传输的协议,用于Internet上的控制文件的双向传输。同时,它也是一个应用程序。使用FTP时,用户不需要关心计算机的位置,以及计算机所使用的文件系统。用户可以通过FTP客户端软件访问服务器上大量的资源,从远程主机拷贝需要的数据文件,也可以把自己收集到的资源上传到服务器上与他人共享[1]。这些数字文件资源在网络中的传输受不同的客户端、服务器以及网络状态的影响,传输速率是不定的,因此怎样测得FTP文件传输的实时速率,成为我们了解客户端或服务器工作情况的重要依据。

1 FTP工作原理

简单来说,FTP的功能就是让用户连接一个远程计算机,实现文件共享,其工作原理是(以下载文件为例)当用户启动FTP从远程计算机拷贝文件时,实际上启动了两个程序:一个本地机上的FTP客户程序,它向FTP服务器提出拷贝本件的请求。另一个是启动在远程计算机上的FTP服务器程序,它响应用户的请求,把用户指定的文件传送到用户的计算机中。FTP采用“客户机/服务器”方式,用户端要在自己的本地计算机上安装FTP客户程序。FTP客户程序有字符界面和图形界面两种。字符界面的FTP命令复杂,繁多,图形界面的FTP客户程序,操作上要简洁方便的多。由于FTP操作简单、实用且开放性强,能充分利用Internet来进行信息传输与交流,所以,FTP在Internet上的应用非常的广泛。

2 实现FTP传输的方法

在Windows系统上实现FTP传输的方法,一般有两种:其一是使用系统提供的FTP处理库winlnet,,由系统控制FTP传输过程,第二种是使用基本的socket以及其衍生类,完全由代码控制整个FTP协议通信过程。

2.1 系统提供的FTP处理库方法

应用Winlnet库能够帮助程序实现浏览并处理FTP服务器上的文件及文件夹,其过程如下:

首先调用InternetOpen函数进行Winlnet库的内部初始化工作,该函数可以指定直接访问还是通过代理,并且可以指定是否离线访问,成功调用后将返回一个用于执行后续Internet-Connect函数,调用HINTERNET句柄。

接下来调用InternetConnect函数将打开一个FTP会话,设函数指定访问的服务器和端口,以及使用的用户名及密码,另外还需指定采用主动或被动模式,链接成功后,该函数将返回一个用于后续各种FTP操作的HINTERNET句柄。

可以使用FtpFindFirstFile及InternetFindNextFile进行遍历FTP服务器操作,也可使用FtpGetFile或者FtpPutFile直接进行FTP文件传输,为了进行速率计算,一般采用第三种方法,即先使用FtpOpenFile获得FTP文件句柄,再调用InternetReadFile或IternetWriteFile进行传输控制。流程如图1所示。

图1 使用FTP处理库winlnet实现FTP传输流程

2.2 利用socket衍生类实现FTP客户端

如果.Net1.1平台上并没有对应的winlnet封装,也没有方便FTP控制库,我们可以通过Dllimport引用winlnet库来访问Ftp。在这里,我要介绍的是采用.Net平台本身提供的TCPClient类来实现速率计算的方法。TCPClient类是对socket类的一个简单封装,它为TCP网络服务提供客服端链接功能,这样就避免了使用者建立TCP类型socket对象的固定代码编写过程。由于TCPClient类本身只提供客户端连接功能,所以FTP传输过程中我们需要完全自行编写代码实现协议交互过程,具体如下:

1)首先有客户端开启命令通道,发起连接,若链接成功,服务端返回欢迎信息。

2)客户端收到需要密码信息,则发送密码,而服务器端再根据访问策略表返回登录成功与否信息。

3)发送传输类型即字符型或二进制型,假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时FTP通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序、数据库、字处理文件或者压缩文件。在拷贝任何非文本文件之前,用binary命令告诉FTP逐字拷贝。在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。发送传输模式即Standard(PORT方式,主动方式),或Passive(PASV,被动方式)。主动模式即由客户端首先和服务器的TCP21端口建立连接,用来发送命令,客户端需要接受数据的时候在这个通道上发送PORT命令。PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。FTP server必须和客户端建立一个新的连接用来传送数据。被动方式建立控制通道和主动模式类似,但建立连接后发送PASV命令。服务器收到PASV命令后,打开一个临时端口(端口号大于1023小于655535)并且通知客户端在这个端口上传送数据请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口传送书数据。由于开放新端口需要获取当前系统未占用端口列表。而平台不直接提供获取函数,所以一般采用被动传输模式。客户端发送被动模式命令后,服务器端将返回开放的文件端口号[3]。

在被动模式下,客服端将主动连接服务器开放的用于文件传输的端口,使用TCPClient的GETStream方法可以获得IO流的派生类对象.NetworkStream,这样可进行数据访问操作。整个流程如图2所示。

图2 利用socket衍生类实现FTP客户端的传输流程

3 Ftp传输速率计算方法的简介

理论上严格来说,真正能够体现每一时间点真实传输情况的速率值是每一确定时间点的瞬时速率值。在路程—时间二维图上,瞬时速率表现为曲线上某时间点切线的斜率值。但是在这里我采取的是采用近似的方法计算瞬时速率,即计算实际速率值在短时间内的平均速率值,在路程—时间二维图上,平均数率表现为两个时间点间曲线割线的斜率值,在我们的FTP软件中,我们采用一秒作为一次速率计算的统计时间段。

由于FTP读取函数本身没有设置该次读取时间参数,只能设置希望读取大小,导致一次读取耗时并不能准确限制到一秒。所以,我们只能通过分次读取,计算多次读取总耗时的办法来计算。这种情况下,单次的希望读取大小值的设计就尤为重要。如果这个值过大,则可能导致多次耗时总为一秒的偏差接近100%,而如果太小,中间代码必定执行很多而影响读取效率。导致读取速率值偏低。一般设置效果为每5次读取达到一秒,这时的实际最大耗时偏为20%,如果这个总耗时大于一秒,则用实际总读取字节数除以总耗时进行一次速率计算,以下为具体流程:

1)Ftp访问初始化操作。

2)用变量timeStart记录本次计算开始读取时间。

3)读取Ftp文件数据,记录实际读取字节数,并加总到本次速率计算实际总读取数iTotalBytes上。

4)用变量timeEnd记录结束读取时间。若返回读取大小为0,则不等时间大于一秒就执行计算完速率。并且计算后退出循环。

5)若timeEnd和timeStart之差小于一秒就执行计算完速率,则继续3)操作,反之则向下执行。

6)计算速率值 velocity=iTototalBytes/(timeEnd-time-Start);继续2)执行。如图3所示。

图3 Ftp传输速率计算方法流程

4 结论

经过设计实现并使用GUI进行绘制,我们可以实现软件界面上展示类似于其他Ftp服务端软件所提供的实时传输速率变化曲线图。

通过设计Ftp通信流程,我们很好的解决了Ftp传输速率实时获取难题,同时,这也为我们提供了一个很好的思路。那就是在必要时一定要通过自己控制底层协议代码而不依靠系统,来完成上层协议中的交互通信难题。

[1]杨延双,张建标,王全民.TCP/IP协议分析及应用[M].北京:机械工业出版社,2007:132.

[2]高宇.小议架设FTP服务器及文件传输方法品牌[J].(理论月刊,2010,(9):54.

[3]王文选.深入理解FTP数据连接方式[J].华南金融电脑,2010,(07):46.

[4]冯素梅.FTP Client软件的分析与设计[J].重庆科技学院学报,自然科学版,2010,(6):142.

[5][美]Andrew Krowczyk,[美]Vinod Kumar.NET网络高级编程[M].北京:科学出版社,2003:190-232.

[6]W.Richard Stevens.TCP/IP协议详解[M].范建华译.北京:机械工业出版社,2000:214-223.

[7]任泰明.TCP/IP协议与网络编程[M].西安:西安电子科技大学出版社,2004:230-290.

猜你喜欢

拷贝传输速率端口
华为交换机端口Hybrid 模式的应用
一种有源二端口网络参数计算方法
一种端口故障的解决方案
隔离型三端口变换器的H∞鲁棒控制
三星利用5G毫米波 实现创纪录传输速率
文化拷贝应该如何“拷”
文化拷贝应该如何“拷”
夏季滨海湿地互花米草植物甲烷传输研究
数据传输速率
影子与我