CUBIC:一种新型高速TCP变种协议
一、概述
CUBIC是一种TCP(Transmission Control Protocol)拥塞控制协议,顾名思义,CUBIC可以理解为将传统TCP协议中的线性滑动窗口协议升级为三次的。这样一来,使得拥塞控制协议具有更大的可扩展性,尤其适合用在高速和长距离链路上。同时,CUBIC算法对于不同链路上的公平带宽分配以及窗口增减策略都有改进。CUBIC是一个已在Linux系统上实现的拥塞控制协议,所以其重要性自然不言而喻。
二、问题的提出
随着Internet的发展,网络中出现了越来越多的高速和长距离链路,这些链路的特点是时延带宽积(BDP)很大,也就是说,这些链路所能容纳的总数据量很大。传统TCP协议,例如TCP-Reno、TCP-NewReno、TCP-SACK中,每过一个RTT(Round Trip Times),窗口增加一个单位,这使得TCP的数据传输速度缓慢,远不能充分利用网络带宽。
这里,作者举了一个例子来说明传统TCP协议不能充分利用网络带宽:假设网络带宽是10Gbps,RTT是100ms,数据包是固定的1250字节,则此网络所能容纳的数据包总量是:(10*109*0.1)/(1250*8)=105个数据包。假设窗口从50000开始增长,也需要50000个RTT才能达到网路的满负荷,如果一个TCP流在此之前结束(显然往往如此),则未充分利用带宽。
三、BIC-TCP的优点
针对上述问题,很多TCP变种协议被提出,BIC-TCP是其中的一个佼佼者。
BIC-TCP使用一种二分搜索算法:假如上次发生TCP丢包时的窗口大小为max,上个未发生丢包的RTT的窗口大小为min,BIC-TCP中的窗口首先增长到max和min的中点mid。窗口大小超过mid后,若未发生丢包,表明网络还能容纳更多的数据包,则BIC-TCP算法将mid设为新的min,再次开始二分搜索。这种算法的合理之处是可想而知的:如果网络状况没有发生剧变,当前链路的容量必然是位于上次丢包发生后的最大和最小之间。在当前网络容纳能力之内时,窗口以对数函数快速增长,而接近网络的容量界限(即上次丢包处)时,窗口缓速增长,以减少丢包率。可见,BIC-TCP协议可以以最快的速度达到网络极限利用率,并且还能小心的避免丢包。
BIC-TCP的优点在于它的稳定性,它用对带宽变化的反映速度换取了稳定性。在窗口大小超过上次丢包处(上个饱和点)时,BIC-TCP开始以指数增长,也就是初始非常缓慢,使得窗口在上个饱和点附近长时间停留,来小心的避免丢包。一旦未有丢包发生,窗口逐渐开始快速增长。
四、什么是CUBIC?
CUBIC是BIC-TCP的改进版本,它改进了BIC-TCP的窗口调整算法,以一个三次函数代替了BIC-TCP中的凹函数和凸函数。其实CUBIC的关键不在这个三次函数,而在于窗口增长只依赖于连续两次拥塞事件之间的时间,这使得窗口增长独立于RTT。并且当RTT较小时,可以很好的和标准TCP协议兼容。
CUBIC算法已在Linux上实现,并且也做了一些升级。最重要的是优化了三次函数根值的计算方法,其次是去掉了窗口增长限制。
五、BIC-TCP算法详述
当发生丢包时,记下窗口大小为Wmax,然后以乘法减小窗口到Wmin,BIC-TCP算法计算Wmin和Wmax的中点mid。若当前窗口距mid的距离大于一个常数Smax,则窗口大小以Smax为单位线性增长,否则直接在一个RTT内增长到mid。此后若未发生丢包,则更新后的窗口(可能是增加了Smax也可能是直接跳到mid)设为新的Wmin。不断迭代此过程,直到窗口增加量小于一个常数Smin,此时将窗口设为当前最大值。所以在达到最大值之前的窗口增长是先线性(图1中Additive Increase部分),后对数(图1中Binary Search部分)。
图1
窗口尺寸超过Wmax值后,BIC-TCP算法进入最大值探索阶段,此阶段的增长函数先指数,后线性。指数增长位于初期,窗口变化缓慢,视图在上次的饱和点附近找到新的最大值,假如经过几次都未找到新的最大值(即出现丢包)则转换为快速增长模式。
六、CUBIC算法再述
如前所述,CUBIC算法是BIC-TCP算法的改进版,在基本遵从BIC-TCP算法思想的基础上,增加了对标准TCP协议的友好性。CUBIC算法使用一个三次函数来描述窗口的增长,和BIC-TCP算法有很多相似之处,如图2。
图2
发生丢包后,窗口以倍数β减小,然后执行标准TCP中的恢复和重传。当进入拥塞避免阶段时,使用凸函数段增长窗口,在接近Wmax值时,窗口增长变缓,并逐渐进入凹函数增长段。从图中可看出,窗口大小会在Wmax附近较长时间的停留,这就保证了协议的稳定性。
几点说明:
(1) TCP友好域
算法执行过程中,每收到一个ACK后都会判断当前是否处于标准TCP阶段,即TCP友好域,以此来更好的兼容TCP。
标准TCP协议在网络时延带宽积小或者RTT小的情况下表现仍不错,CUBIC被设计为在这两种情况下可以很好的兼容标准TCP协议。经作者实验,在上述两种情况下,CUBIC和标准TCP的丢包率大体相同。
(2) 在窗口达到Wmax前,处于凸函数阶段,超过Wmax后,处于凹函数阶段。
(3) 快速收敛
为了增加网络的收敛速度,CUBIC算法里增加了一种叫快收敛的机制,即网络中的旧链接为新链接让出带宽。当丢包发生时,如果此时的Wmax值小于上一个Wmax值,表明次链接的饱和值在逐渐减小,那么就可以进一步减小Wmax值来给新的链接留出带宽。
(4) 在Linux系统上实现时,使用了一种可插拔的拥塞模式,即可以动态选择拥塞控制算法而不用每次换算法都重新编译内核文件。
七、实验数据和结论
作者做了大量实验来验证CUBIC的性能,包括同一网络中不同流间的带宽平衡分配实验,在特定网络条件下对标准TCP协议的友好型实验,CUBIC和标准TCP协议间的带宽公平分配性能对比实验,CUBIC和标准TCP之间的吞吐率对比试验,以及验证CUBIC是否会抢占同一网络中的标准TCP带宽的实验。
经测试,CUBIC在各方面表现都较为优秀。CUBIC协议克服了BIC-TCP协议的不足之处,改进了TCP友好性和带宽分配的公平性,就时延带宽积和RTT这两个参数来说,CUBIC无论是在这两个参数高的情况下还是低的情况下,表现都较为优秀。
论文下载地址:http://download.csdn.net/detail/masikkk/4785051