计算机网络 E07:实时音视频、RTP、抖动缓冲与 NAT 穿越
实时媒体不能无限等待迟到报文。抖动缓冲增大时,更多报文可能赶上播放期限,交互等待也随之增加。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 | |
素材包括固定到达轨迹、缓冲计算脚本、对照结果、资料与运行记录和审阅记录。
条件、限制和反例
更大缓冲不一定减少可见卡顿。关键帧依赖、解码负载和连续丢包可能让已经按时到达的后续包也无法渲染。
TURN 中继不必然比直连差。某些网络中的直连路径可能不稳定,而中继路径更可预测;必须在相同时间窗口和媒体负载下测量。
STUN 成功不证明 ICE 必然选择该候选。候选优先级、检查结果、角色冲突和网络策略都会影响提名。
练习
练习一:把缓冲从 40 ms 增加到 80 ms,依据素材轨迹列出哪些包从迟到变为按时,并计算代价是什么。
练习二:画出 host、server-reflexive 和 relayed 三类候选的路径,说明 STUN 响应成功但直连失败时 TURN 能增加什么能力。
模式速查表
| 机制 | 输入/状态 | 主要输出 |
|---|---|---|
| RTP | 媒体包、序号、时间戳 | 媒体传输标识与顺序线索 |
| 抖动缓冲 | 到达时间与播放期限 | 等待或迟到丢弃决定 |
| STUN | 服务器观察与连通性检查 | 映射地址和检查响应 |
| TURN | 中继分配 | 可经服务器转发的候选 |
| ICE | 多类候选与检查结果 | 被提名的候选对 |
官方一手参考资料
- RFC 3550:RTP: A Transport Protocol for Real-Time Applications,IETF,2003-07,访问于 2026-09-24。
- RFC 8445:Interactive Connectivity Establishment,IETF,2018-07,访问于 2026-09-24。
- RFC 8489:Session Traversal Utilities for NAT,IETF,2020-02,访问于 2026-09-24。
- RFC 8656:Traversal Using Relays around NAT,IETF,2020-02,访问于 2026-09-24。
验证边界
已验证:Python 3 标准库对固定媒体到达轨迹比较 40 ms 与 80 ms 抖动缓冲的按时/迟到结果,验证类型为 HAND_CALC。
NOT_RUN:未建立真实 RTP/RTCP 会话、编解码器、ICE agent、STUN/TURN 服务或 NAT 环境,未测端到端时延、丢帧、画质和中继性能。





