TCP 拥塞控制算法详解:CUBIC、BBR 及传统算法
一、CUBIC 拥塞控制算法
1.1 背景
CUBIC 是一种基于窗口的拥塞控制算法,是对传统 BIC(Binary Increase Congestion Control)的改进。在 Linux 内核中被广泛采用(自 Linux 2.6.19 引入),尤其在高带宽、高延迟(长肥网络,LFN)环境中表现良好,是许多现代操作系统的默认 TCP 拥塞控制算法。
1.2 特点
- 以时间为基准的窗口增长:使用立方函数调整拥塞窗口(cwnd),而非线性或指数增长。
- 对高 BDP 网络友好:适合高速、长距离网络。
- 窗口增长与丢包相关,但不完全依赖丢包作为拥塞的唯一信号。
1.3 工作原理
- 发生丢包时:CUBIC 将拥塞窗口降至 W_max × β(β 一般约 0.7)。
- 之后:不再线性增加 cwnd,而是按三次函数(关于时间差 t)快速增长,较快接近上次最大窗口 W_max,再缓慢逼近新平衡点。
- 公式(简化): W(t) = C(t − K)³ + W_max 其中:W(t) 为 t 时刻的拥塞窗口;C 为缩放常数;K 为达到 W_max 所需时间;t 为自上次丢包以来的时间。
1.4 优点
- 在高带宽延迟网络中性能优于传统算法。
- 可扩展性好,适合数据中心和互联网骨干网。
1.5 缺点
- 仍主要依赖丢包作为拥塞信号,难以区分排队延迟与真正拥塞。
- 在存在较大缓冲队列的网络中可能引起较高延迟(bufferbloat)。
二、BBR 拥塞控制算法
2.1 背景
BBR(Bottleneck Bandwidth and RTT)由 Google 提出(2016 年),旨在解决传统基于丢包的算法(如 CUBIC)在高延迟、高带宽环境下效率低下的问题,并改善 bufferbloat。
2.2 特点
- 不依赖丢包作为拥塞判断,而是基于瓶颈带宽(BtlBw)和往返时延(RTprop)动态调整发送速率。
- 主动探测网络带宽和最小 RTT,通过建模网络状态实现高效传输。
- 显著减少排队延迟,提高响应速度和吞吐量。
2.3 工作原理
BBR 周期性地在两种模式之间切换:
- PROBE_BW(带宽探测):逐步增加发送速率以探测可用带宽。
- PROBE_RTT(最小 RTT 探测):定期降低发送速率以测量最小 RTT(反映无排队时的网络延迟)。
BBR 控制两个关键参数:
- BtlBw:当前路径所能承载的最大数据传输率(瓶颈带宽估计)。
- RTprop:路径上的最短往返时间(最小 RTT)。
拥塞窗口的调整不直接依据丢包,而是使发送速率尽量匹配估计的瓶颈带宽,同时避免过多排队延迟。
2.4 优点
- 在高带宽、高延迟、高缓冲网络中性能优越。
- 降低网络延迟和抖动,提升用户体验。
- 减少因拥塞窗口过大造成的 bufferbloat。
- 特别适用于视频流、大文件传输等对带宽敏感的场景。
2.5 缺点
- 多 BBR 流竞争时可能存在公平性问题。
- 部署需要操作系统支持(Linux kernel ≥ 4.9 支持较好)。
- 部分网络设备对非传统拥塞控制算法支持不佳。
三、CUBIC 与 BBR 对比总结
| 特性 | CUBIC | BBR |
|---|---|---|

