背景技术
TFTP是一个传输文件的简单协议(参考RFC(Request For Comments)1350),其实现基于用户数据包协议(User Datagram Protocol,UDP),可以在不同网络的主机间进行文件传送。
下面对TFTP进行详细说明。
TFTP基于UDP实现,其协议分层从下至上依次为物理层、数据链路层、互联网协议(Internet Protocol,IP)层、UDP层、TFTP层。TFTP使用端口69作为服务器端口,其所支持的指令有如下5种。
opcode operation
1 Read request(RRQ)
2 Write request(WRQ)
3 Data(DATA)
4 Acknowledgment(ACK)
5 Error(ERROR)
其中,opcode为1、2、3、5的报文是TFTP客户端所使用的报文,而opcode为3、4、5的报文是TFTP服务器所使用的报文。
更具体地,TFTP指令的opcode为1(RRQ)、2(WRQ)时,指令的报文格式如下。
其中,opcode表示指令,占两个字节,具体地为“1”或“2”。filename表示文件名,是以0为终止符的ascii字符串。filename后紧接一个值为0的字节。mode表示传输模式,是以0为终止符的ascii字符串。TFTP支持两种传输模式,mode为字符串“netascii”,则表示数据是8位的ASCII码形式,而mode为字符串“octet”,则表示数据是8位的源数据类型。mode后紧接一个值为0的字节。
RRQ指令或WRQ指令只能由TFTP客户端发起。
TFTP指令的opcode为3(DATA)时,指令的报文格式如下。
其中,opcode表示指令,占两个字节,具体地为“3”。Block#表示文件数据块号,占2个字节,且1<=Block#<=65535。data表示文件数据,占0~512字节。如果不是最后一个数据块,则data必须为512字节,如果是最后一个数据块,data必须小于512字节(可以为0)。
如果TFTP客户端发起RRQ(读文件),则由TFTP服务器发送DATA。
如果TFTP客户端发起WRQ(,写文件),则由TFTP客户端发送DATA。
TFTP指令的opcode为4(ACK)时,指令的报文格式如下。
其中,opcode表示指令,占两个字节,具体地为“4”。Block#表示文件数据块号,占2个字节,且1<=Block#<=65535,用于对opcode为1或2的读或写文件指令进行确认。
每一个RRQ或WRQ指令必须对应一个确认字符、即ACK。如果TFTP客户端发起RRQ(读文件),则TFTP服务器发送DATA,TFTP客户端回应ACK。如果TFTP客户端发起WRQ(写文件),则TFTP客户端发送DATA,TFTP服务器回应ACK。
TFTP指令的opcode为5(ERROR)时,指令的报文格式如下。
opcode |
errorcode |
errmsg |
0 |
其中,opcode表示指令,占两个字节,具体地为“5”。errorcode表示错误号,占2个字节,errorcode的值以及其相应的含义如下。
0 未定义错误,错误原因参考errmsg
1 指定的文件不存在
2 指定的文件不允许访问
3 磁盘空间满
4 不可识别的TFTP opcode
5 IP报文的传输ID错误
6 指定的文件已经存在
7 没有指定的用户
errmsg表示错误消息,是以0为终止符的ascii字符串,用以提示用户有关错误的消息。errmsg后紧接一个值为0的字节。
图1为表示现有的典型的TFTP客户端从TFTP服务器获取文件的过程的图。
在步骤1010,TFTP客户端向TFTP服务器发送读文件指令,即opcode为1(RRQ);filename为指定要读取的文件名;mode为“octet”表示以二进制方式传输。
在步骤1021,TFTP服务器收到TFTP客户端的读指令后,TFTP服务器向TFTP客户端发送数据,即opcode为3(DATA);block#为1,表示本次发送的数据是指定文件的第一块512字节的数据;data为指定文件的第一块512字节的数据。
在步骤1022,TFTP客户端收到TFTP服务器发送的数据后,TFTP客户端向TFTP服务器发送确认指令,即opcode为4(ACK);block#为1,表示TFTP客户端已经收到步骤1021的数据。
在步骤1031,TFTP服务器收到TFTP客户端的确认指令后,TFTP服务器向TFTP客户端发送数据,即opcode为3(DATA);block#为2,表示本次发送的数据是指定文件的第二块512字节的数据;data为指定文件的第二块512字节的数据。
在步骤1032,TFTP客户端收到TFTP服务器发送的数据后,TFTP客户端向TFTP服务器发送确认指令,即opcode为4(ACK);block#为2,表示TFTP客户端已经收到步骤1031的数据。
以此类推,TFTP服务器与TFTP客户端依次发送第3块至第n-1块的数据及确认指令。每一个数据块的大小为512字节。这里,n为指定的要读取的文件的数据块数。
接着,在步骤10n1,TFTP服务器向TFTP客户端发送数据,即opcode为3(DATA);block#为n,表示本次发送的数据是指定文件的第n块数据(也是最后一块数据),数据长度小于512字节(也可以为0);data为指定文件的第n块数据(,也是最后一块数据)。
在步骤10n2,TFTP客户端向TFTP服务器发送确认指令,即opcode为4(ACK);block#为n,表示TFTP客户端已经收到步骤10n1的数据;整个文件传输过程结束。
TFTP协议设计的初旨是进行小文件的传输,因此很容易实现,但不具备通常的文件传输协议(File Transfer Protocol,FTP)所具有的许多功能,例如TFTP只能从文件服务器上下载文件或向文件服务器上载文件,而不能像FTP那样列出目录,也不具有FTP所具有的认证功能。尤其,最早的TFTP协议因太过简单,而有很多限制。比如,文件块只能是512字节,传输效率低,再则没有约定超时机制。为解决这些问题,对TFTP协议进行了扩展,具体地,RFC2347允许扩展选项,RFC2348允许文件块大小协商,RFC2349允许超时协商。
具体地,当TFTP指令的opcode为1、2时,指令的报文格式如下。
opcode |
filename |
0 |
mode |
0 |
op |
0 |
value |
0 |
其中,opcode、filename及mode的含义不变。mode后可以跟多个选项对。每个选项对由一个op和一个value构成,op和value后紧跟一个值为0的字节。op为自定义选项名称,是以“0”为终止符的ascii字符串。value为自定义选项值,是以“0”为终止符的ascii字符串。
比如在RFC2348中,允许协商data的大小,此时,op为“blksize”,value为字符串,该字符串为数字,单位为字节,比如“1428”表示1428字节。
而在RFC2349中,则允许协商重传时间。此时,op为“timeout”,value为字符串,该字符串表示数字,单位为秒,比如“30”表示30秒。并且,在RFC2349中,允许通告文件大小,此时,op为“tsize”,value为字符串,该字符串表示数字,单位为字节,比如“234567”表示234567字节。
而且,新增如下的TFTP指令。
opcode operation
6 acknowledge the options(OACK)
上述OACK指令、即选项确认字符指令的报文格式如下
其中,opcode表示指令,占两个字节,具体地为“6”。opcode后可以跟多个选项对。每个选项对由一个op和一个value构成,op和value后紧跟一个值为0的字节。op为自定义选项名称,是以“0”为终止符的ascii字符串。value为自定义选项值,是以“0”为终止符的ascii字符串。
TFTP服务器收到携带选项的RRQ或WRQ后,回应OACK。如果TFTP服务器支持TFTP客户端指定的选项,则OACK中携带对应的选项对,op为TFTP客户端发送的选项名,value为TFTP服务器支持的相应op选项的值。
通过TFTP客户端携带自定义选项,TFTP服务器回应OACK,TFTP服务器和客户端可以协商具体的选项。TFTP客户端收到TFTP服务器的OACK后,回应ACK(black#为0),表示接受TFTP服务器的选项值。
以下,将RFC2347、RFC2348、RFC2349中带有扩展选项op及value的TFTP指令称为TFTP扩展指令。
图2为以支持文件传输块大小协商的RFC2348为例,示出TFTP客户端从TFTP服务器获取文件的过程的图。
在步骤2011,TFTP客户端向TFTP服务器发送读文件指令,即opcode为1(RRQ);filename为指定要读取的文件名;mode为“octet”表示以二进制方式传输;第一个自定义选项关键字(op)为“blksize”,第一个自定义选项值(value)为1432。
在步骤2012,TFTP服务器收到步骤2011中由TFTP发送的指令后,发现有自定义选项“blksize”,TFTP服务器本身支持这个自定义选项(“blksize”)和自定义选项值(1432),则回应TFTP客户端OACK,即opcode为6(OACK);第一个自定义选项关键字(op)为“blksize”,第一个自定义选项值(value)为1432,表示确认支持TFTP客户端指定的自定义选项。
在步骤2013,TFTP客户端收到TFTP服务器发送的OACK,发现TFTP服务器支持自己(TFTP客户端)指定的自定义选项“blksize”及选项值“1432”,说明选项协商成功,回应TFTP服务器ACK,即opcode为4(ACK);block#为0,表示选项协商成功。
在步骤2021,TFTP服务器收到TFTP客户端的选项协商成功确认后,向TFTP客户端发送第一块数据,即opcode为3(DATA);block#为1,表示本次发送的数据是指定文件的第一块1432字节的数据;data为指定文件的第一块1432字节的数据。
在步骤2022,TFTP客户端向TFTP服务器发送确认指令,即opcode为4(ACK);block#为2,表示TFTP客户端已经收到步骤2021的数据。
接着,TFTP服务器与TFTP客户端依次发送第二块至第n-1块的数据及确认指令。每一个数据块的大小为1432字节。这里,n为指定的要读取的文件的数据块数。
接着,在步骤20n1,TFTP服务器向TFTP客户端发送数据,即opcode为3(DATA);block#为n,表示本次发送的数据是指定文件的第n块数据(也是最后一块数据),数据长度小于1432字节(也可以为0);data为指定文件的第n块数据(也是最后一块数据)。
在步骤20n2,TFTP客户端向TFTP服务器发送确认指令,即opcode为4(ACK);block#为n,表示TFTP客户端已经收到步骤20n1的数据;整个文件传输过程结束。
上述的RFC2347、RFC2348、RFC2349只是对TFTP协议进行扩展,优化了传输效率,但本质上还是客户机/服务器(Client/Server,CS)结构,无法消除TFTP服务器性能瓶颈的隐患。
具体实施方式
以下,参照附图及表格详细说明本发明的实施方式。
(实施方式)
根据本发明的实施方式的文件传输方法,是基于RFC2347对TFTP进行的优化,具体地,扩展TFTP选项,引入点对点(Peer-to-Peer,p2p)机制。
通过在文件传输设备之间引入p2p机制,文件传输设备并非固定为客户端或服务器端,而是即可以工作于客户端模式或服务器模式,也可以工作在客户端模式的同时,支持作为临时的服务器。
具体地,p2p机制是指客户端先从一个服务器(这里称为first)获取文件信息,文件信息中包含“文件大小”以及“表示哪些其它服务器(这里称为second,可能是多个)可以提供指定的下载文件的信息”等。
此时,自定义选项名称、即op为“p2p”,是以0为终止符的ascii字符串。该op选项只支持RRQ(即下载文件)和OACK指令指令。相应地,自定义选项值、即value为变长字节数值,其构成为work-mode+file-mode+first-ip+time+count+info-list。
<work-mode>
work-mode表示工作模式,为1字节数值,数值为“1”则表示文件传输设备工作在客户端模式,数值为“2”则表示文件传输设备工作在客户端模式,同时支持作为临时的TFTP服务器。数值为“3”则表示设备工作在服务器模式,即固定作为TFTP服务器。
<file-mode>
fle-mode表示文件获取模式,为1字节数值。bit0,对于TFTP客户端,表示支持从指定的一个TFTP服务器(包括临时或固定的TFTP服务器)下载完整文件,而对于TFTP服务器,表示允许一个TFTP客户端从自己这里下载指定的完整的文件。bit1,对于TFTP客户端,表示支持从指定的多个TFTP服务器(包括临时或固定的TFTP服务器)下载所述指定文件的不同部分;而对于TFTP服务器,表示允许一个TFTP客户端从自己这里下载所述指定文件的一部分数据,其它位保留。
bit0和bit1不冲突,可以同时置位,bit0和bit1同时置位时,对于TFTP客户端,表示既可以从指定的一个TFTP服务器(包括临时或固定的TFTP服务器)下载完整文件,也可以从指定的多个TFTP服务器(包括临时或固定的TFTP服务器)下载所述指定文件的不同部分。而对于TFTP服务器,则表示既允许一个TFTP客户端从自己这里下载指定的完整的文件,也允许一个TFTP客户端从自己这里下载所述指定文件的一部分数据。
<first-ip>
first-ip表示TFTP服务器IP地址,为4字节数值。
(1)当TFTP客户端向frst发起RRQ请求时,first-ip为first的IP地址。first收到TFTP客户端的RRQ请求后可以校验first-ip是否为自己的IP地址。Second收到TFTP客户端的RRQ请求后可以校验first-ip是否是自己信任的first推荐过来的。
(2)当TFTP服务器(包括临时TFTP服务器)回应OACK时,first-ip为前面RRQ请求中相应的first-ip。
<time>
time表示TFTP客户端下载完指定文件后作为临时TFTP服务器提供这个文件的下载服务的时间长度,为4字节数值,单位为秒。
(1)当TFTP客户端发起RRQ请求时,如果客户端支持临时TFTP服务器,则time表示自己支持作为临时TFTP服务器的时间长度;如果客户端支持固定TFTP服务器,time必须为0xffffffff,表示无限时间长度;如果客户端只支持客户端模式,则time必须为0。
(2)当固定TFTP服务器回应OACK时,time无意义。
(3)当临时TFTP服务器回应OACK时,time是临时TFTP服务器剩余的服务时间长度(承诺的时间长度减去已经工作的时间长度)。
<count>
count表示后面info-list的个数,为2字节数值。
(1)当TFTP客户端向固定TFTP服务器发起RRQ时,count必须为0。
(2)当TFTP客户端向临时TFTP服务器发起RRQ时,count必须为0或1。count为0表示希望从临时TFTP服务器下载指定的完整文件;count为1,表示下载info-list指定的部分文件。
(3)当固定TFTP服务器向TFTP客户端发送OACK时,如果固定TFTP服务器所存储的服务器列表表格中没有临时服务器,则count必须为0,表示TFTP客户端需要从自己(固定TFTP服务器)下载完整文件;而如果固定TFTP服务器所存储的服务器列表表格中有临时服务器,则count必须大于等于1。count为1,表示TFTP客户端需要从指定的临时TFTP服务器下载完整文件;count>1,表示TFTP客户端需要分别从多个临时TFTP服务器下载指定文件的不同部分。
(4)临时TFTP服务器向TFTP客户端发送OACK时,count和info-list必须与OACK对应的前面的RRQ中的count和info-list一致。
<info-list>
info-list由count个info组成,每个info的构成为ip+begin+end。
(1)其中,ip表示服务器IP地址,为4字节数值。begin表示数据块在文件中的起始位置(从0开始),即相对于文件第一个字节的偏移,为4字节数值。end表示数据块在文件中的结束位置(从0开始),即相对于文件第一个字节的偏移,为4字节数值。
(2)对于TFTP客户端,向first发起RRQ时,count必须为0。向second发起RRQ时,ip必须填充为second的IP地址,begin表示希望获取的所述指定文件起始位置,end表示希望获取的所述指定文件结束位置。
(3)对于TFTP服务器,当first回应RRQ时,count必须大于等于1,ip表示其它TFTP服务器的IP地址,该服务器拥有所述指定文件的begin和end之间的文件数据。这里,如果count为1,begin为文件起始,end为文件结束,则表示first推荐客户端从指定的ip(first或second)下载整个文件。
(4)second回应RRQ时,count和info-list必须与OACK对应的前面的RRQ中的count和info-list一致。
对于TFTP服务器,如果支持从指定的多个TFTP服务器下载文件的不同部分的模式,则需要本地记录相应文件的临时服务器信息,即哪些服务器上有相应的文件,如下表1为TFTP服务器所存储的服务器列表表格。
表1
当TFTP客户端发起携带p2p的RRQ时,对于接收到携带p2p的RRQ请求的TFTP服务器,如果自己维护的服务器列表表格中没有指定的文件信息,则允许客户端从自己这里(一个服务器)处下载文件。同时如果客户端支持临时服务器,则向服务器列表表格中记录这个客户端IP地址及可以作为临时服务器的时间。
而如果接收到携带p2p的RRQ请求的TFTP服务器所维护的服务器列表表格中有指定的文件信息,则通知客户端从指定的文件信息中对应的临时服务器下载。即TFTP服务器通过Info-list告诉当前TFTP客户端从哪些临时TFTP服务器下载。
服务器根据临时服务器时间对表项进行老化处理。
下面对根据本发明的p2p机制的文件传输方法的具体的文件传输过程,进行举例说明。
在此例子中,有三个TFTP客户端,分别记为TFTP客户端1(IP地址为ip-1)、TFTP客户端2(IP地址为IP-2)、TFTP客户端3(IP地址为ip-3),这三个TFTP客户端均支持work-mode的值为2,均支持file-mode的值为0xC0(即bit0和bit1同时置位),支持作为临时服务器时的time的值均为3600秒(1小时)。同时在此例中,有1个TFTP服务器,记为TFTP服务器1(IP地址为ip-4),支持work-mode的值为3,支持file-mode的值为0xC0(即bit0和bit1同时置位),TFTP服务器1的IP地址为ip-4,TFTP服务器1上有文件A(二进制文件),文件大小为1000字节。
图3为表示根据本实施方式的TFTP客户端1下载文件A的具体过程的图。
首先在步骤3011,TFTP客户端1向TFTP服务器发送读文件指令,即opcode为1(RRQ);filename为“文件A”;mode为“octet”表示以二进制方式传输;第一个自定义选项关键字(即第一个op)为“p2p”。
第一个自定义选项值(即value)按照work-mode+file-mode+first-ip+time+count+info-list进行解释:work-mode值为2,表示TFTP客户端1工作在客户端模式,同时支持作为临时的TFTP服务器;file-mode值为0xC0(bit0和bit1同时置位),表示TFTP客户端1既可以从指定的一个TFTP服务器(临时或固定的TFTP服务器)下载完整文件,也可以从指定的多个TFTP服务器(临时或固定的TFTP服务器)下载指定文件的不同部分。first-ip值为ip-4,即TFTP服务器1的IP地址。time值为3600,表示TFTP客户端1下载完文件A后可以在1小时内作为临时TFTP服务器提供文件A的下载服务。count值为0,表示后面没有info-list。
接着在步骤3012,TFTP服务器1收到步骤3011的指令后,发现有自定义选项“p2p”,TFTP服务器1本身支持这个自定义选项(“p2p”),则回应OACK,opcode为6(即OACK);第一个自定义选项关键字为“p2p”;第一个自定义选项值(即value)按照work-mode+file-mode+first-ip+time+count+info-list进行解释:work-mode值为3,表示TFTP服务器1工作在服务器模式,作为固定TFTP服务器;file-mode值为0xC0(bit0和bit1同时置位),表示TFTP服务器1既允许一个TFTP客户端从自己这里下载指定的完整的文件,也允许一个TFTP客户端从自己这里下载指定文件的一部分数据;first-ip值为TFTP服务器1的IP地址ip-4;因为TFTP客户端1是第一个从TFTP服务器1上下载文件,TFTP服务器1上维护的服务器列表表格为空(临时TFTP服务器数量为0),即只能让TFTP客户端从自己这里下载完整的文件A。time值为0xffffffff,表示支持无限时间的下载服务。count值为1,表示后面有1份info-list。Info-list中各项如下。即ip为ip-4,即TFTP服务器1的IP地址ip-4。begin值为0,end值为999,表示TFTP服务器1希望TFTP客户端2从ip-4下载完整的文件A。
接着在步骤3013,TFTP客户端1收到TFTP服务器1发送OACK,发现TFTP服务器1支持自己(TFTP客户端1)指定的自定义选项“p2p”,选项值ip-4通知自己(TFTP客户端1)从TFTP服务器1上下载整个文件A。TFTP客户端1决定从TFTP服务器1上下载整个文件A,则向TFTP服务器1回应ACK,即opcode为4(ACK);block#为0,表示选项协商成功。
接着在步骤3021,TFTP服务器1收到TFTP客户端1的选项协商成功确认后,TFTP服务器1向TFTP客户端1发送第一份数据,即opcode为3(DATA);block#为1,表示本次发送的数据是指定文件的第一块512字节的数据;data为指定文件的第一块512字节的数据。
接着在步骤3022,TFTP客户端1向TFTP服务器1发送确认指令,即opcode为4(ACK);block#为1,表示TFTP客户端1已经收到步骤3021的数据。
接着在步骤3031,TFTP服务器1向TFTP客户端1发送最后一份数据,即opcode为3(DATA);block#为2,表示本次发送的数据是指定文件的第二块数据,长度为488字节,表示为最后一块数据;data为指定文件的第二块数据(488字节)。
接着在步骤3032,TFTP客户端1向TFTP服务器1发送确认指令,即opcode为4(ACK);block#为2,表示TFTP客户端1已经收到步骤3031的数据。
在完成步骤3032后,TFTP客户端1接着启动本地临时TFTP服务器,在后续1小时内提供文件A的下载服务,允许其它TFTP客户端从自己这里下载完整或部分文件A。
TFTP服务器1收到步骤3032的确认后,在自己维护的服务器列表表格中添加如下内容。
文件名 |
文件大小 |
临时服务器地址 |
临时服务器时间 |
文件A |
1000字节 |
Ip-1 |
3600秒 |
表2
10秒钟后,TFTP服务器1上服务器列表表格刷新为如下内容,即临时服务器时间减少了10秒。
文件名 |
文件大小 |
临时服务器地址 |
临时服务器时间 |
文件A |
1000字节 |
Ip-1 |
3590秒 |
表3
下面,说明TFTP客户端2下载文件A的具体过程的图。
接着,图4为表示根据本实施方式的TFTP客户端2下载文件A的具体过程的图。
首先,在步骤4011,TFTP客户端2向TFTP服务器1发送读文件指令,即opcode为1(RRQ);filename为“文件A”;mode为“octet”表示以二进制方式传输;第一个自定义选项关键字(即op)为“p2p”;第一个自定义选项值(即value)按照work-mode+file-mode+first-ip+time+count+info-list进行解释,work-mode的值为2,表示TFTP客户端2工作在客户端模式,同时支持作为临时的TFTP服务器;file-mode值为0xC0(bit0和bit1同时置位),表示TFTP客户端2既可以从指定的一个TFTP服务器(临时或固定的TFTP服务器)下载完整文件,也可以从指定的多个TFTP服务器(临时或固定的TFTP服务器)下载指定文件的不同部分;first-ip的值为TFTP服务器1的IP地址ip-4。time值为3600,表示TFTP客户端2下载完文件A后可以在1小时内作为临时TFTP服务器提供文件A的下载服务。count值为0,表示后面没有info-list。
接着在步骤4012,TFTP服务器1收到步骤4011的指令后,发现有自定义选项“p2p”,TFTP服务器1本身支持这个自定义选项(“p2p”),则回应OACK,即opcode为6(OACK);第一个自定义选项关键字为“p2p”;第一个自定义选项值按照work-mode+file-mode+first-ip+time+count+info-list进行解释,即work-mode值为3,表示TFTP服务器1工作在服务器模式,作为固定TFTP服务器;file-mode值为0xC0(bit0和bit1同时置位),表示TFTP服务器1既允许一个TFTP客户端从自己这里下载指定的完整的文件,也允许一个TFTP客户端从自己这里下载指定文件的一部分数据;first-ip值为TFTP服务器1的IP地址ip-4,time值为3600,表示支持无限时间的下载服务。count值为1,表示后面有一份info-list,按照ip+begin+end进行解释,即ip值为TFTP服务器1维护的服务器列表表格中的一个随机IP地址,假设选定为TFTP客户端1;begin值为0,end值为999,表示TFTP服务器1希望TFTP客户端2从ip-1下载完整的文件A。
接着在步骤4013,TFTP客户端2收到TFTP服务器1发送的OACK,发现TFTP服务器1支持自己(TFTP客户端2)指定的自定义选项“p2p”,选项值ip-1通知自己(TFTP客户端2)从TFTP客户端1上下载整个文件A。TFTP客户端2决定从TFTP客户端1上下载整个文件A,则回应TFTP服务器1ACK,结束与TFTP服务器1的协商,即opcode为4(ACK);block#为0,表示选项协商成功。
TFTP服务器1收到步骤4013的通知后,则认为TFTP客户端2会成功从TFTP客户端1下载文件A,将TFTP客户端2加入到自己维护的表中,服务器列表表格变为如下。
表4
TFTP客户端2完成步骤4013后,得到临时服务器的信息,重新启动一次TFTP下载,从临时服务器(即TFTP客户端1)下载文件。
图5为示出了根据本实施方式的TFTP客户端2从TFTP客户端1下载文件的具体过程的图。
首先,在步骤5011,TFTP客户端2向TFTP临时服务器(TFTP客户端1)发送读文件指令,即opcode为1(RRQ);filename为“文件A”;mode为“octet”,表示以二进制方式传输;第一个自定义选项关键字为“p2p”;第一个自定义选项值按照work-mode+file-mode+first-ip+time+count+info-list进行解释,即work-mode值为2,表示TFTP客户端2工作在客户端模式,同时支持作为临时的TFTP服务器;file-mode值为0xC0(bit0和bit1同时置位),表示TFTP客户端2既可以从指定的一个TFTP服务器(临时或固定的TFTP服务器)下载完整文件,也可以从指定的多个TFTP服务器(临时或固定的TFTP服务器)下载指定文件的不同部分;first-ip值为ip-4,即TFTP服务器1的IP地址;time值为3600,表示TFTP客户端2下载完文件A后可以在1小时内作为临时TFTP服务器提供文件A的下载服务;count值为0,表示后面没有info-list。
接着在步骤5012,TFTP临时服务器(TFTP客户端1)收到步骤5011的指令后,发现有自定义选项“p2p”,TFTP客户端1本身支持这个自定义选项(“p2p”),则回应OACK,即opcode为6(OACK);第一个自定义选项关键字为“p2p”;第一个自定义选项值按照work-mode+file-mode+first-ip+time+count+info-list进行解释,即work-mode值为2,表示TFTP临时服务器(TFTP客户端1)工作在临时服务器模式,作为临时TFTP服务器;file-mode值为0xC0(bit0和bit1同时置位),表示TFTP临时服务器(TFTP客户端1)既允许一个TFTP客户端从自己这里下载指定的完整的文件,也允许一个TFTP客户端从自己这里下载指定文件的一部分数据;first-ip值为TFTP服务器1的IP地址ip-4;time值为3590,表示TFTP临时服务器(TFTP客户端1)上文件A还支持3590秒的下载服务。count值为0,与前面RRQ一致。
接着在步骤5013,TFTP客户端2收到OACK,发现TFTP临时服务器(TFTP客户端1)支持自己(TFTP客户端2)指定的自定义选项“p2p”,选项值ip-1表示允许自己(TFTP客户端2)从TFTP临时服务器(TFTP客户端1)上下载整个文件A。TFTP客户端2决定从TFTP临时服务器(TFTP客户端1)上下载整个文件A,则回应TFTP临时服务器(TFTP客户端1)ACK,即opcode为4(ACK),block#为0,表示选项协商成功。
接着在步骤5021,TFTP临时服务器(TFTP客户端1)收到TFTP客户端2的选项协商成功确认后,TFTP临时服务器(TFTP客户端1)向TFTP客户端2发送第一份数据,即opcode为3(DATA);block#为1,表示本次发送的数据是指定文件的第一块512字节的数据;data为指定文件的第一块512字节的数据。
接着在步骤5022,TFTP客户端2向TFTP临时服务器(TFTP客户端1)发送确认指令,即opcode为4(ACK4);block#为1,表示TFTP客户端2已经收到步骤5021的数据。
接着在步骤5031,TFTP临时服务器(TFTP客户端1)向TFTP客户端2发送最后一份数据,即opcode为3(DATA);block#为2,表示本次发送的数据是指定文件的第二块数据,长度为488字节,表示为最后一块数据;data为指定文件的第二块数据(488字节)。
接着在步骤5032,TFTP客户端2向TFTP临时服务器(TFTP客户端1)发送确认指令,即opcode为4(ACK);block#为2,表示TFTP客户端2已经收到步骤5021的数据。
TFTP客户端2完成步骤5032后,启动本地临时TFTP服务器,在后续1小时内提供文件A的下载服务,允许其它TFTP客户端从自己这里下载完整或部分文件A。10秒钟后,TFTP服务器1上服务器列表表格刷新为如下内容。
表5
下面说明TFTP客户端3从TFTP服务器1下载文件A的过程。
图6为示出了根据本实施方式的TFTP客户端3从TFTP服务器1下载文件A的具体过程的图。
首先,在步骤6011,TFTP客户端3向TFTP服务器1发送读文件指令,即opcode为1(RRQ);filename为“文件A”;mode为“octet”表示以二进制方式传输;第一个自定义选项关键字为“p2p”;第一个自定义选项值按照work-mode+file-mode+first-ip+time+count+info-list进行解释,即work-mode值为2,表示TFTP客户端3工作在客户端模式,同时支持作为临时的TFTP服务器;file-mode值为0xC0(bit0和bit1同时置位),表示TFTP客户端3既可以从指定的一个TFTP服务器(临时或固定的TFTP服务器)下载完整文件,也可以从指定的多个TFTP服务器(临时或固定的TFTP服务器)下载指定文件的不同部分;first-ip值为TFTP服务器1的IP地址ip-4。time值为3600,表示TFTP客户端3下载完文件A后可以在1小时内作为临时TFTP服务器提供文件A的下载服务。count值为0,表示后面没有info-list。
接着在步骤6012,TFTP服务器1收到步骤6011的指令后,发现有自定义选项“p2p”,TFTP服务器1本身支持这个自定义选项(“p2p”),且自己维护的服务器列表表格中有临时服务器提供这个文件的下载服务,则回应OACK,即opcode为6(OACK);第一个自定义选项关键字为“p2p”;第一个自定义选项值按照work-mode+file-mode+first-ip+time+count+info-list进行解释,即work-mode值为3,表示TFTP服务器1工作在服务器模式,作为固定TFTP服务器;file-mode值为0xC0(bit0和bit1同时置位),表示TFTP服务器1既允许一个TFTP客户端从自己这里下载指定的完整的文件,也允许一个TFTP客户端从自己这里下载指定文件的一部分数据;first-ip值为TFTP服务器1的IP地址ip-4。time值为3600,表示支持无限时间的下载服务。count值为2,表示后面有两份info-list,按照ip+begin+end进行解释,即第一份info-list,ip值为ip-1(TFTP客户端1);begin值为0,end值为511,表示TFTP服务器1希望TFTP客户端3从ip-1下载文件A的前面部分。第二份info-list,ip值为ip-2(TFTP客户端2);begin值为512,end值为999,表示TFTP服务器1希望TFTP客户端3从ip-2下载文件A的后面部分。
接着在步骤6013,TFTP客户端3收到TFTP服务器1发送的OACK,发现TFTP服务器1支持自己(TFTP客户端3)指定的自定义选项“p2p”,自定义选项值通知自己(TFTP客户端3)从TFTP客户端1和TFTP客户端2上下载文件A。TFTP客户端3决定从TFTP客户端1和TFTP客户端2上下载整个文件A,则向TFTP服务器1回应ACK,结束与TFTP服务器1的协商,即opcode为4(ACK);block#为0,表示选项协商成功。
TFTP服务器1收到步骤6013的通知后,则认为TFTP客户端3会成功下载文件A,将TFTP客户端3加入到自己维护的服务器列表表格中,服务器列表表格变为如下。
表6
TFTP客户端3完成步骤6013后,得到临时服务器的信息,重新启动一次TFTP下载,从临时服务器(即TFTP客户端1)下载文件A的一部分。
图7为示出了根据本实施方式的TFTP客户端3从临时服务器(即TFTP客户端1)下载文件的一部分的具体过程的图。
首先,在步骤7011,TFTP客户端3向TFTP临时服务器(TFTP客户端1)发送读文件指令,即opcode为1(RRQ;filename为“文件A”;mode为“octet”表示以二进制方式传输;第一个自定义选项关键字为“p2p”;第一个自定义选项值按照work-mode+file-mode+first-ip+time+count+info-list进行解释,即work-mode值为2,表示TFTP客户端3工作在客户端模式,同时支持作为临时的TFTP服务器;file-mode值为0xC0(bit0和bit1同时置位),表示TFTP客户端3既可以从指定的一个TFTP服务器(临时或固定的TFTP服务器)下载完整文件,也可以从指定的多个TFTP服务器(临时或固定的TFTP服务器)下载指定文件的不同部分;first-ip值为ip-4,即TFTP服务器1的IP地址。time值为3600,表示TFTP客户端3下载完文件A后可以在1小时内作为临时TFTP服务器提供文件A的下载服务。count值为1;info-list中ip为ip-1,begin为0,end为511,表示希望从ip-1下载文件A的0~511字节数据。
接着在步骤7012,TFTP临时服务器(TFTP客户端1)收到步骤7011的指令后,发现有自定义选项“p2p”,TFTP客户端1本身支持这个自定义选项(“p2p”),且有指定的文件A对应数据,则回应OACK,即opcode为6(OACK);第一个自定义选项关键字为“p2p”;第一个自定义选项值按照work-mode+file-mode+first-ip+time+count+info-list进行解释,即work-mode值为2,表示TFTP临时服务器(TFTP客户端1)工作在临时服务器模式,作为临时TFTP服务器;file-mode值为0xC0(bit0和bit1同时置位),表示TFTP临时服务器(TFTP客户端1)既允许一个TFTP客户端从自己这里下载指定的完整的文件,也允许一个TFTP客户端从自己这里下载指定文件的一部分数据;first-ip值为TFTP服务器1的IP地址ip-4;time值为3580;表示TFTP临时服务器(TFTP客户端1)上文件A还支持3580秒的下载服务;count值为1;info-list中的ip为ip-1,begin为0,end为511,表示提供文件A的0~511字节数据的下载服务。
接着在步骤7013,TFTP客户端3收到OACK,发现TFTP临时服务器(TFTP客户端1)支持自己(TFTP客户端3)指定的自定义选项“p2p”,选项值允许自己(TFTP客户端3)从TFTP临时服务器(TFTP客户端1)上下载文件A的0~511字节数据。TFTP客户端3决定从TFTP临时服务器(TFTP客户端1)上下载文件A的0~511字节数据,则向TFTP临时服务器(TFTP客户端1)回应ACK,即opcode为4(ACK);block#为0,表示选项协商成功。
接着在步骤7021,TFTP临时服务器(TFTP客户端1)收到TFTP客户端3的选项协商成功确认后,TFTP临时服务器(TFTP客户端1)向TFTP客户端3发送第一份数据,即opcode为3(DATA);block#为1,表示本次发送的数据是指定文件的第一块512字节的数据;data为指定文件的第一块512字节的数据。
接着在步骤7022,TFTP客户端3向TFTP临时服务器(TFTP客户端1)发送确认指令,即opcode为4(ACK);block#为1,表示TFTP客户端3已经收到步骤7021的数据。
接着在步骤7031,TFTP临时服务器(TFTP客户端1)向TFTP客户端3发送最后一份数据(0字节),即opcode为3(DATA);block#为2,表示本次发送的数据是指定文件的第二块数据,长度为0字节,表示为最后一块数据;data为指定文件的第二块数据(0字节)。
接着在步骤7032,TFTP客户端3向TFTP临时服务器(TFTP客户端1)发送确认指令,即opcode为4(ACK);block#为2,表示TFTP客户端3已经收到步骤7021的数据。TFTP客户端3完成从TFTP临时服务器(TFTP客户端1)下载文件A的0~511字节数据。
接着,TFTP客户端3再从临时服务器(即TFTP客户端2)下载文件A的剩余部分数据。
图8为示出了根据本实施方式的TFTP客户端3从临时服务器(即TFTP客户端2)下载文件A的剩余部分数据的具体过程的图。
首先,在步骤8011,TFTP客户端3向TFTP临时服务器(TFTP客户端2)发送读文件指令,即opcode为1(RRQ);filename为“文件A”;mode为“octet”表示以二进制方式传输;第一个自定义选项关键字为“p2p”;第一个自定义选项值按照work-mode+file-mode+first-ip+time+count+info-list进行解释,即work-mode值为2,表示TFTP客户端3工作在客户端模式,同时支持作为临时的TFTP服务器;file-mode值为0xC0(bit0和bit1同时置位),表示TFTP客户端3既可以从指定的一个TFTP服务器(临时或固定的TFTP服务器)下载完整文件,也可以从指定的多个TFTP服务器(临时或固定的TFTP服务器)下载指定文件的不同部分;first-ip值为ip-4,即TFTP服务器1的IP地址;time值为3600,表示TFTP客户端3下载完文件A后可以在1小时内作为临时TFTP服务器提供文件A的下载服务;count值为1;info-list中的ip为ip-2,begin为512,end为999,表示希望从ip-2下载文件A的512~999字节数据。
接着在步骤8012,TFTP临时服务器(TFTP客户端2)收到步骤8011的指令后,发现有自定义选项“p2p”,TFTP客户端2本身支持这个自定义选项(“p2p”),且有指定的文件A的相应数据,则回应OACK,即opcode为6(OACK);第一个自定义选项关键字为“p2p”;第一个自定义选项值按照work-mode+file-mode+first-ip+time+count+info-list进行解释,即work-mode值为2,表示TFTP临时服务器(TFTP客户端2)工作在临时服务器模式,作为临时TFTP服务器;file-mode值为0xC0(bit0和bit1同时置位),表示TFTP临时服务器(TFTP客户端2)既允许一个TFTP客户端从自己这里下载指定的完整的文件,也允许一个TFTP客户端从自己这里下载指定文件的一部分数据;first-ip值为TFTP服务器1的IP地址ip-4;time值为3590;表示TFTP临时服务器(TFTP客户端2)上文件A还支持3590秒的下载服务;count值为1;info-list:ip为ip-2,begin为512,end为999,表示提供文件A的512~999字节数据的下载服务。
接着在步骤8013,TFTP客户端3收到OACK,发现TFTP临时服务器(TFTP客户端2)支持自己(TFTP客户端3)指定的自定义选项“p2p”,选项值允许自己(TFTP客户端3)从TFTP临时服务器(TFTP客户端2)上下载文件A的512~999字节数据。TFTP客户端3决定从TFTP临时服务器(TFTP客户端2)上下载文件A的512~999字节数据,则回应TFTP临时服务器(TFTP客户端2)ACK,即opcode为4(ACK);block#为0,表示选项协商成功。
接着在步骤8021,TFTP临时服务器(TFTP客户端2)收到TFTP客户端3的选项协商成功确认后,TFTP临时服务器(TFTP客户端2)向TFTP客户端3发送第一份数据,即opcode为3(DATA);block#为1,表示本次发送的数据是指定文件的第一块512~999字节数据;data为指定文件的第一块512~999字节数据。
接着在步骤8022,TFTP客户端3向TFTP临时服务器(TFTP客户端2)发送确认指令,即opcode为4(ACK);block#为1,表示TFTP客户端3已经收到步骤8021的数据。TFTP客户端3完成从TFTP临时服务器(TFTP客户端2)下载文件A的512~999字节数据。从而TFTP客户端3获得完整文件A。
如上所述,根据本发明的文件传输方法,文件传输设备并非固定为客户端或服务器端,而是即可以工作于客户端模式或服务器模式,也可以工作在客户端模式的同时,支持作为临时的服务器。因此实现了网络设备之间的点对点式的文件传输,消除了由于CS结构导致的TFTP服务器性能瓶颈,能够提高文件传输的效率。