公网打流:会出现几秒带宽为0:(WAN 深度抖动)

3 阅读2分钟

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 路径自身的抖动事件】