Skip to content

LV015-RTCP简介

一、RTCP 简介

RTCP(Real-time Transport Control Protocol)协议,全称是实时传输控制协议。它是辅助 RTP 协议使用的。RTCP 报文有很多种,分别负责不同的功能。常用的报文有发送端报告(SR)、接收端报告(RR)、RTP 反馈报告(RTPFB)等。而每一种报告的有效载荷都是不同的。我们就是通过这些报告在接收端和发送端传递当前统计的 RTP 包的传输情况的。我们使用这些统计信息来做丢包重传,以及预测带宽。

不过,我需要再次强调一下,RTCP 协议只是用来传递 RTP 包的传输统计信息,本身不具有丢包重传和带宽预测的功能,而这些功能需要我们自己来实现。

二、协议格式

我们上面讲到了 RTCP 协议有很多种报告,而每种报告其实定义的具体内容都是不一样的。我们这里以 RTPFB 报告中的 NACK 报告(丢包提示报告)作为一个例子来看看 RTCP 协议大概是什么样子的。(RTPFB 报告包含了多种子报告,NACK 报告只是其中的一种,因为我们后面还会用到这个报告,所以这里我们就先以这个报告为例子。)

下面就是 NACK 报告的协议格式。

md
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |V  |P|   FMT   |       PT      |           Length              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                   SSRC of the packet sender                   |
   +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
   |                   SSRC of the media source                    |
   +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
   |              PID              |             BLP               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

其中,每一个字段在下表中都有详细的解释。

字段 占用位数 含义
V 2 RTP 版本号。
P 1 填充标志位。当为 1 时, 表示在 RTP 包的最后面是不是有若干个填充字节。注意填充字节只用于字节对齐填充, 不是视频数据。
FMT 5 表示具体指的是哪种 RTPFB 消息, 参考 RFC4585。NACK 报告的 FMT 为 1。
Payload Type 8 RTCP 报告的类型, 参考 RFC4585。RTPFB 的值是 205。
Length 16 当前 RTCP 报告的大小减去 1, 以 4 字节为单位。
Packet ID(PID) 16 当前 RTCP 报告中第一个丢失的 RTP 包的序列号。
Bitmask of Lost Packets(BLP) 16 表示紧接着 Packet ID 的第 i 个包是不是丢失了, 丢失了则第 i 位为 1。

从上面的 NACK 报告我们可以看到,RTCP 协议跟 RTP 不同,它们传递的东西是不一样的。

我们知道 RTP 是用来传输实际的视频数据的。它就像一个快递盒,先装好视频,然后填好运送的视频基本信息和收件人信息,最后将视频运送到收件人手上。

而 RTCP 协议则像是一个用来统计快递运送情况的记录表。其中的 NACK 报告就是快递丢件情况的记录表。它记录着哪些快递丢了。发件人收到了 NACK 之后,可以重新寄一个同样的快递给收件人,防止收件人没有收到快递。在这里也就是将丢失的视频 RTP 包重传一遍。

虽然我们只讲了一种 RTCP 报告,但是其它的报告也是类似的。大多数报告都是用来记录传输信息的。因为数量很多,我们这里就不一一展开了。如果你有兴趣的话,可以查看这个文档:RFC 3550 - RTP: A Transport Protocol for Real-Time Applications (ietf.org)

参考资料:

【ZeroRange WebRTC】NACK(Negative Acknowledgment)技术深度分析-CSDN博客