ArcLibrary

TCP 拥塞控制

TCP 怎么自动避免「全网堵车」 —— 慢启动、AIMD、BBR 的核心思想。

TCP拥塞控制BBR
核心 · Key Idea

一句话:TCP 通过观察丢包RTT 变化自动估计「网络此刻能吃多大流量」,遇堵就减速、看畅就加速。这是为什么互联网上数十亿条 TCP 流能共存的关键。

是什么#

每个 TCP 连接维护一个拥塞窗口(cwnd):本端"敢"未确认地发出去多少字节。

真正能发 = min(对端通告的接收窗口 rwnd, 自己估出来的 cwnd)

经典算法(Reno)四阶段:

  1. 慢启动:cwnd 从 1 起翻倍涨;
  2. 拥塞避免:到阈值 ssthresh 后线性涨;
  3. 快重传:连收 3 个重复 ACK → 立即重传该段;
  4. 快恢复:cwnd 减半,避免回到 1 重新慢启动。

打个比方#

打个比方 · Analogy

你开车上高速:

  • 慢启动:起步先慢,看路况再加速;
  • 拥塞避免:进入巡航后线性提,谨慎;
  • 遇堵车(丢包):立即踩刹车减速一半;
  • 拥堵严重直到完全停(RTO 超时):从最低速重新加速(回到慢启动)。

关键概念#

cwndCongestion Window
本端基于网络状况估计的发送窗口。
ssthreshSlow Start Threshold
慢启动 → 拥塞避免的转折点。
AIMDAdditive Increase / Multiplicative Decrease
线性涨,乘性减 —— Reno 的核心。
CubicCubic
Linux 默认。涨得更激进,长肥管道更友好。
BBRBottleneck Bandwidth and RTT
Google 提出的新算法,**不等丢包**,主动测带宽 + 最小 RTT。在丢包乱跳的网络上极强。
RTORetransmission Timeout
超时仍未 ACK 就重传,cwnd 重新回到 1。

怎么工作#

BBR 完全跳出这个图:它持续估计瓶颈带宽和最小 RTT,把发送速率控制在 BDP 附近。

实操要点#

  • Linux 看当前算法sysctl net.ipv4.tcp_congestion_control,多数发行版默认 cubic

  • 切换 BBR

    modprobe tcp_bbr
    sysctl -w net.ipv4.tcp_congestion_control=bbr
  • 跨国 / 跨洲 / 弱网:BBR 通常比 Cubic 快几倍(丢包不等于拥塞,跨洋链路常因物理噪声丢包)。

  • 数据中心内:DCTCP / Cubic 都行,BBR 收益不明显甚至更糟(极低 RTT)。

  • CDN 节点优先开 BBR:客户端到边缘的弱网场景受益最大。

易混点#

拥塞控制 cwnd
防止**网络**被自己打爆。
本端基于丢包 / RTT 自估。
流量控制 rwnd
防止**接收方**被打爆。
对端在每个 ACK 里通告。

延伸阅读#