TCP 吞吐跑不满? 一条公式帮你看透本质

  • A+
所属分类:计算机网络
TCP 吞吐跑不满? 一条公式帮你看透本质
TCP吞吐跑不满?一条公式帮你看透本质
网络工程 · 实战排障

TCP 吞吐跑不满?
一条公式帮你看透本质

Mathis 公式实战解析 · 苏州↔香港 5G 专线实测数据

带宽明明够,TCP 就是跑不满——

10G 链路,只能跑到 3~5G

iperf3 多线程也上不去

设备没限速,CPU 也不高

遇到这种情况,第一反应往往是:光模块问题?网卡瓶颈?运营商限速?

大多数时候,答案只有一个:丢包 + 时延,决定了 TCP 的上限。而这个上限,可以用一个经典公式直接算出来。

一、Mathis 公式是什么?

Mathis 公式由 Matt Mathis 等人于 1997 年提出,用于估算 TCP 在有丢包情况下的最大吞吐量。

Mathis Formula · 工程常用形式

Throughput ≤ 1.22 × MSS ÷ ( RTT × √p )
参数含义典型值
MSSTCP 最大报文段大小1400~1460 字节
RTT往返时延秒(ms ÷ 1000)
p丢包率0~1(0.005 = 0.5%)

1.22 是经验修正系数,来自 AIMD 拥塞控制模型的稳态推导。公式给出了一条天花板——无论带宽多大,只要 RTT 和丢包率确定,单条 TCP 流的吞吐就被限死了。


二、公式到底说明了什么?

把公式化简到最直觉的形式:

核心结论

吞吐 ≈ 1 ÷ ( RTT × √丢包率 )
  • RTT 越大,吞吐越低——延迟是线性打击
  • 丢包越高,吞吐急剧下降——注意是平方根关系,影响远比你想象中大
丢包不是线性影响,而是开根号级别打击。0.1% 的丢包,足以让高带宽 TCP 性能腰斩。

三、实战案例分析

这次来看一条真实的链路:苏州核心节点 ↔ 香港节点,5 Gbps 专线,初次测试时带宽只有几十 Mbps,完全跑不起来。

# 链路参数
RTT    = 31 ms    # 苏州↔香港实测
MSS    = 1400 B
假设丢包 = 0.5%   # 光衰导致 CRC 错包

代入 Mathis 公式:

代入计算

(1400×8) ÷ (0.031 × √0.005) ≈ 5~6 Gbps
即使是 10G 链路、无任何限速、多线程压测,只要存在 0.5% 的丢包加上 RTT=31ms,TCP 的理论上限就只有 5~6 Gbps。网络本身已经决定了上限,和设备无关。

排查修复跳纤光衰故障后,使用 iperf3 跑 8 并发流,实测结果:

5.28 Gbps
正向(苏州→香港)
重传 0 次
5.29 Gbps
反向(香港→苏州)
重传 414 次

8 条并发流速率分布极为均匀,正向 651~667 Mbps,反向 655~667 Mbps,极差仅十几 Mbps。双向均已超过 5G 标称带宽,链路达标。

各流速率分布(正向,Mbps)

流 5
661
流 7
666
流 9
651
流 11
667
流 13
651
流 15
666
流 17
651
流 19
667

8 条流速率极差仅 16 Mbps,ECMP 调度均衡,无单流独占


四、为什么 TCP 会这样?

这是由 TCP 的 AIMD 拥塞控制机制决定的:加性增加(Additive Increase)+ 乘性减少(Multiplicative Decrease)。

  • 一旦检测到丢包,拥塞窗口直接减半(乘性下降)。这是 CUBIC 和 Reno 的经典行为。
  • 减半之后,每个 RTT 只增加一点(加性增长)。RTT=31ms 意味着每 31ms 才能涨一步,遇上频繁丢包就陷入"涨一点,砍一半"的反复循环。
  • 最终形成一个由 RTT 和丢包率共同锁定的稳态吞吐上限——正是 Mathis 公式描述的状态。

这个过程用波形图来看就是著名的"锯齿形":窗口缓慢爬升,丢包一瞬间砍半,再爬升,再砍半……如此反复,最终稳定在一个远低于链路带宽的水平。


五、另一个杀手:BDP 窗口不够

除了丢包,还有一个隐形杀手:带宽延迟积(BDP)

TCP 窗口限制

吞吐 ≈ 窗口大小 ÷ RTT

填满 5 Gbps 链路需要的窗口 = 5 Gbps × 0.031s ÷ 8 ≈ 19.4 MB。而 Linux 默认最大 TCP 窗口才 6~16 MB,不够用。这就是为什么单流跑不满,需要 8 并发流来绕开这个限制。

场景RTTBDP(5G链路)单流能否跑满
本地1 ms0.6 MB可以
国内跨城10 ms6.25 MB需调缓冲
苏州↔香港31 ms19.4 MB需多流
跨境100 ms62.5 MB强依赖多流

六、不同丢包率的实际影响

以 RTT=31ms(苏↔港链路)、5G 专线为基准:

丢包率理论吞吐上限对 5G 专线的影响
0% 无限制 达标
0.01% 约 13 Gbps 满足 5G
0.1% 约 4.2 Gbps 5G 勉强
0.5% 约 1.9 Gbps 5G 跑不满
1% 约 1.3 Gbps 严重受限
5% 约 0.6 Gbps 性能崩溃
0.5% 的丢包看起来很小,但在这条链路上理论吞吐只有 1.9 Gbps,5G 专线直接跑不满。这正是本次案例修复前只有几十 Mbps 的根本原因——跳纤光衰产生大量 CRC 错包,引发 TCP 拥塞控制频繁触发。

七、本次案例:修复前后对比

修复前 · 跳纤光衰异常

实测吞吐几十~百 Mbps
稳定性极不稳定
根因CRC 错包

修复后 · 本次实测

正向吞吐5.28 Gbps
反向吞吐5.29 Gbps
重传正向 0 / 反向 414

反向 414 次重传,在 120 秒 × 8 流的跨境测试中完全属于正常量级。主因是 RTT=31ms 下 CUBIC 拥塞窗口爬升偏慢,偶发重传计数。物理层无 CRC 误码,链路质量良好。


八、如何优化?

方向只有两个:

方向一:降低丢包

  • 检查接口 CRC 计数和 input error
  • 测量光模块收发功率和误码率(BER)
  • 排查运营商链路是否存在隐性丢包
  • 检查交换机缓冲区是否有 Microburst 队列溢出

方向二:绕开 TCP 的窗口限制

调大 TCP 缓冲区,覆盖 BDP 需求(建议 ≥ 32 MB):

# /etc/sysctl.conf
net.core.rmem_max     = 67108864
net.core.wmem_max     = 67108864
net.ipv4.tcp_rmem     = 4096 87380 67108864
net.ipv4.tcp_wmem     = 4096 65536 67108864
# 切换 BBR(高 RTT 高带宽场景表现更优)
net.ipv4.tcp_congestion_control = bbr

应用层策略:

  • 多 TCP 并发连接(对应 iperf3 -P 8),多流聚合可接近链路上限
  • 考虑 QUIC 协议或 FEC 前向纠错方案

九、总结

Mathis 公式最大的价值是:在动手优化之前,先算出理论上限。如果实测和理论接近,说明瓶颈就是丢包和 RTT,和带宽无关。

当你再遇到"链路跑不满"、"iperf3 卡住"、"单向速度异常",不用猜光模块,不用猜限速——

先看 RTT 和丢包率,代入 Mathis 公式算一下理论上限,基本八九不离十。

一句话

不是带宽不够,
TCP 被丢包卡死了

  • 微信公众号
  • 扫一扫关注微信公众号
  • weinxin
  • 运维交流群
  • 扫一扫二维码加入群聊
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: