实时媒体不能无限等待迟到报文。抖动缓冲增大时,更多报文可能赶上播放期限,交互等待也随之增加。NAT 穿越解决的是双方怎样找到可用路径,不会替应用决定该等多久或怎样处理丢帧。

第 13 篇说明 UDP 交付边界,第 21 篇讨论名字解析,第 31 篇讨论 NAT。本篇用固定 RTP 到达轨迹比较两种播放延迟,并区分 ICE、STUN 和 TURN。

RTP 提供序号与媒体时间线

RTP(Real-time Transport Protocol)报头包含序号和时间戳。序号帮助接收端检测丢失与恢复顺序,时间戳表示媒体采样时间,二者用途不同。序号连续也不等于按时到达,时间戳也不是可直接与本机墙钟相减的全球时间。

RTCP 可以携带接收报告、丢包和抖动等控制信息。RFC 3550 的 interarrival jitter 是传输时间差变化的统计估计,不等同于抖动缓冲长度,也不直接等于某个报文的播放延迟。

实时应用通常在截止时间前等待乱序或抖动报文。截止时间后才到达的媒体即使网络最终交付,也可能对当前播放无用。恢复、隐藏、重传和前向纠错策略取决于媒体类型与时延预算。

模式提炼:可靠交付与按时交付分开计数

网络收到报文 ≠ 报文赶上播放期限 ≠ 用户看到连续画面

实验至少要记录发送时间、到达时间、播放期限和最终渲染决定。只看 UDP 丢包计数会漏掉迟到丢弃。

抖动缓冲交换延迟与迟到率

固定轨迹含 10 个每 20 ms 生成的媒体包,网络延迟从 25 ms 到 150 ms 不等。播放期限定义为 发送时间 + 缓冲长度,只用于静态比较。

40 ms 缓冲使低延迟包较快播放,但延迟超过 40 ms 的包被判为迟到。80 ms 缓冲容纳更多波动,却让所有按时包至少等待更长的计划播放延迟。150 ms 的异常包在两种配置中都迟到。

这个模型假设发送端和接收端时间线已经对齐,没有解码、时钟漂移、自适应缓冲、丢包恢复或帧依赖。它只能证明固定轨迹里的取舍,不能给真实通话推荐一个通用毫秒数。

ICE、STUN 与 TURN 各自负责什么

STUN 让端点向服务器询问外部观察到的传输地址,并执行连通性检查所需的协议操作。获得 server-reflexive 地址不表示任意对端都能直连,NAT 映射和过滤行为仍会影响结果。

TURN 在服务器上分配中继地址。当直接候选不可用时,媒体可经中继转发,代价是额外路径、带宽和运维状态。TURN 不是只返回公网地址的 STUN 别名。

ICE 收集 host、server-reflexive、relayed 等候选,配对并执行连通性检查,最后提名可用候选对。ICE 是协调框架,STUN 是检查和地址发现协议,TURN 提供中继。路径可用也不等于媒体已加密,SRTP 等安全机制需另行验证。

固定到达轨迹验证

jitter_buffer.py 读取发送与到达时间,分别按 40 ms 和 80 ms 截止时间计算按时与迟到报文。

1
2
python3 source/_posts/2026-09-24-计算机网络E07-实时音视频与NAT穿越/jitter_buffer.py --help
python3 source/_posts/2026-09-24-计算机网络E07-实时音视频与NAT穿越/jitter_buffer.py

素材包括固定到达轨迹、缓冲计算脚本、对照结果、资料与运行记录和审阅记录。

条件、限制和反例

更大缓冲不一定减少可见卡顿。关键帧依赖、解码负载和连续丢包可能让已经按时到达的后续包也无法渲染。

TURN 中继不必然比直连差。某些网络中的直连路径可能不稳定,而中继路径更可预测;必须在相同时间窗口和媒体负载下测量。

STUN 成功不证明 ICE 必然选择该候选。候选优先级、检查结果、角色冲突和网络策略都会影响提名。

练习

练习一:把缓冲从 40 ms 增加到 80 ms,依据素材轨迹列出哪些包从迟到变为按时,并计算代价是什么。

练习二:画出 host、server-reflexive 和 relayed 三类候选的路径,说明 STUN 响应成功但直连失败时 TURN 能增加什么能力。

模式速查表

机制 输入/状态 主要输出
RTP 媒体包、序号、时间戳 媒体传输标识与顺序线索
抖动缓冲 到达时间与播放期限 等待或迟到丢弃决定
STUN 服务器观察与连通性检查 映射地址和检查响应
TURN 中继分配 可经服务器转发的候选
ICE 多类候选与检查结果 被提名的候选对

官方一手参考资料

验证边界

已验证:Python 3 标准库对固定媒体到达轨迹比较 40 ms 与 80 ms 抖动缓冲的按时/迟到结果,验证类型为 HAND_CALC。

NOT_RUN:未建立真实 RTP/RTCP 会话、编解码器、ICE agent、STUN/TURN 服务或 NAT 环境,未测端到端时延、丢帧、画质和中继性能。