背景和意义
随着Internet的发展,网络中出现了越来越多的高速和长距离链路,这些链路的特点是时延带宽积(BDP=bandwith*RTT)很大,也就是说,这些链路所能容纳的总数据量很大。
传统TCP协议,例如TCP-Reno、TCP-NewReno、TCP-SACK中,每过一个RTT(Round Trip Times),窗口增加一个单位,这使得TCP的数据传输速度缓慢,远不能充分利用网络带宽。当碰上高带宽环境时,可能需要经历很多个RTT,拥塞窗口才能接近于一个BDP。如果数据流很短,可能拥塞窗口还没增长到一个BDP,数据流就已经结束了,这种情况的带宽利用率就会非常低。
假设网络带宽是10Gbps,RTT是100ms,数据包是固定的1250字节,则此网络所能容纳的数据包总量是:\(\dfrac{10\times 10^9\times 0.1}{1250\times 8}=10^5\)个数据包。假设窗口从50000开始增长,也需要50000个RTT(1.4个小时)才能达到网路的满负荷,如果一个TCP流在此之前结束(显然往往如此),则未充分利用带宽。
BIC-TCP
BIC-TCP采用二分搜索的方式来决定拥塞窗口的增长尺度,首先它会记录拥塞窗口的一个最大值点,这个最大值就是TCP最近一次出现丢包时拥塞窗口的值;还会记录一个最小值点,即在一个RTT周期内没有出现丢包事件时窗口的大小。二分搜索就是取最小值和最大值的中间点,当拥塞窗口增长到这个中间值且没有出现丢包的话,就说明网络还可以容纳更多的数据包。那么将这个中值设为新的最小值,在新的最小值和最大值间搜索中间值。当前拥塞窗口的值还远没有达到通道的容量时,其增长速度很快;相反,当拥塞窗口的值接近于通道的容量时,其拥塞窗口增长函数是一个简化的对数凸函数。这个凸函数使拥塞窗口在饱和点或平衡点比凹函数或线性函数保持更长的时间,在饱和点处,凸函数和线性函数具有最大的窗口增量,因此在丢包发生时会出现大量的数据包被丢失。
BIC-TCP的主要特征是在前面说过的其独特的窗口增长函数,图1给出了BIC-TCP的窗口增长函数。当出现丢包事件时,BIC-TCP通过乘以因子 \(\beta\) 来缩小窗口,缩小之前的窗口大小被设置为最大值\(W_{\max}\) ,并且缩小之后的窗口大小被设置为最小值\(W_{\min}\) 。 然后,BIC-TCP使用这两个参数执行二分搜索,拥塞窗口的下一个取值会是\(W_{\max}\) 和\(W_{\min}\) 之间的“中点” \(W_{mid}\) 。
为了防止拥塞窗口从\(W_{\min}\) 增长到 \(W_{\max}\) 的步长step太大,BIC-TCP还设置了一个常数\(S_{\max}\) ,当step>\(S_{\max}\) 时,BIC-TCP会取下一个增长点为 \(W_{\min}\)+\(S_{\max}\) 而不是 \(W_{mid}\) (加法增加阶段),如果没有出现丢包的话,再更新\(W_{\min}\) ,直到step< \(S_{\max}\) 为止。与此同时BIC-TCP还设置一个另一个控制参数\(S_{\min}\) ,当窗口增量小于 \(S_{\min}\) 时,BIC-TCP会将当前拥塞窗口值设为最大值。
如果窗口增长超过最大值,则说明当前窗口最大值还不是一个饱和点,网络还可以容纳更多的数据包,窗口还有增长的空间,一个新的窗口最大值需要被探索。于是BIC-TCP会进入一个新的阶段,叫做最大值探索阶段。最大探测使用一个与在加法增长和二分搜索阶段完全对称的窗口增长函数。图1中给出了在最大探索阶段期间的窗口增长函数。在最大探测期间,窗口最初缓慢地增长以发现附近新的最大值,经过一段时间的缓慢增长,如果没有找到新的最大值(即没出现包丢失),则它猜测新的最大值离得很远,所以它给窗口大小增加一个大的固定增量,使用加法增加切换到更快的增加速度。BIC-TCP的良好性能来自 \(W_{\max}\) 附近的缓慢增加以及在加法增加和最大探测期间的线性增加。
BIC-TCP在高速网络中具有良好的可扩展性、多个流竞争的公平性和低窗口振荡的稳定性。然而,BIC-TCP的增长功能对于TCP来说仍然过于激进,特别是在短RTT或低速网络下。此外,窗口控制的几个不同阶段(二进制搜索增加、最大探测、\(S_{\max}\) 和 \(S_{\min}\) )增加了协议实现和性能分析的复杂性。
算法与推导
算法简述
CUBIC是BIC-TCP的下一代版本。 它通过用三次函数(包含凹和凸部分)代替BIC-TCP的凹凸窗口生长部分,大大简化了BIC-TCP的窗口调整算法, 该函数在保留BIC-TCP的优点(特别是其稳定性和可扩展性)的同时,简化了窗口控制,增强了其TCP友好性。实际上,任何奇数阶多项式函数都具有这种形状。三次函数的选择是偶然的,但是也是出于方便。CUBIC的关键特征是其窗口增长仅取决于两个连续拥塞事件之间的时间。一个拥塞事件是指出现TCP快速恢复的时间。因此,窗口增长与RTT无关。 这个特性允许CUBIC流在同一个瓶颈中竞争,有相同的窗口大小,而不依赖于它们的RTT,从而获得良好的RTT公平性。而且,当RTT较短时,由于窗口增长率是固定的,其增长速度可能比TCP标准慢。 由于TCP标准(例如,TCP-SACK)在短RTT下工作良好,因此该特征增强了协议的TCP友好性。
CUBIC窗口增长函数
CUBIC的窗口增长函数是一个三次函数,非常类似于BIC-TCP的窗口增长函数,CUBIC的函数图像如图2所示。CUBIC的详细运行过程如下,当出现丢包事件时,CUBIC同BIC-TCP一样,会记录这时的拥塞窗口大小作为\(W_{\max}\),接着通过常数因子\(\beta\) 执行拥塞窗口的乘法减小,这里 \(\beta\) 是一个窗口降低常数,并进行正常的TCP快速恢复和重传。从快速恢复阶段进入拥塞避免后,使用三次函数的凸函数增加窗口。三次函数设置在 \(W_{\max}\) 处达到稳定点,如果存在新的最大窗口(网络带宽发生变化), 然后使用三次函数的凹函数开始探索新的最大窗口。
CUBIC的窗口增长函数公式如下所示