一种发送速率自适应控制的文件传输方法及其系统
技术领域
本发明涉及网络环境中文件传输技术领域,特别涉及一种发送速率自适应控制的文件传输方法及其系统。
背景技术
在网络环境中点对点文件传输通常采用文件传输协议(FTP,File TransferProtocol)、超文本传输协议(HTTP,Hyper Text Transfer Protocol)等协议,其基本方法是采用传输控制协议(TCP,Transmission Control Protocol)来保证传输的可靠性。但是,这种可靠性的保证牺牲了传输效率,增加了传输时间,影响终端(用户)的体验。美国第6,085,251号专利公开了一种通过并行传输文件的方法来提高文件的传输效率。在这种方法中,一个服务器将单个文件分割成多个数据包,同时并行地向一个客户端发送这些数据包,最后客户端按照服务器提供的文件分割信息合并这些数据包。该方法采用的传输协议是FTP,虽然比单个FTP线程提高了传输效率,但还是无法避免TCP带来的开销。本专利并未提供或公开传输速率的控制。
此外,利用用户数据报协议(UDP,User Datagram Protocol)可以提高传输效率,但由于UDP是一种无连接的传输层协议,特点是“简单不可靠”,UDP协议本身无法可靠信息传送。简单文件传输协议(TFTP,Trivial File Transfer Protocol)是利用UDP协议传输文件,通过重传机制能保证文件的完整性,但客户端每收到一个数据包都要给服务器发送一个确认包,这样增加了部分网络开销,且服务器在发出下一个数据包以前必须得到客户端上一个数据包的确认,也影响发送效率。
中国第CN1981470A号专利公开了一种基于UDP协议并能实时调整传输速率的方法。在这种方法中,服务器以预估的传输速率发送数据,根据客户端返回的确认信号来进一步估计和调整发送速率。这种方法在时变网络下能调整发送速率,但客户端每收到一个“带标识的内容分组”都要向服务器返回确认,同样增加了部分网络开销;并且返回确认包也是通过UDP协议向服务器发送,在网络丢包严重的情况下,一个“带标识的内容分组”将出现多次重发。
因此,需要一种高效的文件传输系统,该系统能根据客户端和网络的能力自动调整传输速率,且服务器端确切知道客户端接收报文状态,以避免多次重发,从而,能在客户端和网络能力允许下,能使整个文件传输时间缩短。
发明内容
本发明的目的在于,提供一种根据客户端能力和网络能力能自适应控制传输速率的文件传输方法及其系统,以使该系统能最大限度的利用网络和客户端资源。
为实现上述目的,本发明的一种发送速率自适应控制的文件传输方法,采用UDP协议发送文件数据,其他指令全部由TCP协议完成;所述的文件数据以“块”为每次传输和验证完整性的基本单位,并通过采用动态调整发送“块”的大小细粒度调整发送速率;该方法的步骤包括:
1)客户端发起文件下载请求时,把能接收的块的最大值MaxBlock发给服务器端,服务器端的块信息同步模块在MaxBlock范围内取一个块的大小预计算文件片段切分的块的总数BlockNum,并把块信息发送给客户端;
2)服务器端通过文件分片模块完成大文件的切分,把每一个大文件按上述的块的大小,切分成1~N个文件片段;每个文件片段由1~M个块组成,每个块都由1~L个报文组成,每个块和报文都有一个标识,块的标识在所属的文件片段中具有唯一性,报文标识在所属的块中也具有唯一性;
3)服务器端通过UDP发送线程完成文件数据的发送,利用UDP协议按照报文的序号从小到大的顺序将每个文件片段的块信息发送给客户端;
4)客户端根据块的大小预设接收时长,在设定时延后,验证一个接收块的完整性;如果块完整,将写入临时文件;如果块不完整,将根据块中报文丢失情况利用TCP协议向服务器请求重传整个块或缺少的报文;
5)服务器端接收到重传整个块或缺少的报文的请求时,将请求重发的块编号或报文编号通知给发送线程管理模块,通过发送线程管理模块找到发送该块或缺少的报文的UDP发送线程,通知该UDP发送线程重新发送;
6)服务器端通过块调整模块调整发送“块”的大小来细粒度调整发送速率,所述的块调整模块定时到重发管理模块查询这段时间内客户端的重发请求记录,然后到发送线程管理模块查询这段时间内已发送给客户端的块或报文的记录,根据请求重发和已发送的比率决定是否调整块的大小,当服务器端调整了块的大小时,把调整结果通知TCP收发线程,由TCP收发线程重新发送块信息通知客户端;
7)客户端接收到所有的文件片段时,通过文件合并模块将根据文件片段描述信息重新组织文件。
所述的块的大小是根据请求重发和已发送的比率进行调整,请求重发的比例高, 说明网络拥塞,服务器端要缩小块的大小;请求重发的比例低,表明网络丢包率低或服务器端和客户端处理能力强,服务器端就可以增加块的大小。
该方法还进一步包括客户端可根据本地资源请求服务器调整发送线程数目,以利用传输线程数目来动态粗粒度调整发送速率的步骤:
在初始条件下,客户端请求服务器端启动一个UDP发送线程进行发送;然后,服务器端的发送线程管理模块根据接收到的中心调度模块增加或减少线程的指令,开启或挂起UDP发送线程;
当客户端探测自身还有能力开启一个或多个接收线程时,将请求服务器再开启其他线程进行发送其他文件片段,在同一时刻,所有的工作的发送线程发送的块的大小一致;
当客户端资源紧张时,将通知服务器减少一个或多个接收线程,服务器按照线程开启时间倒序停止线程发送。
所述的客户端的本地资源包括:自身的计算资源、网络资源和/或内存资源利用率。
所述的块信息包括:块所属的文件片段编号(FilePieceID)、块在文件片段中的唯一编号(BlockID)和块包括的报文数(PackageNum)。
所述的块信息指令被封装在TCP中,其数据结构为“文件片段总数+第一个文件片段所包括的块信息+第二个文件片段所包括的块信息+...+第N个文件片段所包括的块信息”,文件片段所包括的块信息数据结构为“文件片段编号+起始块编号+结束块编号+块所包含的报文数+最后块编号+最后块包括的报文数”。
所述的文件数据被封装到UDP报文中,每个报文有一个文件片段编号、块编号和报文编号,这3个编号都从1开始递增,在文件中,文件片段编号唯一,在一个文件片段中,块编号和报文编号唯一,通过这3个编号,每个报文都能确定所属的文件片段、所属的块。
所述的步骤4)中如果块不完整,客户端可采取3种策略处理该块:
41)直接丢弃该块,向服务器请求重发该块;
42)在内存保留该块,接着检查该块丢失的报文,向服务器请求重发丢失的报文;或
43)接着检查该块丢失的报文,当丢失报文和块总报文数达到预设定的比率,如,50%,将丢弃该块,向服务器请求重发该块,反之,在内存保留该块,向服务 器请求重发丢失的报文。
本发明的另一目的在于提供一种发送速率自适应控制的文件传输系统,包括服务器端和客户端,其特征在于:所述的服务器端采用UDP协议发送文件数据,其他指令全部由TCP协议完成;所述的文件数据以“块”为每次传输和验证完整性的基本单位,并通过采用动态调整发送“块”的大小细粒度调整发送速率;
所述的服务器端包括:
一文件分片模块,用于完成大文件的切分,把每一个大文件按一定大小,切分成1~N个文件片段;所述的每个文件片段由1~M个块组成,每个块都由1~L个报文组成,每个块和报文都有一个标识,块的标识在所属的文件片段中具有唯一性,报文标识在所属的块中也具有唯一性;
块信息同步模块,用于根据客户端发起文件下载请求时发给服务器端的能接收的块的最大值MaxBlock,在MaxBlock范围内取一个块的大小预计算文件片段切分的块的总数BlockNum,并把块信息发送给客户端;
UDP发送线程,用于完成文件数据的发送,利用UDP协议按照报文的序号从小到大的顺序将每个文件片段的块信息发送给客户端;
一重发管理模块,用于接收客户端根据块中报文丢失情况利用TCP协议向服务器端发送的重传整个块或缺少的报文的请求,将请求重发的块编号或报文编号,通知发送线程管理模块;
一发送线程管理模块,用于维护客户端占用的UDP线程、UDP线程所负责发送的文件片段对应关系和UDP线程本身状态,根据块编号及其块所属的文件片段找到发送的该块的UDP发送线程,通知该UDP发送线程重新发送;
TCP收发线程,用于完成块信息同步、文件下载请求、重发请求、UDP线程数目调整请求的指令的传输;
一块调整模块,用于定时到重发管理模块查询这段时间内客户端的重发请求记录,然后到发送线程管理模块查询这段时间内已发送给客户端的块或报文的记录,根据请求重发和已发送的比率决定是否调整块的大小,当服务器端调整了块的大小时,把调整结果通知TCP收发线程,由TCP收发线程重新发送块信息通知客户端;
一中心调度模块,用于协调上述各模块之间的工作,服务器端只有一个中心调度模块,并维护正在下载的客户端在线信息;
所述的客户端对应地包括:
一TCP收发线程,用于完成块信息同步信息的接收、向服务器发起文件下载请求和重发请求;
一文件合并模块,用于完成验证文件分段的完整性,并安装文件分段信息把完整的文件分段拼写成完整的源文件;
一逻辑处理模块,用于完成协调各模块之间的工作,并维护客户端的UDP接收线程信息,和
UDP接收线程,用于完成文件数据的接收,一个UDP接收线程和一个服务器的UDP发送线程一一对应。
所述的块的大小是根据请求重发和已发送的比率进行调整,请求重发的比例高,说明网络拥塞,服务器端要缩小块的大小;请求重发的比例低,表明网络丢包率低或服务器端和客户端处理能力强,服务器端就可以增加块的大小。
所述的发送线程管理模块,还进一步地用于接收中心调度模块增加或减少线程的指令,开启或挂起UDP线程,以利用传输线程数目来动态粗粒度调整发送速率。
本发明在一个文件片段发送时,数据的传输和完整性验证的基本单位是块。在服务器开始发送一个文件片段,先利用TCP协议将预设的块的大小(即包含的报文数)通知给客户端,客户端根据块的大小预设定块的接收时延;服务器将按照报文序号从小到大的顺序进行发送,客户端在设定的时延后,验证一个接收块的完整性,如果块完整,将写入临时文件,如果块不完整,将利用TCP协议请求服务器重新传输整个块或块中的报文;服务器重发信息通知给发送线程,并根据请求重发和已发送比率进行调整块的大小,并利用TCP协议把调整后的块的大小通知给发送线程和客户端。该方法中块的大小是根据请求重发的情况进行调整,请求重发的比例高,说明网络拥塞,服务器要缩小块的大小;请求重发的比例低,表明网络丢包率低或服务器和客户端处理能力强,服务器可以增加块的大小。
本发明还可利用调整发送线程数目来动态粗粒度调整发送速率的方法:服务器将文件切分若干个文件片段并生成文件片段描述信息,每个文件片段由一个UDP发送线程进行发送;服务器端将文件片段描述信息发送给客户端;客户端可根据本地资源请求服务器改变发送线程数目;当客户端接收到所有的文件片段时,将根据文件片段描述信息重新组织文件。
本发明的按块传输是指服务器将每个文件片段的块信息发送给客户端,客户端从同步的块信息中获取每块包括的报文数;服务器利用UDP协议将按照报文的序号从小到大的顺序进行发送;客户端根据块的大小预设接收时长,在设定的时延后,验证一个接收块的完整性,如果块完整,将写入临时文件;如果不完整,客户端将先在内存保留此块,并查询缺少的报文,请求服务器重传整个块或缺少的报文。
所述的报文是传输的最小单位,除一个文件最后一个报文,其他报文大小固定,每个报文并能封装在一个UDP报文中;例如,一个报文大小可以为MTU-28字节。
所述的块由1~L个报文组成,块是客户端验证数据完整性的基本单位,块的大小可调整。所述的块信息包括:块所属的文件片段标识(FilePieceID)、块在文件片段中的唯一标识(BlockID)和块包括的报文数(PackageNum),对每次通知给客户端所有的块信息中,PackageNum最多为两种,一个文件片段中最后的块可能和前面的块所包括的报文数可能不一致。
所述的块信息同步的方法包括:客户端发起文件下载请求时,把能接收的块的最大值(MaxBlock)发给服务器端,服务器在MaxBlock范围内取一个块的大小,服务器预计算文件片段切分的块的总数(BlockNum),并把块信息发送给客户端;当服务器调整了块的大小,重新发送块信息。因为每次通知给客户端所有的块信息中,PackageNum最多为两种,服务器可以采用压缩的方式进行发送块信息,例如指令为:FilePieceID+BlockNum+起始BlockID+结束BlockID+PackageNum(+结束BlockID2+PackageNum2)。
所述的重传的方法为当客户端验证该块不完整时,根据块中报文丢失向服务器请求重传整个块或缺少的报文,服务器接收到请求时,通知发送线程重发;客户端在预设的时延后,如果再次验证块不完整,再次请求服务器重发。
所述的块调整的方法为服务器根据客户端请求重发的情况进行调整,具体为根据请求重发和已发送的报文数比率进行调整。
所述的客户端接收块时延设定的方法包括:因为UPD协议不能保证接收的顺序和发送顺序相同,服务器虽然按照块报文标识从小到大顺序发送,但是,报文到达客户端的顺序不能保证与发送的顺序一致;每次客户端接收到服务器通知块的大小时,预估一个块接收所需的时间(即块接收时延),在不丢包或出错的情况下,所估计的时间应该基本保证一个块的所有报文都能接收到;时长大小可以根据实际接收的速率和块的大进行调整。
本发明的优点在于,本发明利用UDP协议完成文件数据传输,并利用TCP协议完成重传请求指令、文件分段信息通知指令和块信息通知指令。该方法充分利用了UDP协议的简单、快速特性和TCP可靠性,在提高传输效率的同时,可靠性也得到保证。本发明虽增加了少量网络开销,却有效地利用客户端接入的网络资源,在增加0.6%的开销下,缩短了文件整体传输时间。
附图说明
图1为本发明的系统组成图;
图2为本发明的客户端工作流程图;
图3为本发明的服务器工作流程图;
图4为本发明的服务器向客户端多线程发送文件示意图;
图5为本发明的服务器向客户端所发送的文件数据报文数据结构图;
图6为本发明的服务器向客户端所发送的块信息报文数据结构图。
具体实施方式
下面,结合附图对本发明的流量自适应控制的文件传输方法及其系统进行详细地说明。
图1为本发明的流量自适应控制的文件传输系统组成图,该系统包括服务器端和客户端。
服务器包括:101)TCP收发线程、102)中心调度模块、103)文件分片模块、104)重发管理模块、105)发送线程管理模块、106)UDP发送线程、107)块调整模块,其中,
101)TCP收发线程完成:块信息同步、文件下载请求、重发请求、UDP线程数目调整请求等指令的传输,一个TCP收发线程能为多个客户端提高服务,一台服务器并行允许多个TCP收发线程;
102)中心调度模块协调各模块之间的工作,一台服务器只有一个中心调度模块,并维护正在下载的客户端在线信息;
103)文件分片模块完成大文件的切分,把每一个大文件按一定大小,例如,1G字节,切分成文件片段,在一台服务器中,每个文件存一份文件片段;
104)发送线程管理模块接收中心调度模块增加或减少线程的指令,开启或挂起UDP线程,并维护客户端占用的UDP线程、UDP线程所负责发送的文件片段对应关系和UDP线程本身状态;
105)UDP发送线程完成文件数据的发送。在一个服务器上,有很多UDP发送线程,一个客户端同时可以占用几个UDP发送线程,但一个UDP发送线程同时只能为一个客户端服务,同时也只能负责发布一个文件片段;
106)重发管理模块收到终端请求的重发的块编号或报文编号,通知发送线程管理模块,线程管理模块根据块编号和块所属的文件片段找到发送的该块的UDP发送线程,通知该线程重新发送;
107)块调整模块定时,例如,180秒,到重发管理模块查询这段时间内客户端的重发请求记录,然后到发送线程管理模块查询这段时间内已发送给客户端的块(或报文)记录,根据2个记录比率决定是否调整块的大小,然后把调整结果通知TCP收发线程,TCP收发线程通知该客户端块的调整后信息。
客户端包括:108)TCP收发线程、109)文件合并模块、110)逻辑处理模块、111)UDP接收线程,其中,
108)TCP收发线程完成:块信息同步信息的接收、向服务器发起文件下载请求、和重发请求,一个TCP收发线程能为一个客户端上的多个UDP接收线程服务服务,一个客户端上只开启一个TCP收发线程;
109)文件合并模块完成:验证文件分段的完整性,并安装文件分段信息把完整的文件分段拼写成完整的源文件;
110)逻辑处理模块完成:协调各模块之间的工作,一台客户端只有一个逻辑处理模块,并维护客户端的UDP接收线程信息,
111)UDP接收线程完成文件数据的接收,一个客户端同时开启UDP接收线程数目由403)方法决定的,一个UDP接收线程和一个服务器的UDP发送线程一一对应,同时也只能负责接收一个文件片段的数据。
图2、3分别为本发明的客户端、服务器工作流程图,具体步骤包括:201)客户端发起文件下载请求、301)服务器处理文件下载请求、202)客户端接收文件准备、302)服务器发送文件、203)客户端接收文件、303)服务器处理重发请求、304)服务器调整块的大小、305)服务器通知客户端调整后的块信息、204)客户端处理调整后的块信息、205)客户端调整块接收时延。
201)客户端发起文件下载请求:客户端通过TCP协议向服务器发送下载文件请求,携带将要下载的文件命名和自身能接收的块的最大值(MaxBlock);
301)服务器处理文件下载请求:当服务器接收到一个客户端下载文件请求时,服务器在MaxBlock范围内取一个块的大小,服务器预计算文件片段切分的块的总数(BlockNum),并通知给客户端文件片段信息和块信息;通知数据结构如图6所示;
202)客户端接收文件准备:客户端在接收到文件片段信息和块信息后,开启一个UDP接收线程、设定块的大小、估算接收每个块需要的时间,并把文件接收端口通知给服务器;
302)服务器发送文件:在服务器接收到客户端UDP接收端口后,开启一个UDP发送线程,并按照报文的序号进行发送,直到一个文件片段发送完毕;
203)客户端接收文件:客户端接收线程按照块的接收时延,依次检查每个块的完整性,在一个接收时延内,如待检查块的数据完整,将写入临时文件,如果数据不完整,客户端3种策略处理该数据块:
203-1)直接丢弃该块,向服务器请求重发该块;
203-2)在内存保留该块,接着检查该块丢失的报文,向服务器请求重发丢失的报文;
203-3)接着检查该块丢失的报文,当丢失报文和块总报文数达到一定比率,例如,50%,将丢弃该块,向服务器请求重发该块,反之,在内存保留该块,向服务器请求重发丢失的报文;
303)服务器处理重发请求:当服务器接收到客户端请求块或报文重发信息时,重发管理模块记录该信息,并通知线程管理器重发,线程管理模块根据块编号和块所属的文件片段找到发送的该块的UDP发送线程,通知该线程重新发送;
304)服务器调整块的大小:块调整模块定时检查是否要调整块的大小,具体为根据请求重发的报文数和已发送的报文总数比率进行调整:
304-1)当该比率小于预设定的比率最小值时,将适当增加块的大小;
304-2)当该比率大于预设定的比率最大值时,将适当减少块的大小;
304-3)当该比率在设定比率范围内时,将保持块的大小;
例如,设定比率最小值为1%、最大值为10%,块调整模块检查到的比率为20%,将减少块的大小;
305)服务器通知客户端调整后的块信息:当服务器对应一个客户端每修改一次块的大小,UDP发送线程就要重新调整未发送完的文件片段,服务器并把重新调整后的块信息通知给客户端,通知数据结构如图6所示;
204)客户端处理调整后的块信息:客户端接收到块信息通知,将调整UDP接收线程块的大小,并调整块接收时延;
205)客户端调整块接收时延:每次客户端接收到服务器通知块的大小时,预估一个块接收所需的时间(即块接收时延),然后,客户端再根据实际接收的速率和块的大进行调整接收时延,当在此时延内,接收到的报文总数和块所包含的报文总是比例大于设定的值时,将缩小时延;当该比例小于某个设定的值时,将增加延时;当该比例在设定的范围内,时延大小不变; 例如,块的大小为100个报文,在一个时延内,设定的最大比例为3,最小为2,如果接收到的报文数目大于400个,可以减少时延,如果接收的报文数目为150个,可以增加时延。
图4为本发明的服务器向客户端多线程发送文件示图,服务器利用文件传输线程数目来动态粗粒度调整发送速率,包括:
401)服务器将文件切分若干个文件片段并生成文件片段描述信息,在一个文件中,每个文件片段有唯一的编号,每个文件片段由一个UDP发送线程负责发送和重发;在同一时刻,所有的工作的发送线程发送的块的大小一致;
402)在客户端请求下载时,服务器将文件片段描述信息发送给客户端,见301);当客户端接收到所有的文件片段时,将根据文件片段描述信息重新组织文件;
403)线程数目调整方法:在初始条件下,客户端请求服务器启动一个线程进行发送;当客户端探测自身还有能力开启一个或多个接收线程时,将请求服务器再开启其他线程进行发送其他文件片段;当客户端资源紧张时,将通知服务器减少一个或多个接收线程,服务器按照线程开启时间倒序停止线程发送。
图5为本发明的服务器向客户端所发送的文件数据报文数据结构图,发送的文件数据被封装到UDP报文中,每个报文有一个文件片段编号、块编号和报文编号,这3个编号都是从1开始递增,在文件中,文件片段编号唯一,在一个文件片段中,块编号和报文编号唯一,通过这3个编号,每个报文都确定所属的文件片段、所属的块。
图6为本发明的服务器向客户端所发送的块信息报文数据结构图,指令信息被封装在TCP中,数据结构为:文件片段总数+第一个文件片段所包括的块信息+第二个文件片段所包括的块信息+......,文件片段所包括的块信息数据结构为:文件片段编号+起始块编号+结束块编号+这些块所包含的报文数+最后块编号+最后块包括的报文数。
本发明以应用于网络环境下文件传输方法,整个方法和系统和具体网络类型、文件类型和文件格式无关,具有普遍性。对于本技术领域的技术人员,在不脱离发明原理的前提下,对本发明做出改动,例如,调整实例中参数、字节长度等,也视为本发明的保护范围。