TCP的拥塞控制算法中的BIC(Binary Increase Congestion)与CUBIC算法详解
字数 3354 2025-12-12 00:55:03

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字节)。

  1. 发生丢包: 传统算法(如Reno)执行“乘法减小”,cwnd减半至约7500个MSS。
  2. 线性恢复: 随后进入拥塞避免阶段,每个RTT只将cwnd增加1个MSS。要将cwnd从7500增长回15000,需要增加7500个MSS。
  3. 恢复时间: 这需要7500个RTT!即7500 * 0.15s = 1125秒(接近19分钟)。在这漫长的恢复期内,链路带宽被严重浪费。

目标: 设计一个新算法,在减半后能更快地增长cwnd,逼近之前的“最大cwnd”(我们称之为 W_max),同时在接近W_max时增长放缓,避免激进增长导致新的丢包。

第二步:BIC(Binary Increase Congestion)算法核心思想

BIC的核心是使用二分搜索的思想来快速、平滑地找到一个新的平衡点(即网络能承载的可用带宽)。

  1. 记录状态: 当发生丢包时,BIC记录丢包前的cwnd值,作为 W_max
  2. 减半窗口: 像传统算法一样,将cwnd减半,得到一个新的最小值,记为 W_min。即 W_min = β * W_max(β通常为0.5)。
  3. 二分搜索阶段
    • 目标是从当前窗口 W_min 快速、平滑地增长到 W_max
    • BIC不是线性增长,而是设定一系列“目标窗口”。第一个目标窗口是 W_minW_max 的中点:target = (W_min + W_max) / 2
    • 增加阶段: 在未达到当前目标窗口前,cwnd采取指数级增长(实际上是指数递增的加法增大),快速接近目标。增长步长随着cwnd接近目标而减小。
    • 达到目标: 当cwnd达到当前目标窗口后,就将这个目标窗口设为新的 W_min,并以新的 W_minW_max 的中点作为下一个目标。
    • 这个过程不断重复,cwnd就像在以“二分搜索”的方式逐步逼近 W_max
  4. 收敛与平稳阶段
    • (W_max - W_min) 小于一个预设的阈值 S_min(例如2个MSS)时,BIC认为已经非常接近 W_max,算法进入平稳增长阶段,转为更温和的线性增长(类似传统拥塞避免),直到再次发生丢包,记录新的 W_max

BIC的优缺点

  • 优点: 在高BDP网络中,能比线性增长更快地“恢复”到高带宽利用率状态。
  • 缺点: 增长函数在窗口较小时依然不够快(尤其是在刚启动时);其窗口增长曲线在对数-线性坐标下是多条直线段组成的折线,不够平滑;与其他流(如Reno流)竞争时,有时过于激进。

第三步:CUBIC(CU-BIC)算法的演进与创新

CUBIC是BIC的改进和重设计。它保留了BIC快速收敛到W_max并平稳操作的核心思想,但做出了两个根本性改变:

  1. 将窗口增长函数从依赖RTT的二分搜索,改为一个独立于RTT的三次函数
  2. 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的工作流程详解

  1. 丢包与减半: 检测到丢包时,记录当前cwnd为新的 W_max,然后将cwnd减小为 β * W_max(β通常为0.7或0.8,比传统0.5更温和)。
  2. 三次函数增长
    • 重置计时器 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之上是否有新的可用带宽。
  3. 独立于RTT: 这是CUBIC的关键优势。因为增长由绝对时间t驱动,而不是由RTT数量驱动。这意味着无论是RTT=1ms的局域网流,还是RTT=200ms的广域网流,只要从丢包开始经历了相同的时间,它们的cwnd增长就是相同的。这极大地提升了RTT公平性,避免了长RTT流被短RTT流“饿死”的问题。
  4. 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性能的基石之一。

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性能的基石之一。