跳到主要内容

RTP与RTCP

· 阅读需 7 分钟
阅读量: 101阅读人次: 102

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?

  1. 发送端处理
    • 剥离起始码:从编码器输出中去除 00 00 0100 00 00 01 起始码。
    • 封装NALU头+负载:根据RFC 6184规则,将NALU头(1字节)和负载直接作为RTP Payload发送。
    • 分片逻辑:若NALU超过MTU,自动按FU-A模式分片,无需手动处理。
  2. 接收端处理
    • 重组分片:通过RTP序列号和时间戳还原完整NALU。
    • 添加起始码:若需要生成标准H.264流(如保存为文件),接收端需在NALU前重新插入起始码。

为什么RTP不需要起始码?

RTP协议通过自身的封装规则和头部字段替代了起始码的功能,具体原因如下:

  1. RTP头部已提供分片与同步信息
    • 时间戳(Timestamp):标识数据的时间基准,确保音视频同步。
    • 序列号(Sequence Number):用于检测丢包和乱序,辅助重组数据。
    • 负载类型(Payload Type):明确标记H.264的封装格式(如FU-A分片)。
  2. H.264 RTP封装的标准化规则(RFC 6184)
    • 单NALU模式:直接封装NALU头+负载,无需起始码。
    • 分片模式(FU-A):通过FU Indicator和FU Header的字段组合(S/E标志位)标识分片的开始与结束。
    • 组合模式(STAP):将多个小NALU打包到单个RTP包,通过长度字段分隔,无需起始码。
  3. 带宽优化
    • 去除起始码可减少冗余字节。例如,一个4字节起始码占用0.3%的带宽(以1400字节MTU计算)。
    • 在高并发或低带宽场景下,节省的字节累积效果显著。

RTCP的封装

RTP需要RTCP为其服务质量提供保证。RTCP的主要功能是:服务质量的监视与反馈、媒体间的同步,以及多播组中成员的标识。在RTP会话期 间,各参与者周期性地传送RTCP包。RTCP包中含有已发送的数据包的数量、丢失的数据包的数量等统计资料,因此,各参与者可以利用这些信息动态地改变传输速率,甚至改变有效载荷类型。RTP和RTCP配合使用,它们能以有效的反馈和最小的开销使传输效率最佳化,因而特别适合传送网上的实时数据。

RTCP也是用UDP来传送的,但RTCP封装的仅仅是一些控制信息,因而分组很短,所以可以将多个RTCP分组封装在一个UDP包中。RTCP有如下五种分组类型:

类型缩写表示用途
200SR(Sender Report)发送端报告
201RR(Receiver Report)接收端报告
202SDES(Source Description Items)源点描述
203BYE结束传输
204APP特定应用

定义

SSRC(Synchronization source)是RTP报文流的一个Source,由RTP头中定义的32-bit的SSRC identifier来标识,这样做是为了不依赖网络地址。同一个SSRC中发送的所有包都具有同一时序和序列号间隔,因此接收者可以通过SSRC将收到的数据包分组并排序。一个信号源(麦克风,摄像头,Mixer)的报文流会有由一个SSRC的发送器发送。一个SSRC可能会随着时间的变化,改变其数据格式,例如音频编码。SSRC的身份识别码都是随机生成的,但是必须保证整个RTP session中该身份识别码不会重复,这些工作是通过RTCP来完成的。如果一个与会者在一个RTP session中发送不同的媒体数据流,那么每个流的SSRC必须不同。