综合抗弱网策略

概述

实时通信中的网络问题从来不是单一的——丢包、抖动、延迟、带宽不足往往同时出现。单独使用 FEC、NACK 或 Jitter Buffer 都不够,需要多种机制**协同工作**才能在弱网环境下维持可接受的通话质量。

本节讨论如何将前面章节介绍的各种 QoS 技术组合成一个完整的抗弱网策略。

抗弱网技术栈

        flowchart TD
  subgraph 发送端
    A[编码器] --> B[码率自适应<br/>根据 CC 调整]
    B --> C[FEC 编码<br/>冗余保护]
    C --> D[Pacer<br/>平滑发送]
  end

  subgraph 网络
    D --> E[丢包/抖动/延迟]
  end

  subgraph 接收端
    E --> F[NACK<br/>请求重传]
    E --> G[FEC 解码<br/>恢复丢包]
    F --> H[Jitter Buffer<br/>吸收抖动]
    G --> H
    H --> I[PLC<br/>丢包隐藏]
    I --> J[解码器]
    J --> K[播放]
  end

  subgraph 反馈环路
    F -.->|NACK| D
    H -.->|RTCP RR/REMB/TWCC| A
  end
    

各层防线

层级

技术

作用

延迟代价

带宽代价

1

码率自适应

避免拥塞

降低码率

2

FEC

前向恢复丢包

无额外延迟

10-100% 冗余

3

NACK/RTX

重传恢复丢包

+1 RTT

重传包

4

Jitter Buffer

吸收抖动

+40-200ms

5

PLC

隐藏残余丢包

FEC 与 NACK 的配合

FEC 和 NACK 不是互斥的,而是互补的:

场景分析:

低延迟 + 低丢包(RTT < 100ms, loss < 5%):
  → NACK 为主,FEC 为辅
  → NACK 能在 1 RTT 内恢复,FEC 处理 NACK 来不及的情况

高延迟 + 中丢包(RTT > 200ms, loss 5-15%):
  → FEC 为主,NACK 为辅
  → RTT 太高,NACK 重传可能来不及播放
  → FEC 无额外延迟,更适合

高丢包(loss > 15%):
  → 强 FEC + NACK + 降码率
  → 需要大量冗余,同时降低源码率腾出带宽

突发丢包(burst loss):
  → FEC 效果差(连续丢包可能把 FEC 包也丢了)
  → NACK + 交织(interleaving)更有效

WebRTC 的策略

WebRTC 中音频和视频使用不同的策略:

音频

  • Opus in-band FEC(默认开启)

  • RED 冗余(RFC 2198)

  • NACK 通常不用于音频(延迟敏感)

  • NetEQ PLC 作为最后防线

视频

  • NACK/RTX 为主(视频帧大,FEC 开销高)

  • FlexFEC 或 ULP-FEC 保护关键帧

  • PLI/FIR 请求新关键帧

  • 冻结最后一帧作为 PLC

码率自适应策略

拥塞控制(GCC/REMB/TWCC)估计可用带宽后,编码器需要决定如何分配:

可用带宽 = 估计带宽 × 安全系数(0.85-0.95)

分配优先级:
1. 音频编码(固定,如 32 kbps)
2. 视频 FEC(根据丢包率动态调整)
3. 视频编码(剩余带宽)

视频码率 = 可用带宽 - 音频码率 - FEC 开销

FEC 冗余率根据丢包率调整:
- 丢包 < 2%:  FEC = 0%(关闭)
- 丢包 2-5%:  FEC = 10-20%
- 丢包 5-10%: FEC = 20-50%
- 丢包 > 10%: FEC = 50-100%

降级策略

当带宽严重不足时,按优先级降级:

1. 降低视频分辨率(1080p → 720p → 480p → 360p)
2. 降低视频帧率(30fps → 15fps → 7fps)
3. 关闭视频,只保留音频
4. 降低音频码率(32kbps → 16kbps → 8kbps)
5. 切换到窄带模式

Jitter Buffer 与 FEC/NACK 的联动

Jitter Buffer 的目标延迟需要考虑 NACK 重传的时间:

如果启用 NACK:
  JB 目标延迟 >= RTT + 处理时间
  这样 NACK 重传的包有机会在播放前到达

如果只用 FEC:
  JB 目标延迟 = 抖动估计值
  不需要额外等待重传

实际中:
  JB 目标延迟 = max(抖动估计, NACK 等待时间)

弱网场景实战

场景 1:WiFi 环境(抖动大,偶发丢包)

特征:RTT 20-50ms, 丢包 1-5%, 抖动 20-100ms
策略:
- 音频:Opus FEC 开启,JB 自适应(60-150ms)
- 视频:NACK 为主,关键帧 FEC 保护
- CC:TWCC,快速响应带宽变化

场景 2:4G 移动网络(延迟中等,丢包波动)

特征:RTT 50-150ms, 丢包 2-10%, 抖动 30-150ms
策略:
- 音频:Opus FEC + RED 双重保护
- 视频:FEC + NACK 混合,FEC 比重增加
- CC:GCC,保守估计带宽
- 降级:准备降分辨率和帧率

场景 3:跨国通话(高延迟)

特征:RTT 200-400ms, 丢包 1-3%, 抖动 50-200ms
策略:
- 音频:Opus FEC 为主(NACK 来不及)
- 视频:FEC 为主,NACK 仅用于关键帧
- JB:较大的目标延迟(200-300ms)
- CC:保守模式,避免过度探测

场景 4:极端弱网(高丢包 + 高抖动)

特征:RTT 100-300ms, 丢包 15-30%, 抖动 100-500ms
策略:
- 关闭视频,只保留音频
- 音频:Opus 8kbps + 强 FEC(100% 冗余)
- JB:大缓冲(300-500ms),接受高延迟
- PLC:频繁触发,质量下降但保持连通

监控指标

综合抗弱网策略需要监控以下指标:

指标

含义

告警阈值

RTT

往返延迟

> 300ms

Packet Loss Rate

丢包率

> 5%

Jitter

网络抖动

> 50ms

FEC Recovery Rate

FEC 恢复成功率

< 80%

NACK Rate

NACK 请求频率

> 10 次/秒

PLC Rate

PLC 触发率

> 3%

JB Delay

Jitter Buffer 延迟

> 200ms

Encode Bitrate

编码码率

持续低于最低可用值

Frame Drop Rate

视频丢帧率

> 5%

小结

抗弱网不是单一技术能解决的问题,而是一个**系统工程**:

  1. 预防:码率自适应避免拥塞

  2. 冗余:FEC 提前准备恢复数据

  3. 补救:NACK 重传丢失的包

  4. 缓冲:Jitter Buffer 吸收抖动

  5. 兜底:PLC 隐藏无法恢复的丢包

这五层防线需要协同工作,根据网络状况动态调整各自的参数。好的实时通信系统,就是在延迟、质量和可靠性之间找到最佳平衡点。