一句话总结:
选择 RTP 打包方式时,根据 NALU 是否超过 MTU(如1500字节)来决定,就像寄快递时判断包裹是否超重——小包裹直接发,大包裹拆箱分装,避免被快递公司拒收或额外收费!
一、MTU 是什么?为什么是 1500 字节?
-
MTU(最大传输单元) :网络链路层一次能传输的最大数据包大小。
-
以太网默认 MTU=1500 字节:这是历史遗留标准(早期网络设备内存限制),沿用至今。
-
超过 MTU 的后果:
- 路由器强制分片:拆成多个小包,但分片丢失一个,整个包失效(像快递拆箱后丢件)。
- 传输效率下降:分片重组消耗计算资源,增加延迟。
-
二、视频 NALU 的 RTP 打包策略
1. 小 NALU(≤1500字节)→ 直接装一个 RTP 包
-
模式:Single NAL Unit 模式。
-
结构:
[RTP头 | NALU头 | NALU数据] -
优点:简单高效,无需额外分片头。
2. 大 NALU(>1500字节)→ 必须拆成多个 RTP 包
-
模式:Fragmentation Unit (FU-A) 模式。
-
结构:
包1:[RTP头 | FU指示头 | FU分片头(S=1) | 分片1数据] 包2:[RTP头 | FU指示头 | FU分片头(S=0) | 分片2数据] 包N:[RTP头 | FU指示头 | FU分片头(E=1) | 分片N数据]- S(Start) :标记分片起始包。
- E(End) :标记分片结束包。
-
优点:避免网络层分片,自主控制分片逻辑,提高可靠性。
三、为什么必须根据 MTU 选择打包方式?
| 场景 | 直接发送大 NALU | 分片发送(FU-A) |
|---|---|---|
| 路由器处理 | 强制拆片,重组失败则全丢 | 应用层自主分片,标记清晰易重组 |
| 传输效率 | 分片开销大,延迟高 | 分片头仅3字节,效率更高 |
| 抗丢包能力 | 任意分片丢失导致整个 NALU 失效 | 可配合重传或纠错码保护关键分片 |
| 兼容性 | 某些防火墙/NAT 设备会丢弃分片包 | 统一封装,穿透性更好 |
四、实战示例:H.264 关键帧分片
假设一个 IDR 帧的 NALU 大小为 3000 字节:
-
拆包:
- 分片1:RTP头 + FU头 + 分片头(S=1) + 数据(1400字节)
- 分片2:RTP头 + FU头 + 分片头(S=0) + 数据(1400字节)
- 分片3:RTP头 + FU头 + 分片头(E=1) + 数据(200字节)
-
传输:
- 三个包分别发送,接收方根据序号和 S/E 标记重组。
五、扩展:MTU 不总是 1500!
-
实际网络中的 MTU 可能更小:
- VPN/隧道封装:额外头部占用,有效 MTU 可能减至 1400 字节。
- Wi-Fi/4G:MTU 通常仍为 1500,但需预留协议开销(如 IPsec)。
-
自适应策略:
- 动态探测路径 MTU(如 ICMP 探测)。
- 保守预设分片阈值(如默认按 1400 字节分片)。
六、总结口诀
“NALU大小比MTU,超了必须拆箱走。
直接发包会被拆,分片自主更可控。
FU-A模式标始终,抗丢保序穿透强。
视频传输无脑记,RTP打包稳如狗!”