BBRv1(Bottleneck Bandwidth and Round-trip propagation time)是 Google 于 2016 年提出的拥塞控制算法,其核心思想是摒弃传统算法依赖丢包作为拥塞信号的范式,转而直接测量网络路径的瓶颈带宽和传播延迟,将发送速率与飞行中的数据量精确匹配到链路容量,从而在保证高吞吐的同时实现极低排队延迟。
一、核心模型:两个关键参数
BBR 将网络路径抽象为两个动态特征量:
| 参数 | 物理含义 | 测量方法 |
|---|---|---|
| BtlBW | 路径上的瓶颈带宽(最大传输速率) | 使用窗口化最大值滤波器,从 ACK 返回的交付速率(delivery rate)中持续跟踪 |
| RTprop | 无排队状态下的传播延迟(最小 RTT) | 使用窗口化最小值滤波器,从 RTT 采样中持续跟踪 |
网络路径的容量由 BDP(带宽延迟积)= BtlBW × RTprop 给出。
BBR 的目标是让发送速率 = BtlBW,飞行中的数据量 ≈ BDP,此时数据恰好填满管道,既不造成队列堆积(延迟最小),又能充分利用带宽。
二、状态机:四个阶段循环
BBR 通过一个状态机在不同阶段执行不同的发送策略,持续跟踪 BtlBW 和 RTprop 的变化。
┌─────────────────────────────────────────┐
│ │
▼ │
┌──────────┐ ┌─────────┐ │
│ STARTUP │ ──► │ DRAIN │ │
└──────────┘ └─────────┘ │
│ │ │
│ ▼ │
│ ┌──────────┐ │
└────────────► │ PROBE_BW │ ◄───────┐ │
└──────────┘ │ │
│ │ │
▼ │ │
┌──────────┐ │ │
│PROBE_RTT │ ────────┘ │
└──────────┘ │
│ │
└─────────────────────┘
1. STARTUP(启动阶段)
-
目标:快速探测到瓶颈带宽。
-
行为 :每个 RTT 内发送速率翻倍(实际使用增益
gain = 2.77),直到带宽不再增长。 -
退出条件:连续三次带宽增长 < 25%,即认为已接近带宽上限。
2. DRAIN(排空阶段)
-
目标:将启动阶段在缓冲区中累积的排队数据全部排空。
-
行为:发送速率降低,让飞行中的数据量降至 BDP 附近。
-
触发:自动跟随 STARTUP,一旦启动完成即进入排空。
3. PROBE_BW(带宽探测阶段)------ 主要运行状态
-
目标:在稳定运行中持续探测带宽是否增加。
-
行为:以 8 个相位为一个周期(8-phase cycle):
-
前 6 个相位使用
gain = 1.25(超速探测),尝试提升速率; -
中间 1 个相位使用
gain = 0.75(减速排空); -
最后 1 个相位使用
gain = 1.0(平稳发送)。
-
-
当超速探测时若检测到 RTT 增加(出现队列),会立即进入排空,确保延迟不失控。
4. PROBE_RTT(延迟探测阶段)
-
目标:重新测量最小 RTT,避免 RTprop 被长期排队数据"污染"。
-
触发条件:超过 10 秒未刷新 RTprop。
-
行为:将飞行中的数据量强制降至 4 个 MSS(约 4 KB),持续约 200ms,在此期间收集新的最小 RTT。
-
退出:RTprop 更新后,根据当前带宽状态返回 STARTUP(如果带宽未满载)或 PROBE_BW(如果已满载)。
三、发送控制:两个核心机制
BBR 不依赖于 ACK 中的显式拥塞信号,而是通过两个独立参数控制发送:
-
发送速率(pacing rate)
pacing_rate = gain × BtlBW其中
gain由当前状态决定(如 STARTUP 为 2.77,PROBE_BW 为 1.25/0.75/1.0)。采用精确的 pacing 机制,使数据平滑发出,避免突发加剧队列。
-
飞行中数据量(cwnd)
cwnd = gain × BDP,其中 BDP = BtlBW × RTprop。飞行数据量被严格限制,防止过量数据进入网络形成长期队列。
四、BBRv1 的优势
| 优势 | 说明 |
|---|---|
| 高吞吐 | 不依赖丢包回退,在丢包率较高(如无线网络)时仍能保持高带宽利用率 |
| 低延迟 | 主动将队列长度维持在接近零,排队延迟极低 |
| 快速收敛 | STARTUP 阶段指数增长,比传统 AIMD 快几个数量级 |
| 抗随机丢包 | 丢包不触发降速,适合无线/移动网络 |
五、BBRv1 的缺陷
| 缺陷 | 表现 |
|---|---|
| 与 TCP 共存不公平 | 在共享瓶颈链路时,BBRv1 会侵占 CUBIC/Reno 流的带宽,导致对方饥饿 |
| 浅缓冲区下高重传 | 在小缓冲区网络(如部分家用路由器、移动基站)中,BBRv1 的探测机制极易填满缓冲区,引发大量丢包和重传,浪费带宽 |
| RTT 不公平 | 短 RTT 流在竞争时会获得更高带宽,长 RTT 流被压制 |
| 缺乏丢包回退 | 在存在真正拥塞(而非误码)时,BBRv1 不主动退让,可能加剧拥塞 |
| 对 ECN 利用不充分 | 未原生设计利用 ECN 信号来早期拥塞感知 |