RTP与RTCP
RTP (Real-time Transport Protocol)常用于音频、视频等实时媒体流的传输。在 WebRTC 中就有着音视频数据传输的重要应用。
RTCP(Real-time Transport Control Protocol)是RTP的控制协议,用于监测RTP传输的质量和控制RTP流的发送速率。
RTP 和 RTCP 被划分在传输层,它建立在UDP上。同UDP协议一样,为了实现其实时传输功能,RTP也有固定的封装形式。RTP用来为端到端的实时传输提供时间信息和流同步,但并不保证服务质量。服务质量由RTCP来提供。
RTP 虽然和TCP、UDP 一同位于传输层,但是 RTP 是建立在 TCP、UDP之上的。所以通常默认 RTP 是使用 UDP 作为传输载体,但是在某些情况下(例如为了能够很好的通过防火墙),也可以使用 TCP 作为载体(RTP over TCP)。
RTP的封装
以下是RTP封装格式的表格介绍:
- PT:Payload Type
|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|X| CC |M| PT | Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Synchronization Source (SSRC) Identifier |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Contributing Source (CSRC) Identifier (0 - 15 items) |
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 扩展头部长度 (16位) | 扩展头部标识符 (16位) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 扩展头部数据 |
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload |
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
RTP传输H.264时如何处理NALU?
- 发送端处理
- 剥离起始码:从编码器输出中去除
00 00 01
或00 00 00 01
起始码。 - 封装NALU头+负载:根据RFC 6184规则,将NALU头(1字节)和负载直接作为RTP Payload发送。
- 分片逻辑:若NALU超过MTU,自动按FU-A模式分片,无需手动处理。
- 剥离起始码:从编码器输出中去除
- 接收端处理
- 重组分片:通过RTP序列号和时间戳还原完整NALU。
- 添加起始码:若需要生成标准H.264流(如保存为文件),接收端需在NALU前重新插入起始码。
为什么RTP不需要起始码?
RTP协议通过自身的封装规则和头部字段替代了起始码的功能,具体原因如下:
- RTP头部已提供分片与同步信息
- 时间戳(Timestamp):标识数据的时间基准,确保音视频同步。
- 序列号(Sequence Number):用于检测丢包和乱序,辅助重组数据。
- 负载类型(Payload Type):明确标记H.264的封装格式(如FU-A分片)。
- H.264 RTP封装的标准化规则(RFC 6184)
- 单NALU模式:直接封装NALU头+负载,无需起始码。
- 分片模式(FU-A):通过FU Indicator和FU Header的字段组合(S/E标志位)标识分片的开始与结束。
- 组合模式(STAP):将 多个小NALU打包到单个RTP包,通过长度字段分隔,无需起始码。
- 带宽优化
- 去除起始码可减少冗余字节。例如,一个4字节起始码占用0.3%的带宽(以1400字节MTU计算)。
- 在高并发或低带宽场景下,节省的字节累积效果显著。
RTCP的封装
RTP需要RTCP为其服务质量提供保证。RTCP的主要功能是:服务质量的监视与反馈、媒体间的同步,以及多播组中成员的标识。在RTP会话期 间,各参与者周期性地传送RTCP包。RTCP包中含有已发送的数据包的数量、丢失的数据包的数量等统计资料,因此,各参与者可以利用这些信息动态地改变传输速率,甚至改变有效载荷类型。RTP和RTCP配合使用,它们能以有效的反馈和最小的开销使传输效率最佳化,因而特别适合传送网上的实时数据。
RTCP也是用UDP来传送的,但RTCP封装的仅仅是一些控制信息,因而分组很短,所以可以将多个RTCP分组封装在一个UDP包中。RTCP有如下五种分组类型:
类型 | 缩写表示 | 用途 |
---|---|---|
200 | SR(Sender Report) | 发送端报告 |
201 | RR(Receiver Report) | 接收端报告 |
202 | SDES(Source Description Items) | 源点描述 |
203 | BYE | 结束传输 |
204 | APP | 特定应用 |
定义
SSRC(Synchronization source)是RTP报文流的一个Source,由RTP头中定义的32-bit的SSRC identifier来标识,这样做是为了不依赖网络地址。同一个SSRC中发送的所有包都具有同一时序和序列号间隔,因此接收者可以通过SSRC将收到的数据包分组并排序。一个信号源(麦克风,摄像头,Mixer)的报文流会有由一个SSRC的发送器发送。一个SSRC可能会随着时间的变化,改变其数据格式,例如音频编码。SSRC的身份识别码都是随机生成的,但是必须保证整个RTP session中该身份识别码不会重复,这些工作是通过RTCP来完成的。如果一个与会者在一个RTP session中发送不同的媒体数据流,那么每个流的SSRC必须不同。