BBRv2 是 Google 在 BBRv1 基础上推出的重要升级版,其核心设计哲学从"以丢包为拥塞信号"转变为"以带宽和延迟的精确模型驱动传输"。下面从算法框架、关键改进和性能权衡三个层面解析其原理。
一、核心思想:模型化拥塞控制
BBR 系列算法的本质是放弃"丢包即拥塞"的传统假设,转而主动测量并建模网络路径的极限能力。BBRv2 延续了 v1 的核心架构,通过两个核心参数来描述网络路径:
| 参数 | 含义 | 测量方法 |
|---|---|---|
| BtlBW(瓶颈带宽) | 路径上最窄处的最大传输速率 | 使用窗口化最大值滤波器,从 ACK 的交付速率中提取 |
| RTprop(传播延迟) | 无排队状态下的往返时间 | 使用窗口化最小值滤波器,持续探测 |
BBR 的目标是让发送速率和飞行中的数据量精确匹配 BDP = BtlBW × RTprop,从而使数据恰好填满管道但不堆积在缓冲区------这被称为 Kleinrock 的"最优操作点"。
然而,BBRv1 在实践中暴露了两个突出问题:与 TCP 共存时容易侵占带宽导致对方"饿死",以及在浅缓冲区网络中引发过高重传率。BBRv2 正是为解决这些问题而生。
二、状态机:四个阶段的循环
BBRv2 与 v1 一样采用状态机架构,通过状态切换来分别探测带宽和延迟
┌─────────────────────────────────────┐
│ │
▼ │
┌──────────┐ ┌─────────┐ │
│ STARTUP │ ──► │ DRAIN │ │
└──────────┘ └─────────┘ │
│ │
│ ┌──────────┐ │
└───────► │PROBE_BW │ ◄──────┐ │
└──────────┘ │ │
│ │ │
▼ │ │
┌──────────┐ │ │
│PROBE_RTT │ ───────┘ │
└──────────┘ │
│ │
└──────────────────────┘
1. STARTUP(启动阶段)
-
目的:快速探测带宽上限
-
行为:每个 RTT 内发送速率翻倍(增益约 2.77 倍),直至带宽增长停滞
-
v2 改进:引入了更保守的退出机制,避免过度填充缓冲区
2. DRAIN(排空阶段)
-
目的:清除启动阶段在缓冲区积累的排队数据
-
行为:发送速率降低,让飞行中的数据量回落至 BDP 附近
3. PROBE_BW(带宽探测阶段)------ 主要运行状态
-
目的:周期性试探带宽是否增加
-
行为:以 8 个相位为一个周期,多数时间以估计带宽的 1.25 倍、0.75 倍等比例进行探测
-
v2 改进:引入了丢包率约束,探测期间若丢包率超过阈值(默认 2%)则提前终止
4. PROBE_RTT(延迟探测阶段)
-
目的:重新测量最小 RTT(避免被长期排队数据污染)
-
行为:当超过 10 秒未刷新 RTprop 时,强制将飞行数据量降至 4 个 MSS 左右
-
v2 改进:退出后可根据带宽是否满载选择进入 PROBE_BW 或回退到 STARTUP
三、BBRv2 的三项关键改进
1. 对丢包做出回应(v1 几乎无视丢包)
BBRv1 的核心假设是"丢包不等于拥塞",因此在高丢包率的无线网络中可以跑满带宽,但这导致它与 CUBIC 等传统算法共存时,会因不主动退让而侵占对方带宽。
BBRv2 的改进:
-
引入 丢包率阈值 (
BBRLossThresh,默认 2%),在每个 RTT 周期内若丢包率超过阈值,则触发带宽下调 -
下调幅度由
BBRBeta控制(默认 0.7,即带宽降低 30%) -
这使 BBRv2 在共享瓶颈时能与 CUBIC/Reno 公平共存
2. 设置目标丢包率上限,主动控制缓冲区压力
v1 在浅缓冲区网络中极易导致高重传率,因为其探测机制会快速填满微小缓冲区,引发大量丢包。
BBRv2 的改进:
-
引入
BBRHeadroom参数(默认 0.85),限制最大飞行数据量为 BDP 的 85%,为其他流预留空间 -
在浅缓冲区场景下,BBRv2 的飞行数据量被主动限制在约 0.85 × BDP,大幅降低排队和丢包
-
代价是吞吐量比 v1 低 13%-16%(在浅缓冲区环境中)
3. 支持 ECN(显式拥塞通知),更早感知拥塞
BBRv2 支持 DCTCP 风格的 ECN(而非传统 TCP 将 CE 标记视为丢包),能够:
-
在路由器队列尚未满时就收到拥塞信号
-
提前下调速率,避免进入丢包状态
-
与 L4S(低延迟低丢包服务)架构兼容,适合对延迟敏感的场景
四、性能特征与适用场景
根据学术研究和实际部署测试,BBRv2 呈现以下特征:
| 维度 | BBRv1 | BBRv2 |
|---|---|---|
| 与 CUBIC 共存公平性 | 差(易侵占) | 良(主动退让) |
| 浅缓冲区吞吐量 | 高但重传率极高 | 略低但重传率显著下降 |
| 深缓冲区延迟 | 低 | 低 |
| 随机丢包场景 | 不敏感,吞吐稳定 | 较敏感,需调参 |
| 带宽探测响应速度 | 快 | 较慢(因保守策略) |
| RTT 公平性 | 差(短 RTT 流占优) | 改善明显 |
适用场景推荐:
-
适合:与 TCP 流共享的网络、无线/移动网络、延迟敏感的应用
-
需谨慎:极深缓冲区场景(CUBIC 可能反超)、对响应速度要求极高的突发传输
五、BBRv1 vs BBRv2 简要对比
| 特性 | BBRv1 | BBRv2 |
|---|---|---|
| 丢包处理 | 忽略 | 引入丢包阈值(默认 2%),触发带宽下调 |
| 浅缓冲区行为 | 高重传 | 加入 headroom(预留空间),降低重传 |
| 公平性 | 与 TCP 共存差 | 主动退让,公平性改善 |
| 探测增益 | 固定 1.25/0.75 | 可配置,探测周期中加入丢包约束 |