随着互联网的发展, 网络的特性表现出了大的带宽和延迟乘积(BDP), TCP的性能是受到了较大的挑战 。在TCP-Reno这样标准的TCP中,TCP在拥塞避免阶段每增加一个窗口就需要一个往返时间RTT,其过于缓慢才能达到最佳拥塞窗口,无法充分的利用网络带宽。因此为了充分利用网络带宽,提出了Cubic拥塞算法的前身—BIC(Binary Increase Congestion control) 。BIC的核心思想是通过二分搜索的思想来找到当前链路最合适的拥塞窗口。 当链路在网络上因为排队而发生丢包时,链路的当前最佳拥塞窗口肯定是小于丢包时的拥塞窗口的,我们定义丢包时的拥塞窗口大小为Wmax,同样,BIC也采用乘法减小的方式减小窗口,我们称这个因子为β (默认设定为0.5),我们定义减小后的窗口为Wmin,则有Wmin=β*Wmax(线性增长),我们认为乘法减小后的窗口应该是小于最佳拥塞窗口的,因此,对于链路当前最佳拥塞窗口W来说,我们有WminSmax 时,BIC-TCP会取下一个增长点为 Wmin+Smax 而不是 Wmid ,如果没有出现丢包的话,再更新Wmin ,直到step< Smax 为止。与此同时BIC-TCP还设置一个另一个控制参数Smin ,当窗口增量小于 Smin 时,BIC-TCP会将当前拥塞窗口值设为最大值。 此时必须要重新找到一个最大值, BIC-TCP会进入一个新的阶段,叫做最大值探索阶段,最大探测使用的是一个与在加法增长和二分搜索阶段完全对称的窗口增长函数, 在最大探测期间,窗口最初缓慢地增长以发现附近新的最大值,经过一段时间的缓慢增长,如果没有找到新的最大值(即没出现包丢失),则它猜测新的最大值离得很远,所以它给窗口大小增加一个大的固定增量,使用加法增加切换到更快的增加速度。下图中给出来BIG-TCP的窗口增长函数。 上图为BIC-TCP窗口增长函数

虽然BIC-TCP有在高速网络中具有良好的可扩展性和低窗口振荡的稳定性等优点。但是BIC的增窗策略太激进了,大量的抢占了资源(特别是在短RTT或低速网络下)以及窗口控制的几个不同阶段(二进制搜索增加、最大探测、Smax 和 Smin )增加了协议实现和性能分析的复杂性。因此产生了一种BIC-TCP的下一个版本Cubic。 它通过用三次函数(包含凹和凸部分)代替BIC-TCP的凹凸窗口生长部分,大大简化了BIC-TCP的窗口调整算法, 同时还保留BIC-TCP的优点CUBIC的一个关键特征是其窗口增长仅取决于两个连续拥塞事件之间的时间,与窗口增长与RTT无关。这个特性允许CUBIC流在同一个瓶颈中竞争,有相同的窗口大小,而不依赖于它们的RTT,从而获得良好的RTT公平性。 CUBIC的详细运行过程如下,当出现丢包事件时,CUBIC同BIC-TCP一样,会记录这时的拥塞窗口大小作为Wmax,接着通过常数因子β(β是一个窗口降低常数)执行拥塞窗口的乘法减小,并进行正常的TCP快速恢复和重传。从快速恢复阶段进入拥塞避免后,使用三次函数的凸函数增加窗口, 三次函数设置在 Wmax 处达到稳定点,如果存在新的最大窗口(网络带宽发生变化), 然后使用三次函数的凹函数开始探索新的最大窗口。CUBIC的窗口增长函数公式如下所示: W(t) = C (t - K)^3+W_max (1) C是一个CUBIC的参数, t是从窗口上次降低开始到现在的时间,是一个弹性值,而 K 是上述函数在没有进一步丢包的情况下将当前的拥塞窗口 W 增加到 Wmax 经历的时间。 K 计算公式如下: 在拥塞避免阶段每收到一个ACK,CUBIC都会使用方程(1)计算在下个RTT的窗口增长速率。下图给出了CUBIC的窗口增长函数 ps - Cubic的数学推导若感兴趣可作为扩展进行尝试(主要假设其为三次函数进行处理) 或者可以看以下的博客: https://blog.csdn.net/fdsafwagdagadg6576/article/details/122240984

精彩内容

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。