首页/网络/协议速查/BBR 原理与落地要点
TCP 与 UDP54 条

BBR 原理与落地要点

BBR 不在丢包时才降速,而是持续估计瓶颈带宽与最小 RTT,按「带宽×时延」控制发送节奏,高丢包链路上吞吐明显优于 CUBIC。

协议速查网络更新于 2026-10-13

BBR 与基于丢包的算法有何不同

传统算法(CUBIC 等)把丢包当成拥塞信号,一旦丢包就大幅降速;在跨境链路或无线链路上,丢包未必来自拥塞,于是吞吐被白白压掉。BBR 改为持续估计瓶颈带宽与最小 RTT,按「带宽 × 时延」控制发送节奏,因此在高丢包链路上通常能明显提升吞吐,代价是队列延迟的行为不同。

基本信息

适用平台Linux(内核 4.9 起内置 bbr v1,新内核有实验性 bbr2)
发送队列需搭配 fq 或 fq_codel 之类的排队规则做 pacing
依赖条件准确的时间戳;虚拟化环境下时钟源异常会影响估计
配置项net.ipv4.tcp_congestion_control 与 net.core.default_qdisc
查看sysctl net.ipv4.tcp_congestion_control;ss -ti 可看单连接的拥塞算法

BBR 状态机

阶段作用观察点
STARTUP快速探测带宽上限类似慢启动,呈指数增长
DRAIN排空上行造成的队列吞吐短暂回落属正常
PROBE_BW周期性微增试探带宽长期稳定阶段,占绝大部分时间
PROBE_RTT定期压低在途数据量测最小 RTT会造成轻微吞吐抖动

启用与验证

启用与验证
modprobe tcp_bbr
cat >/etc/sysctl.d/99-bbr.conf <<'EOF'
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
EOF
sysctl --system
sysctl net.ipv4.tcp_congestion_control net.core.default_qdisc   # 核对是否生效
ss -ti | head -3   # 输出的 cubic/bbr 字段显示单连接实际使用的算法
BBR 与丢包型限速设备(令牌桶)交互可能产生较高队列延迟:BBR 会持续试探带宽,遇到整形链路时容易把队列填满,跨境与专线场景需要实测对比。
BBR 无法突破链路本身的瓶颈,也不能替代带宽扩容:它减少的是「因随机丢包而误降速」的损失,物理带宽与路由质量问题依然要靠链路侧解决。
切换前后要用相同条件对比:同一目标、同一时段、同样的并发与文件大小,并同时看吞吐与 P99 延迟;只对比平均值会把排队延迟带来的副作用掩盖掉。
验证是否真的生效要看单连接而非全局配置:ss -ti 输出里的拥塞算法字段反映每条连接实际使用的算法,只有那里显示 bbr 才算落地。

易错点

  • 开了 BBR 但忘记设 default_qdisc=fq:缺少 pacing 支持,效果大打折扣,两者必须配套使用
  • 只在应用容器里开,宿主机或对端仍是旧算法:效果只体现在一侧,往往以为「BBR 没用」
  • 把 BBR 用在必须低延迟的场景却不做 A/B:BBR 追求吞吐时的排队行为可能抬高 P99,实时业务要单独评估
  • 直接沿用网上配置不去验证:老内核参数名与模块名不同,需用 sysctl 与 ss -ti 实测确认算法已生效

数据来源与参考

  • Google BBR 论文
  • Linux 内核文档 net.ipv4.tcp_congestion_control

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌