TCP 吞吐量

使用 Mathis 公式计算理论 TCP 吞吐量

如何使用TCP 吞吐量

  1. 1输入 RTT(往返时间)和丢包率。
  2. 2输入 MSS(最大段大小,通常 1460 字节)。
  3. 3读取该路径可维持的最大 TCP 吞吐率。

TCP 吞吐率(Mathis 公式)

吞吐率 ≤ (MSS / RTT) × C / √(丢包率),C ≈ 0.93

Mathis 公式刻画了受丢包和往返时间制约的 TCP 连接吞吐上限。

即便极小丢包(如 0.1%)也会在长 RTT 链路上大幅压低吞吐,这正是高丢包卫星/WAN 链路感觉慢的原因。

TCP 吞吐量有个硬上限:**吞吐 ≤ 窗口大小 ÷ RTT**。这是滑动窗口协议的根本约束——窗口内的数据发出去后必须等确认(ACK)回来才能继续发,一个 RTT 内最多只能发「一个窗口」的数据。所以即使带宽是 1 Gbps,如果窗口只有 64 KB 而 RTT 是 200 ms,吞吐量就被限制在 64 KB ÷ 0.2 s = 2.6 Mbps。**这叫「长肥管道」问题(Long Fat Network)。**

解决办法是**开启 TCP 窗口缩放(Window Scaling,RFC 7323)**:在三次握手时协商一个缩放因子,把窗口从最大 64 KB 扩展到最大 1 GB。现代操作系统(Windows Vista+、Linux 2.6.8+、macOS)默认都开启了。所以现在跑不满带宽通常是别的原因:接收方应用读取慢导致窗口通告变小、中间设备缓冲不足、或者丢包率过高(**哪怕 0.1% 的丢包也能让 TCP 吞吐骤降**)。

RTT默认窗口 64 KB窗口 256 KB窗口 1 MB需要窗口(跑满 1 Gbps)
1 ms(同机房)512 Mbps2 Gbps8 Gbps125 KB
10 ms(同城)52 Mbps210 Mbps838 Mbps1.25 MB
50 ms(跨省)10.5 Mbps42 Mbps168 Mbps6.25 MB
200 ms(中美)2.6 Mbps10.5 Mbps42 Mbps25 MB
300 ms(卫星)1.7 Mbps7 Mbps28 Mbps37.5 MB

TCP 窗口大小决定的最大吞吐量(不同 RTT)

常见问题

为什么 1% 丢包影响这么大?

吞吐率随 1/√丢包率 变化,1% 丢包可把容量压到无丢包时的约 10%。

增大窗口有用吗?

只到 BDP 为止;无论窗口多大,丢包仍会封顶 Mathis 上限。

如何改善?

降低 RTT 或丢包(更优路径、FEC、BBR 等 TCP 变体),而非只加带宽。

为什么丢包对 TCP 影响这么大?

因为 TCP 把丢包当作**拥塞信号**,一旦检测到就大幅降速(Reno 算法直接把窗口减半),然后线性增长试探。数学上吞吐量大致与 1/√丢包率 成反比:丢包率 0.01% 时还能跑到接近满速,0.1% 时只剩约 30%,1% 时只剩约 10%。所以长距离链路对丢包极其敏感,这也是为什么 BBR、QUIC 等新拥塞算法改用「带宽时延探测」而非「丢包」来判断拥塞。

BDP 是什么?怎么算?

BDP(Bandwidth-Delay Product,带宽时延乘积)= 带宽 × RTT,表示「管道里正在飞行的数据量」。要让链路跑满,TCP 窗口至少要等于 BDP。例如 1 Gbps、RTT 50 ms:BDP = 10⁹ × 0.05 ÷ 8 = 6.25 MB。如果窗口小于这个值,链路就会空闲等待确认,带宽浪费。这个概念对调优跨国专线、卫星链路、广域网加速非常关键。

更多工具