李 国,巩光志,王冬冬
(中国民航大学 a.计算机学院;b.航空自动化学院,天津 300300)
常用的网络数据传输协议有TCP和UDP[1-2],TCP是面向连接的协议,包含了专门的传递保证机制,具有高度可靠性,但效率很低;传统的UDP协议通信效率高,但是可靠性差,不适合那些对可靠性要求较高、实时性较强的应用环境。随着网络传输的快速发展,在某些特定环境中,对大量声音数据的可靠性和高效性要求都较高,TCP协议不能满足效率上的要求,UDP又不能满足可靠性的要求。
目前,已有多种基于UDP的数据可靠传输协议产生,但是拥塞控制策略中大都仍然是传统的停等协议或滑动窗口协议。但是人们希望发送端能根据网络情况的好坏来自动调整发送数据的速度,当网络带宽充足时,尽量多发数据以避免带宽的浪费,网络情况不好时尽量少发数据或不发数据来避免网络的拥塞。为此,本文针对特定的声音数据,提出一种新的基于UDP的数据可靠传输方法,详细分析了分区确认及分包重组算法,基于选择重发策略,采用对网络传输状况自适应的拥塞控制策略,有效提高网络带宽的利用率。
从计算机网络体系结构的角度来说,该协议的层次结构类似于UDT[1],属于应用层级别的面向连接协议。本协议的体系结构延用了UDT的结构,即在传输层和应用层之间添加了一层具有数据包确认、重发和拥塞控制功能的控制协议[3],添加的新协议层可以保证数据传输的可靠性,而UDP仍然真正负责数据的传输,协议结构图如图1所示。
图1 协议结构图Fig.1 Protocol structure
UDT协议包含了可靠控制和拥塞控制策略,UDT协议是面向连接的,进行数据传输之前双方必须建立连接才能进行通信[4]。其数据传输过程的具体实现如下:首先是连接建立的过程,UDT的服务器端先启动,客户端连接时向其发送握手包;服务器端收到握手包之后向客户端发送握手响应包,而客户端定时的向服务器发送相同的握手包,直到接收到握手响应包才停止,客户端只要收到一个握手响应包,就准备进行数据的接收和发送,对后续收到的握手响应包直接丢弃处理;服务器端每接到一个客户端的握手包就会返回一个响应包,这样可以避免发生客户端收不到握手响应包的情况,服务器端收到对方发来的第一个握手包开始,就直接进入数据接收和发送的准备就绪状态。当数据发送完毕进行关闭连接时,数据发送端会发送关闭请求到接收端,接收端接收到这个请求以后就立即关闭连接并释放资源。因为请求指令是通过UDP协议传输,所以接收端就不一定能收到这个关闭请求,此时接收端判断等待数据接收的时间是否超过指定值,超过时就关闭连接。UDT协议在传输数据时,发送端会定时向对方发送心跳包,如果在某一指定时间内没有收到任何数据包,就判定此时连接已经被中断,然后再进行重连。
本文协议也是面向连接的协议,建立连接的过程和UDT一样,但是连接关闭的方法与UDT不同。UDT协议是通过时间溢出机制来关闭,如果网络情况很差,接收方收不到发来的数据,发送方就会对数据一直进行重发,但是接收方收不到数据的时间到达指定的溢出时间就会判定为数据传送完毕,而实际上发送方并没有发送关闭信息,这样双方就不得不重新进行连接来传送数据,而且建立连接的过程耗时较多。而本文协议关闭连接过程和建立连接的过程类似,当发送方发完数据之后,每隔一段时间就发送一个关闭信息到对方,之后等待接收关闭信息返回包,当接收到返回包时发送方就最后一次发送一个最终返回包信息,然后关闭连接;而接收端每收到一个关闭信息就向发送方返回三次同一个数据包(这样发送方未收到返回包的概率降低了两倍),告诉发送方已经收到了关闭信息,当收到最终返回包之后关闭连接,因为最终返回包可能收不到,这时接收方就通过时间溢出机制关闭连接,虽然这样会比UDT多了一道关闭程序,但避免了协议误判关闭信息而导致连接中断的情况。
另一方面,本文协议中是采用分区确认的方法,本质上是用空间换时间的思想,内存空间中开辟相同的几个区,同时使用进行传输数据,可以很大程度地提高数据的传输效率。二者使用的拥塞控制算法也不一样,UDT协议采用常见的AIMD(加性增加乘性减少)算法[5-7],该算法的基本思想是,当发送端收到ACK,并且没有检测到丢包事件,则拥塞窗口加1,当TCP发送端检测到丢包事件后,拥塞窗口就减半。增加拥塞窗口使得向网络中发送的数据量急剧增加,网络中的有用资源能够被较快速的使用;而当拥塞发生时,向网络中发送的数据量会急剧减少。数据的发送速率就会表现为较大的振荡性,致使AIMD算法欠缺网络使用的公平性和稳定性。而本文协议采用本文提出的MIRD拥塞控制算法,使得数据发送速率对网络繁忙程度自动适应,从而实现带宽利用的公平性和稳定性。
本文提出一种新的分包与重组[4]方法,基于分区确认的确认机制的基本思想是:发送端在内存中开辟四个大小相同的区域(A,B,C,D),每个区结构相同,数据包括该区名称,数据标志、计时变量、超时标志、等待标志、丢包标志、重发数据以及分包数据区域等。其中重发数据中存放需要重发的包序号,分包数据区域存放已编码排序的待发送数据包,总数用一个变量记录。而接收端开辟四个区域与发送端对应,存放发送端各区发来的数据,并用重组算法对数据进行提取。
数据传输的整体流程图如图2所示,心跳包计时器是用来设置心跳包的定时器开始时间,总体上完成数据的拆分和发送。每个分区里的数据分配流程如图3所示,对某一分区分配数据之后,都要重新设置该区各个标志位,并重置该区重发机制中的超时定时器。
图2的数据分配模块中分配数据时,是按照A、B、C、D的优先级先后分配数据。数据传输过程中,网络传输速率大时,A区很快就能收到接收方发来的确认包,在第二次分配数据之前,若A区数据得到确认,则分配数据时仍然只对A区进行分配,从而B、C、D区就处于备用状态。当网络速率变小时,A区数据就有可能得不到及时确认而不能被分配数据,从而B、C、D区开始被分配数据,以减小A区的开销。
发送数据时是按各区顺序发送,每一次数据的发送都要扫描完4个区才完毕,这样可以确保各区数据能够全部发送。以A区为例,具体流程如图4所示,该流程完成了各区数据的全部发送工作和丢包之后的重发工作。
对于接收端来说,如果接收端A区数据包全部收到,接收端处理用户数据,之后给对方发送ACK包,并且初始化该区并重置各个标志位;若A区数据未收完,但是该区接收定时器达到一定值,则接收端给对方发送NCK包,NCK数据包包括该区名称及所丢失包的序号,只需要求对方重传丢失的包即可。其它区数据处理也一样。
在程序设计中,数据确认模块是一个单独的线程,通过判断接收过来的确认包是ACK还是NCK,发送端决定是将该区数据清空还是重新发送。发送端对确认包的处理过程是:当收到的确认包为ACK时,发送端就把该区重新初始化,等待下次分配数据;若收到的是NCK确认包,则该区的丢包序号将被提取出来,而且丢包标志被置1以表明该区发生了丢包情况。具体流程如图5所示。
另外还有定时器线程,当数据发送完毕时,由数据发送线程关闭掉其它线程即可。
传输数据分包的目的是使接收方能够将一系列无序到达的报文进行正确重组[5]。以太网的最大传送单元(maximum transfer unit,MTU)为 1 500 kb,其他网络环境有的限制为128 kb或更少。若需要发送的数据报总长为L字节,当前网络MTU为M字节,网络当前丢包率为Pb,则接收端全部收到该数据报的概率为:Pbk=(1-Pb)L/M。由此可知,当数据报总长大于MTU时,减小数据报总长可明显提高数据报到达概率。
数据报在分包时,每个数据包必须加上一个包头,以便重组数据。若包头长度为Sh,数据包中的用户数据长度为Su,则实际数据报利用效率为η=Su/(Sh+Su)。即包头长度一定时,增大每个包内的用户数据长度可以提高网络利用率。综合数据报的到达概率和有效利用率两个矛盾因素,本文选用1 kb的固定分包长度。A、B、C、D各区的分包数据区域中存放着待发送的数据包,发送的数据包分包形式为:
确认包格式为:
分包序号是指分配数据之后,该数据包是该区的第几个待发送的数据包。分包总数是指该区分配数据之后总共多少个数据包,为了减少包头长度,规定最多是9个数据包。分配次数是指该区第几次分配数据,这样在接收端重复发送同一个ACK包的情况下,可以避免发送端误认确认信息。如接收端某区数据接收完毕,则发送ACK给对方,因为ACK包本身长度很小,为增加ACK包的到达概率,接收端每次都连续三次发送相同的ACK给对方,然后清空接收端该区数据。若发送端收到一个接收端返回的ACK包,则先判断该区的分配次数和ACK包中的分配次数是否一样,若相同则会清空发送端该区的数据,下次分配数据时则可能会将该区填入数据;若分配次数不能匹配,则对该ACK包置之不理,以避免相同的ACK包确认了刚刚重新分配数据的该区。若三次ACK包都没有到达对方(此情况出现概率很小),则通过发送端的重发机制,把该区数据重发给接收端,再次等待确认即可。当接收端未完全接收数据,每当定时器到时,则会发送NCK给对方,此时会把当前未收到的数据包的序号存放到一个长度为9的数组中,以字符格式随NCK发送给接收端,使得发送端重新发送接收端要求重传的数据包。另外,发送端定时发送心跳包,格式为:
心跳包信息包含4个区的等待状态及分配次数。其中的等待标志只能取0或1,0表示未等待确认,1表示该区正处于等待确认状态。这样接收端就可以通过心跳包来决定是否需要重发确认包了。
分区确认机制中发送数据时,各区都设置有一个超时间隔,时间超过这个值,才会发送该区数据,若超时间隔设为0,则每当分配完数据,该区就会将数据立刻发送。所以不同的超时间隔取值,就可以控制数据的发送速率,取值越大,发送速率就越小。
传统的基于滑动窗口的端到端拥塞控制方法大都采用AIMD算法,本文对时间变量进行控制,采用乘性增加减性减少(MIRD)算法。算法思想是当发送速率不断增加时,使其速率的增量不断减小。所以总体上发送速率仍然是增加的,但是会增加的越来越慢,这样可以更公平地利用网络带宽。算法为:
t为超时间隔,α(t)为每次减少的时间值,二者单位为ms,α(t)是基于接收端的带宽估计,表达式为
若接收到ACK包且控制计时到时,则t=t-α(t),t值最小为0;
若接收到NCK包,则t=(1+β)×t,本文中β=0.5。
式(1)中:x是包发送速率;L是基于接收端的带宽估计值;S是分区数据中待发送的数据包长度;C(x)是一函数,C(x)=x× S× 8,即把包发送速率单位转换为bit/s;SYN是同步时间。按照式(1)计算,当发送速率每提高10倍,α(t)也几乎减少10倍。t的初值定为100 ms,当数据刚开始传输时,数据发送速率很低,接收端带宽被占用较少,即L-C的值较大,则α(t)就会较大,相应的超时间隔就会变小,从而使发送速率增加。当数据发送速率较高时,L与C的值几乎相等,此时α(t)的值就接近于0,使得发送速率几乎不再增加,即对网络繁忙程度自动适应,从而实现带宽利用的公平性和稳定性。
针对该协议,实验平台采用Linux操作系统(Fedora 10、Fedora 14),通过对比试验,把该协议与传统的TCP、UDP协议在总体效率、丢包率、传输等量数据所用时间等方面进行性能分析和研究,实验证明,该协议的效率和可靠性比传统的UDP协议有了明显的提高。
发送文件为本地计算机的机场噪声录音文件,大小为7 909 kb,利用本算法、UDP、TCP在总体接收数据量、所耗时间方面各测试30多次,结果如图6和7所示。
图6中,圆点曲线是使用TCP协议接收的数据量7 909 kb,与发送数据量一致,没有丢包;下三角曲线是本文协议的接收效果,存在很多丢包的情况,总体上比UDP可靠性要高;上三角曲线是使用传统的UDP协议接收的数据效果,基本每次收到数据量都是5 000 kb左右,缺乏可靠性。图7中,圆点曲线是TCP协议完成接收数据所用时间,上三角是本文协议接收数据所用时间,方框曲线是UDP协议所用时间。可以看出使用本文协议传输数据比传统的UDP协议可靠性要高,比传统的TCP协议速率要快。
本文针对传统UDP协议传输不可靠的问题,提出一种基于UDP的可靠传输协议,并引入按分区确认的确认、重发机制,解决了UDT协议数据传输过程中可能出现误判关闭请求而导致连接中断的问题,保证了该协议的传输可靠性,提高了数据传输效率。程序设计是在Linux操作系统下采用多线程方式实现传输数据的分包与重组,并对各区的超时间隔采用乘性增加减性减少的自适应拥塞控制策略,可以满足较高的实时性要求,有效节约了网络资源,并实现带宽利用的公平性和稳定性。
[1]DANILO VALEROS BERNARDO,DOAN B HOANG.End-to-End Security Methods for UDT Data Transmissions[C]//Eds:FGIT2010,LNCS 6485:383-393.
[2]GU YUNHONG,GROSSMAN R L.UDT:UDP-based data transfer for high-speed wide area networks[J].Computer Betworks:The International Journal of Computer and Telecommunications Networking,2007,51(7):1777-1799.
[3] Szakáll Tibor,Péter Dukán,Borislav Odadžic.Realization of Reliable High Speed Data Transfer Over UDP with Continuous Storage[C]//Proc of the IEEE International Symposium on Computational Intelligence and Informatics,Budapest,Hungary,IEEE,2010,12:307-309.
[4] 王艳芳,戴 永.基于UDP的数据可靠传输技术研究与应用[J].计算机工程与应用,2010,46(3):105.
[5]JIGANG WANG,GUOCHANG GU,SHIBO XIE,et al.Reliable and Efficient Data Transfer ProtocolBased on UDP in Cluster System[C]//Proc of IMSCCS′06:Hangzhou,China,2006.
[6] 徐世波.新型可靠数据报传输协议[J].科技资讯,2011(19):8-11.
[7]JIANG,XIAOQIANG.Research of multimedia data transmission based on UDP[C]//Proc of ICMMT 2010,Chongqing,China,IEEE,2010:1291-1295.