LV015-RTCP简介
一、RTCP 简介
1. 简介
RTCP(Real-time Transport Control Protocol)协议,全称是实时传输控制协议。它是辅助 RTP 协议使用的。RTCP 报文有很多种,分别负责不同的功能。常用的报文有发送端报告(SR)、接收端报告(RR)、RTP 反馈报告(RTPFB)等。而每一种报告的有效载荷都是不同的。我们就是通过这些报告在接收端和发送端传递当前统计的 RTP 包的传输情况的。我们使用这些统计信息来做丢包重传,以及预测带宽。
不过,我需要再次强调一下,RTCP 协议只是用来传递 RTP 包的传输统计信息,本身不具有丢包重传和带宽预测的功能,而这些功能需要我们自己来实现。
2. 工作机制
当应用程序开始一个 RTP 会话时将使用两个端口:一个给 RTP ,一个给 RTCP。RTP 本身并不能为按顺序传送数据包提供可靠的传送机制,也不提供流量控制或拥塞控制,它依靠 RTCP 提供这些服务。
RTCP 负责管理传输质量在当前应用进程之间交换控制信息。在 RTP 会话期间,各参与者周期性地传送 RTCP 包,包中含有已发送的数据包的数量、丢失的数据包的数量等统计资料。因此,服务器可以利用这些信息动态地改变传输速率,甚至改变有效载荷类型。
RTP 和 RTCP 配合使用,能以有效的反馈和最小的开销使传输效率最佳化,故特别适合传送网上的实时数据。根据用户间的数据传输反馈信息,可以制定流量控制的策略,而会话用户信息的交互,可以制定会话控制的策略。
3. RTCP 数据报
在 RTCP 通信控制中,RTCP 协议的功能是通过不同的 RTCP 数据报来实现的,主要有如下几种类型:
- SR:发送端报告,所谓发送端是指发出 RTP 数据报的应用程序或者终端,发送端同时也可以是接收端。
- RR:接收端报告,所谓接收端是指仅接收但不发送 RTP 数据报的应用程序或者终端。
- SDES:源描述,主要功能是作为会话成员有关标识信息的载体,如用户名、邮件地址、电话号码等,此外还具有向会话成员传达会话控制信息的功能。
- BYE:通知离开,主要功能是指示某一个或者几个源不再有效,即通知会话中的其他成员自己将退出会话。
- APP:由应用程序自己定义,解决了 RTCP 的扩展性问题,并且为协议的实现者提供了很大的灵活性。
二、协议格式
我们上面讲到了 RTCP 协议有很多种报告,而每种报告其实定义的具体内容都是不一样的。我们这里以 RTPFB 报告中的 NACK 报告(丢包提示报告)作为一个例子来看看 RTCP 协议大概是什么样子的。(RTPFB 报告包含了多种子报告,NACK 报告只是其中的一种,因为我们后面还会用到这个报告,所以这里我们就先以这个报告为例子。)
下面就是 NACK 报告的协议格式。
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 博客