TCP的拥塞控制算法中的BIC(Binary Increase Congestion)与CUBIC算法详解
这是一个关于TCP拥塞控制演进中,从基于丢包的传统算法(如Reno、NewReno)发展到更高效、更适应高速、长距离网络的算法的重要知识点。它探讨了算法设计思想从线性增长转向更智能的“凹”与“凸”增长曲线的过程。
知识点描述
BIC(Binary Increase Congestion)和CUBIC是其继承者和更广泛应用的改进版本,是现代Linux等操作系统内核中默认的TCP拥塞控制算法。它们旨在解决传统AIMD(加法增大/乘法减小)算法在高速、高带宽延迟积网络中收敛速度慢、带宽利用率低的问题。
核心问题在于:传统算法(如Reno)在检测到丢包时,会将拥塞窗口(cwnd)减半,然后进入线性增长的拥塞避免阶段。在BDP(带宽时延积)很大的网络中(如跨洋光纤),窗口减半后需要很长时间的线性增长才能再次“填满”网络管道,导致带宽利用率低下。BIC和CUBIC试图通过更智能的窗口增长函数来加速这一恢复过程,同时保持公平性和稳定性。
详细讲解过程
第一步:理解背景与目标(传统AIMD的瓶颈)
想象一条连接旧金山和伦敦的高速网络路径,往返时间(RTT)为150ms,带宽为1Gbps。其BDP约为18.75 MB(1 Gbps * 0.15 s / 8)。假设cwnd在丢包前达到了这个BDP值,即约15000个MSS(假设MSS=1460字节)。
- 发生丢包: 传统算法(如Reno)执行“乘法减小”,cwnd减半至约7500个MSS。
- 线性恢复: 随后进入拥塞避免阶段,每个RTT只将cwnd增加1个MSS。要将cwnd从7500增长回15000,需要增加7500个MSS。
- 恢复时间: 这需要7500个RTT!即7500 * 0.15s = 1125秒(接近19分钟)。在这漫长的恢复期内,链路带宽被严重浪费。
目标: 设计一个新算法,在减半后能更快地增长cwnd,逼近之前的“最大cwnd”(我们称之为 W_max),同时在接近W_max时增长放缓,避免激进增长导致新的丢包。
第二步:BIC(Binary Increase Congestion)算法核心思想
BIC的核心是使用二分搜索的思想来快速、平滑地找到一个新的平衡点(即网络能承载的可用带宽)。
- 记录状态: 当发生丢包时,BIC记录丢包前的cwnd值,作为
W_max。 - 减半窗口: 像传统算法一样,将cwnd减半,得到一个新的最小值,记为
W_min。即W_min = β * W_max(β通常为0.5)。 - 二分搜索阶段:
- 目标是从当前窗口
W_min快速、平滑地增长到W_max。 - BIC不是线性增长,而是设定一系列“目标窗口”。第一个目标窗口是
W_min和W_max的中点:target = (W_min + W_max) / 2。 - 增加阶段: 在未达到当前目标窗口前,cwnd采取指数级增长(实际上是指数递增的加法增大),快速接近目标。增长步长随着cwnd接近目标而减小。
- 达到目标: 当cwnd达到当前目标窗口后,就将这个目标窗口设为新的
W_min,并以新的W_min和W_max的中点作为下一个目标。 - 这个过程不断重复,cwnd就像在以“二分搜索”的方式逐步逼近
W_max。
- 目标是从当前窗口
- 收敛与平稳阶段:
- 当
(W_max - W_min)小于一个预设的阈值S_min(例如2个MSS)时,BIC认为已经非常接近W_max,算法进入平稳增长阶段,转为更温和的线性增长(类似传统拥塞避免),直到再次发生丢包,记录新的W_max。
- 当
BIC的优缺点:
- 优点: 在高BDP网络中,能比线性增长更快地“恢复”到高带宽利用率状态。
- 缺点: 增长函数在窗口较小时依然不够快(尤其是在刚启动时);其窗口增长曲线在
对数-线性坐标下是多条直线段组成的折线,不够平滑;与其他流(如Reno流)竞争时,有时过于激进。
第三步:CUBIC(CU-BIC)算法的演进与创新
CUBIC是BIC的改进和重设计。它保留了BIC快速收敛到W_max并平稳操作的核心思想,但做出了两个根本性改变:
- 将窗口增长函数从依赖RTT的二分搜索,改为一个独立于RTT的三次函数。
- 将
W_max作为函数的中心点,而不是搜索的终点。
CUBIC的核心——三次函数:
CUBIC的拥塞窗口大小(cwnd)直接由以下三次函数计算:
W(t) = C * (t - K)^3 + W_max
其中:
W(t): 从上次丢包开始,经过时间t后的目标窗口大小。C: 一个缩放常数,控制增长曲线的陡峭程度。t: 从上次窗口减少后经过的时间。K: 一个关键参数,计算公式为K = 立方根( (W_max * β) / C )。它代表了函数从凹(增长加速)转为凸(增长减速)的拐点时间。W_max: 上次发生丢包时的窗口大小。
CUBIC的工作流程详解:
- 丢包与减半: 检测到丢包时,记录当前cwnd为新的
W_max,然后将cwnd减小为β * W_max(β通常为0.7或0.8,比传统0.5更温和)。 - 三次函数增长:
- 重置计时器
t=0。 - 在每一个ACK到达时(或每一个很小的时间粒度),CUBIC并不直接按ACK数量增加cwnd,而是根据流逝的时间
t,计算三次函数的目标值W(t),然后让cwnd平滑地朝这个目标值调整。 - 凹区域(t < K): 在K时间点之前,函数是凹的,增长率 (
dW/dt) 逐渐增加。这模拟了BIC的快速搜索阶段,允许cwnd在减半后快速恢复。 - 凸区域(t > K): 在K时间点之后,函数是凸的,增长率 逐渐减小。当cwnd接近或超过原来的
W_max时,增长会变得非常缓慢,平稳地探测W_max之上是否有新的可用带宽。
- 重置计时器
- 独立于RTT: 这是CUBIC的关键优势。因为增长由绝对时间
t驱动,而不是由RTT数量驱动。这意味着无论是RTT=1ms的局域网流,还是RTT=200ms的广域网流,只要从丢包开始经历了相同的时间,它们的cwnd增长就是相同的。这极大地提升了RTT公平性,避免了长RTT流被短RTT流“饿死”的问题。 - TCP友好区域: 当cwnd远小于
W_max时(例如在连接启动阶段),CUBIC会退回到类似标准TCP的慢启动和拥塞避免模式(窗口随ACK线性增长),以确保与传统的Reno、NewReno流共存时的友好性。
第四步:对比与总结
| 特性 | BIC | CUBIC |
|---|---|---|
| 增长核心 | 基于二分搜索的思想,通过设定“目标窗口”进行快速逼近。 | 基于三次函数 W(t) = C*(t-K)^3 + W_max,由绝对时间驱动增长。 |
| RTT公平性 | 较差。增长依赖于ACK(即RTT),短RTT流增长更快。 | 优秀。增长独立于RTT,不同RTT的流在相同时间内增长相同,实现更好的公平性。 |
| 增长曲线 | 在对数坐标下呈折线。 | 平滑的三次曲线(凹->凸)。 |
| 主要优势 | 首次提出快速、智能地恢复并平稳探测带宽的思想。 | 在BIC思想基础上,通过时间驱动和三次函数,实现了更好的RTT公平性、平滑性和可扩展性。 |
| 现状 | 是CUBIC的思想先驱,现已较少直接使用。 | Linux内核默认的TCP拥塞控制算法,被广泛应用于互联网,是应对高速长肥网络的事实标准。 |
结论: BIC和CUBIC代表了TCP拥塞控制从简单的、反应式的线性控制,向更智能的、基于模型的非线性控制演进的重要一步。CUBIC通过其时间驱动的三次增长函数,优雅地平衡了收敛速度、稳定性、公平性和带宽利用率,成为现代数据中心和广域网中TCP性能的基石之一。