WAN 深度抖动导致带宽归零的完整链路
1. 触发条件:单次突发丢包
WAN 路径上某个中间路由器队列瞬时满载,尾部丢弃(Tail Drop)或 RED/ECN 触发,一批连续序号的包丢失:
发送端 WAN 路由器 接收端
│ seq 1000~1200 ──────────────────────────▶ │
│ seq 1201~1400 ──────▶ [队列满,drop] ✗ │
│ seq 1401~1600 ──────────────────────────▶ │
接收端收到 1401+ 后,向发送端回 3 个重复 ACK(DUPACK),触发快速重传。
但如果丢包窗口极大(整个 in-flight 的包都丢了),接收端什么都没收到,ACK 停止前进。
2. RTO 计时器启动
发送端 CWND = 400 个包(全部 in-flight)
│
│ 丢包发生在 WAN,接收端 buffer 也全部丢弃
│
▼
发送端等待 ACK,超过 RTO 时间(通常 1-3 秒)无响应
│
▼
触发超时重传(RTO Timeout)
RTO 的值由 RTT × 2^backoff_count 指数退避计算,初始约 1-3s,每次超时后翻倍:
| 第几次 RTO | 等待时间 |
|---|---|
| 第 1 次 | ~1s |
| 第 2 次 | ~2s |
| 第 3 次 | ~4s |
| 第 4 次 | ~8s |
3. CWND 重置到 1,慢启动重新爬升
RTO 触发后:
CWND = 1 MSS(约 1.4KB)
ssthresh = CWND_before / 2
慢启动阶段(每 RTT 翻倍):
RTT=30ms → 1, 2, 4, 8, 16, 32 ... MSS
到达 ssthresh 后进入拥塞避免(线性增长)
从 1 MSS 爬到 400 MSS 需要约 8-10 秒
这就是 iperf3 输出里看到的:归零 → 数秒 0 bits → 缓慢爬升 → 重新达到 200+ Mbps 的完整周期。
4. 为什么 iperf3 显示 0 Bytes/s 而不是低速?
iperf3 以 1 秒为统计窗口。在 RTO 超时等待期间:
- 发送端停止发新包(等 ACK)
- 接收端无新数据到达
- 整个 1 秒窗口内传输量 = 0 → 显示
0.00 Bytes
5. 本地 tc 无法解决的原因
本地 tc police
│ 只能控制【出方向】的发包速率
│ 对 WAN 中间节点的队列状态无感知
▼
WAN 路由器队列满
│ 发生在本地 tc 管控范围之外
│ 本地 tc 无论设多小的 burst,
│ 只要 WAN 路径本身丢包,RTO 就必然发生
▼
结论:tc 调优只能减少【触发 WAN buffer bloat 的概率】
无法消除【WAN 路径自身的抖动事件】