Google BBR (Bottleneck Bandwidth and Round-trip propagation time) 重新定義 TCP 擁塞控制:不依賴丟包訊號,而是直接測量瓶頸頻寬與最小 RTT,構建精確管道模型。本文深度解析 BBR 核心四大「變速引擎」:Startup、Drain、ProbeBW、ProbeRTT,揭示其如何在不依賴丟包的前提下實現高頻寬利用與低延遲。
BBR 持續採樣連線內時間窗口內的:
以 BDP = max_bw × min_rtt 為客觀管道容量基準。發送速率 = gain × BDP,增益因子 gain 由四大引擎動態調整。
gain = 2/ln(2) ≈ 2.89 (高增益)gain 指數增長,直到連續 3 個 RTT max_bw 不再增長 (增長 < 25%)Draingain = 1/2.89 ≈ 0.35 (低增益,發送量 < BDP)min_rttin-flight ≤ BDP → 進入 ProbeBW[5/4, 3/4, 1, 1, 1, 1, 1, 1] (即 [1.25, 0.75, 1, 1, 1, 1, 1, 1])max_bw 更新 → 頻寬變大max_bw 自然老化 (10 秒滑動窗口) 自動適應min_rtt 可能過時 (路由變化、佇列管理改變)min_rttgain = 0.5 持續 ≥ 200ms (或 1 個 RTT),發送量僅 BDP/2,強制清空瓶頸佇列min_rtt → 回 ProbeBW| 特性 | 傳統 (CUBIC) | BBR |
|---|---|---|
| 擁塞訊號 | 丟包 / ECN | 模型驅動 (max_bw, min_rtt) |
| 核心介管 | 丟包時核心接管降窗 | 演算法全權控制 cwnd/pacing_rate |
| 頻寬利用 | 震盪於 BDP 附近 | 穩定維持 ≈ BDP |
| 延遲表現 | 佇列堆積高延遲 | 主動排空佇列,維持 min_rtt |
| 公平性 | 對丟包敏感流不公平 | 對丟包不敏感,友善共存 |
BBR 實作 cong_control 回呼,核心 tcp_cong_control() 發現演算法註冊此回呼時,完全放手,不再執行傳統 tcp_cwnd_reduction/tcp_cong_avoid 邏輯。這是 BBR 能夠自主控制的制度基礎。