WebRTC服务质量(03)- RTCP协议
一、前言:
RTCP(RTP Control Protocol)是一种控制协议,与RTP(Real-time Transport Protocol)一起用于实时通信中的控制和反馈。RTCP负责监控和调节实时媒体流。通过不断交换RTCP信息,WebRTC应用能够调整比特率、编码方式等,适应网络条件,确保音视频通话的质量。同时,RTCP与RTP共同工作,使得数据传输不仅准确,而且高效。
二、RTCP Header:
RTCP有很多格式,常见的有:SR(Sender Report)、RR(Receiver Report)、SDES(Source Description)、BYE(Goodbye)。他们格式各不相同,
但是,他们的Header的共同部分为:

- Version (V):占两位,表示RTCP版本,当前版本是2;
- Padding §:占1位,表示是否有填充字节。如果该字段为1,则表示有填充字节;
- Reception Report Count (RC):占5位,表示报告块的数量。每个RTCP报文可以包含多个报告块;
- Packet Type (PT):表示该RTCP报文的类型,例如:
- SR(Sender Report,发送者报告)
- RR(Receiver Report,接收者报告)
- SDES(Source Description,源描述)
- BYE(结束会话)
- APP(应用层自定义信息)
- Length:占16位,表示此 RTCP 数据包(包括报头本身)的长度(以 32 位为单位减一)。比如,一个 RTCP 报文的总长度(包括头部)是 80 个字节,那么我们需要将这个长度转换成 32 位单位,然后减去 1 来填写在 RTCP 头部的长度字段中。
- 首先,将总长度转换成 32 位单位:
- 80 字节 = 80 * 8 = 640 位
- 640 位 / 32 = 20 个 32 位字
- 接下来,根据文档的描述,需要减去 1,即:
- 20 个 32 位字 - 1 = 19
- 首先,将总长度转换成 32 位单位:
- SSRC of sender: 占用32位,表示发送该RTCP报文的源的同步源标识符(SSRC)。用来唯一标识一个媒体发送者。
三、RTCP Packet Type:
常见的有:
- SR(Sender Report):
- 发送者报告,包含有关发送者的统计信息,如发送的总包数、发送时的时间等。它提供了性能监控的关键指标,例如丢包率和延迟。
- RR(Receiver Report):
- 接收者报告,包含有关接收的数据包的统计信息,如接收的总包数、丢失的包数等。接收者使用此报告来向发送者反馈接收状态。
- SDES(Source Description):
- 源描述,提供有关媒体源的附加信息,例如源的名称、电子邮件地址、电话等。这有助于会话中的参与者识别彼此。
- BYE:
- 结束报告,表示一个或多个参与者离开会话。当参与者不再发送数据时,它会向其他参与者发送 BYE 消息,以通知他们。
- APP:
- 自定义的RTCP报告,允许应用程序定义自己所需的反馈和信息。
- FIR(Full Intra Request):
- 向对方请求发送关键帧(全内编码帧),主要用于视频流媒体的情况,以便重新同步流。
- NACK:当接收端收到的数据有丢失的情况下,给发送端发送一个NACK;发送端收到NACK之后,首先看这个包有没有超时,如果没有超时,那么重新将这个包发送给接收端;
- RTPFB(RTP Feedback):
- 一般性RTP反馈,能够携带多种反馈信息,包括质量、丢包、抖动等。它通常是用于更详细的动态反馈机制。
- PSFB(Payload Specific Feedback):
- 根据负载的特殊情况返回的反馈,通常用于特定编解码器的附加功能,例如流量控制和优化。
下面详细看看每一中Type,当然,重点还是SR/RR。
3.1、SR:
RTCP SR(Sender Report)是实时传输控制协议(RTCP)中的一种报文类型,用于发送端向接收端提供有关发送者的信息。RTCP SR 报文包含了发送端的时间戳信息以及关于发送端发送媒体流的统计数据。
格式如下:
0 1 2 30 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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
header |V=2|P| RC | PT=SR=200 | length |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| SSRC of sender |+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
sender | NTP timestamp, most significant word |
info +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| NTP timestamp, least significant word |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| RTP timestamp |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| sender's packet count |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| sender's octet count |+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
report | SSRC_1 (SSRC of first source) |
block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+1 | fraction lost | cumulative number of packets lost |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| extended highest sequence number received |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| interarrival jitter |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| last SR (LSR) |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| delay since last SR (DLSR) |+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
report | SSRC_2 (SSRC of second source) |
block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+2 : ... :+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+| profile-specific extensions |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
SR由以下部分组成:
-
Header:标准的RTCP头部,包括基础的控制信息,前面已经说明过了。
-
Sender Info:发送者信息,包括:
- NTP Timestamp:64位,表示真实世界的时间,可以用来进行音视频同步,因为不同的源,真实世界的时间是一样的。
- RTP timestamp:32位,相对时间,只真针对这一路流;和RTP里面的时间戳一致;
- Packet Count:32位,表示在统计期间内成功发送的RTP数据包总数。这有助于接收者了解发送者在给定时间窗口内的活动量。
- Octet Count:32位,总共发送的数据量,因为我们知道了总发包数,不一定知道总发送数据量,因为一个包大小有可能是50字节,也有可能是100字节。
-
n个Report block:每个报告块提供有关接收流的统计信息。每个接收的流(SSRC)都可能对应一个Report block,因此如果您接收了5路流,则可能会有5个Report block。每个Report block提供了关于特定源的接收信息。
-
SR中包含RR: 标准允许在SR中含有RR,这样可以节省带宽,就是我不光告诉你我发送的情况,我还会把我之前接收的报告顺便发给你。然而,在WebRTC中,通常情况下,发送者报告(SR)并不会包含接收者报告(RR),而是单独发送RR来避免复杂性和规模问题。这种设计使得每种报告可以专注于其主要作用,提高了传输效率。
- SSRC_1 (SSRC of first source):
- 描述:这一字段指定了发送者的同步源标识符(SSRC),它是发送方在RTCP中的唯一标识符,有助于接收方识别信息源。
- Fraction lost (丢包比例):
- 描述:表示自上次报告以来丢失的数据包的比例。它是一个8位字段,具体计算为丢包数与接收总数的比例。范围在0到255之间,值越低表示丢失的包越少。
- Cumulative number of packets lost (丢失的包总量):
- 描述:这个字段是一个32位的计数器,从会话开始到当前报告时已经丢失的所有包的累计数量。这有助于发送方评估网络的稳定性。
- Extended highest sequence number received (扩展的最高序列号):
- 描述:该字段的意义在于记录接收方所接收到的最高序列号。这是一个32位的值,能够帮助发送方了解接收方的接收情况。这也有助于分析包的顺序,判断是否发生了重传。
- Interarrival jitter (到达抖动):
- 描述:表示数据包到达时间的变化(抖动),是一个32位的值,用于衡量数据包传输的延迟变化。这对于实时应用(如音频和视频)至关重要,因为抖动会影响用户体验。
- Last SR (LSR) (上一个发送报告时间):
- 描述:该字段表示上一次发送报告的时间戳,通常以NTP(Network Time Protocol)时间格式表示。通过了解最近的发送时间,可以更好地评估当前的网络状况。
- Delay since last SR (DLSR) (自上次发送报告以来的延迟):
- 描述:表示当前报告时与上一次报告之间的延迟。这有助于发送方评估发送响应的时效性,确定网络延迟是否在可接受范围内。
- 示例场景:
- 假设在一个视频会议中,有一个发送者和多个接收者,发送者使用RTCP Sender Report来反馈其数据包的发送情况。我们来看一份具体的Sender Report:
- SSRC_1 (SSRC of first source):
Sender Report (SR)SSRC: 123456789Fraction lost: 5Cumulative number of packets lost: 20Extended highest sequence number received: 500Interarrival jitter: 100Last SR (LSR): 1618848000 (NTP timestamp)Delay since last SR (DLSR): 50
字段分析:
1. SSRC (123456789):发送者的唯一识别标识符。接收方可以在多方通话中通过这个值确认哪个发送者发送了该报告。
2. Fraction lost (5):值为5,表示自上次报告以来,丢失的包占接收到总包数的比例。假设接收方共接收到100个包(即接收到的包总数可能是100 + 5 = 105),那么丢包率为5%。这表明网络传输不是很好,需要关注。
3. Cumulative number of packets lost (20):自会话开始到当前时刻,已经丢失的包总数为20。这可帮助发送方了解其发送的稳定性,若持续增加,则可能需调整发送策略或改善网络条件。
4. Extended highest sequence number received (500):该字段表示接收方接受到的最高序列号为500,意味着它已经成功收到的包的一个连续编号。这有助于检测出是否有包丢失,以及是否以正确的顺序到达。
5. Interarrival jitter (100):100毫秒的抖动值表明数据包到达的时间不稳定,这可能会导致视频或音频播放时的延迟和不流畅感。较高的抖动值意味着网络不稳定,需要优化网络。
6. Last SR (LSR) (1618848000):这是NTP时间戳,表示上一个发送报告的时间。假设该时间戳对应于某个特定的时刻(如2021年4月1日),这使得接收方能够判断报告的时效性。
7. Delay since last SR (DLSR) (50):值50表示自上次发送SR报告以来经过的延迟为50毫秒。这表明数据传输的延迟相对较低,发送方能够及时得到反馈。
3.2、RR:
RR(Receiver Report)接收者报告,消息包含多个报告单元,分别反映不同的接收者关于接收数据的质量。

- 和SR相比,没有
Sender Info字段; - 其他和SR相同;
3.3、SDES:
SDES (Source Description) 格式用于传递与媒体源相关的描述信息,例如用户名、邮箱地址、流的名称等。
报文格式:
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=2|P| SC | PT=SDES=202 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC/CSRC_1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SDES items |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SDES items |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
SDES 报文由一个 RTCP 头部和一个或多个SDES项组成。
- SC:表示seds item count,就是后面带了多少item;
- PT:202
- length:表示这个包有多大;
- item:由两部分组成,SSRC和具体
SDES items;
后面的每个SDES items:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SDES type | length | SDES text |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- SDES type: 8 bits,表示SDES项的类型,指示该项包含的是何种信息,如参与者的名称、邮箱地址等。我们一般都是使用CNAME,除了CNAME,还有其他类型如下:
- 0:会话名称(CNAME)
- 1:邮箱(EMAIL)
- 2:用户名(NAME)
- 3:流名称(RID)
- 4:工具(Tool)
- 5:网址(LOCATION)
- length: 8 bits,表示SDES项值的长度,以字节为单位。
- SDES text: 包含SDES项的实际值,可以是参与者的名称、邮箱地址、电话号码等描述信息。
可以看出是一种TLV格式,如果作为服务器,接收到多路客户端一起推流,那么有可能ssrc会冲突,服务器就会告诉客户端使用原来的CNAME来重新计算一个SSRC,这个过程的协商就是SDES完成的;
-
示例:
在媒体协商时候,为每一个源都设置好了一个CNAME,假如抓到如下报文:

那么:
- PT为202表示SDES,length为6(计算长度为(6+1)*4 = 28字节);
- SDES中每一项都叫做一个Chunk,Chunk中包含SSRC + Sdes item;
- 每一个SSR对应多个item;
- Text就是这个SDES item具体内容;
3.4、BYE:
主要用于告知其他参与者某个源(通常是发送者)已经结束通信或不再发送媒体流。
报文格式如下:
0 1 2 30 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=2|P| SC | PT=BYE=203 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC/CSRC |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC/CSRC |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| length | reason for leaving ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- RTCP 头部:
- Version (2 bits): 表示 RTCP 的版本,当前版本为 2。
- Padding (1 bit): 指示报文是否有填充部分。
- Reception Report Count (RC) (5 bits): 在 BYE 报文中通常为 0。
- Packet Type (8 bits): 对于 BYE 报文,其值为 203。
- Length (16 bits): 表示后续负载的长度,以 32 位字(4 字节)为单位计算。
- SSRC 列表:
- 该部分包含一个或多个发送源的同步源标识符(SSRC)。这些 SSRC 表示已结束的媒体流的发送者。
- 原因代码 (可选):
- BYE 报文中还可以包含一个可选的原因字段,以指示发送者停止原因(如正常停止、错误等)。
- 其他信息 (可选):
- 可包含文本信息,如告别消息等,长度取决于具体情况。
3.5、APP:
RTCP APP(Application-Defined RTP Control Protocol)报文是一种可扩展的 RTCP 控制消息,允许应用程序在 RTCP 报文中插入自定义信息。RTCP APP 报文灵活,能够提供应用特定的反馈、信息或统计数据,适用于多种场景,比如流媒体传输、实时会议和在线游戏。
报文格式如下:
0 1 2 30 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=2|P| subtype | PT=APP=204 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC/CSRC |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| name (ASCII) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| application-dependent data ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 前面都是xxx count,这儿变成了SubType,我们可以定义多个APP,使用这个ST区分。
- body部分第一个是ssrc:表示这个包所有操作都是针对这个ssrc进行的;
- name和data:名字和具体数据;
3.6、FIR:
用于请求发送者发送一个关键(全帧)帧。
报文格式如下:
0 1 2 30 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=2|P| FMT=4 | PT=FIR=192 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of packet sender |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of media source |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- V (Version):
- 2 bits,固定为 2,表示 RTCP 协议的版本。
- P (Padding):
- 1 bit,指示是否存在填充字节。
- FMT (Format):
- 5 bits,这里值为 4,表示 FIR 报文的特定格式。
- PT (Packet Type):
- 8 bits,值为 192,指示这是一个 FIR 报文。
- length:
- 16 bits,表示整个 RTCP 报文的长度,单位为 4 字节(即报文中包含的字的数量减去 1)。
- SSRC of packet sender:
- 32 bits,表示发送 RTCP FIR 报文的发送者的同步源标识符(SSRC)。就是接收者自己SSRC。
- SSRC of media source:
- 32 bits,表示希望请求关键帧的媒体源的 SSRC。接收者请求的发送者SSRC。
3.7:NACK:
RTCP NACK(Negative Acknowledgement)报文用于指示丢失的媒体包,以便发送端重传这些包。以下是RTCP NACK报文的格式:
0 1 2 30 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=2|P| FMT=1 | PT=NACK=205 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of packet sender |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of media source for which NACK is sent |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NACK PID PID PID PID ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- V (Version):
- 2 bits,表示 RTCP 协议的版本,固定为 2。
- P (Padding):
- 1 bit,指示报文是否包含填充字节。
- FMT (Format):
- 5 bits,指定报文的格式类型。NACK 报文的格式为 1。
- PT (Packet Type):
- 8 bits,指示报文类型。NACK 报文的类型值为 205。
- length:
- 16 bits,表示整个 RTCP 报文的长度,以 32 位字(4 字节)为单位计算。
- SSRC of packet sender:
- 32 bits,指示发送 RTCP NACK 报文的发送者的同步源标识符(SSRC)。
- SSRC of media source:
- 32 bits,表示请求重传丢失媒体包的源的 SSRC。
- NACK PID:
- 32 bits,后续字段用于列出丢失的媒体包的序列号(Packet IDs),以便发送方进行重传。
3.8、FB信息:
RTCP RTPFB(RTP Feedback)报文用于提供有关RTP数据流的反馈信息。
报文格式如下:
0 1 2 30 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=2|P| FMT=15 | PT | length |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| SSRC of packet sender |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| SSRC of media source |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| FCI |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- FMT:feedback message type,返回报文的消息类型,就可以区分比如前面的PLI、FIR、REMB;
- PT:payload type,205或者206;
- SSRC of packet sender:这个报文由谁发送的;
- SSRC of media source:表示我们这个报文是针对哪个媒体源反馈的报文;
- FCI:这个值就需要根据前面的FMT来确定了;不同FMT有不同的格式;
按照PT分类:
主要分为传输层的FB、负载层的FB和应用层的FB。这些不同类型的反馈报文通过FB Type字段来区分,以便接收端和发送端能够正确解释和处理反馈信息。
- 传输层的FB(RTPFB):
- 传输层的FB主要关注RTP流的传输和接收情况,通常用于网络拥塞控制、丢包恢复等。
- 传输层的FB主要涉及网络传输方面的问题,如丢包、网络延迟等。
- 传输层的FB Type一般在范围0-191。
- 负载层的FB(PSFB):
- 负载层的FB关注RTP载荷的内容,例如视频编解码方面的信息,如图像质量、分辨率等。
- 负载层的FB主要针对RTP载荷内容的质量和特征进行反馈。
- 负载层的FB Type一般在范围192-254。
- 应用层的FB:
- 应用层的FB与应用层的特定需求和协议相关,用于传递应用层特定的反馈信息。
- 应用层的FB主要用于特定应用场景下的反馈需求,例如实时协作应用、多媒体通信应用等。
- 应用层的FB Type一般在范围256-383。
3.9、RTPFB:
传输层的FB,报文头就是3.8、FB信息那样,PT为205:
payload type为205的时候,传输层的RTPFB,主要传输下面几种包:
- NACK:就是一般的重传型;
- TMMBR:表示发送一个最大码流请求;
- TMMBN:最大码流请求的响应;
- TFB:最重要,传输层的拥塞控制报文;
具体如下:
1)NACK(Negative Acknowledgement)
- 定义: 用于通知发送方哪些 RTP 数据包未被成功接收。
- 功能: 请求重传丢失的数据包,确保接收方能够获得完整的媒体流。
- 示例: 接收方发送 NACK 报文,指出包 123 和 124 丢失,请求发送方重传。
2)TMMBR(Temp Maximum Media Bit Rate)
- 定义: 临时最大媒体比特率请求,通知发送方在当前网络条件下建议的最大比特率。
- 功能: 当检测到网络拥塞或带宽不足时,接收方可以请求发送方降低比特率,以保证媒体流的稳定。
- 示例: 接收方通过 TMMBR 报文请求将发送比特率降低到 920 kbps,适应网络带宽。
3)TMMBN(Temp Maximum Media Bit Rate Notification)
- 定义: 对 TMMBR 请求的确认,指示接收方接受的最大媒体比特率。
- 功能: 确保发送方了解当前网络状况,并进行相应调整。
- 示例: 接收方确认发送方可以按照 920 kbps 的比特率发送数据流。
4)TFB(Transport Feedback)
- 定义: 传输反馈报文,专用于传输层的拥塞控制。
- 功能: 提供实时的网络状态反馈,包括丢包率、延迟和带宽利用率,帮助发送方优化其流量控制策略。
- 示例: 接收方发送 TFB 报文,通知发送方当前丢包率为 2%,建议减少发送速率以避免拥塞。
3.10、PSFB:
PSFB(Payload-Specific Feedback)是一种 RTCP(Real-time Control Protocol)反馈机制,用于针对特定负载类型提供反馈信息,报文头就是3.8、FB信息那样,PT为206。下面是三种常见的 PSFB 报文类型及其作用:
- PLI(Picture Loss Indication):
- PLI 用于指示接收端在视频通话中丢失了整个关键帧(I-frame),请求发送端发送下一个关键帧,以确保视频解码器能够正确重建视频帧序列。
- PLI 的接收端将其发送给发送端,发送端收到后会尽快发送下一个关键帧。
- FIR(Full Intra Request):
- FIR 用于请求发送端发送一个完整的关键帧(I-frame),通常用于视频通话中的图像清晰度恢复或者加入新的参与者时需要一个完整的起始点。
- FIR 报文的接收端发送给发送端,发送端收到后会立即发送一个完整的关键帧。
- REMB(Receiver Estimated Maximum Bitrate):
- REMB 用于接收端向发送端报告其估计的最大比特率,以便发送端可以根据接收端的带宽情况调整视频编码参数,以最大程度地利用可用的带宽。
- REMB 报文能够帮助发送端动态调整编码比特率,以优化视频传输并避免网络拥塞。
四、Compound RTCP:
Compound RTCP 是指将多个 RTCP(Real-time Control Protocol)包合并到一个复合包中一起发送,以减少网络传输开销和提高效率。
1、报文结构:
一般情况下,一个 Compound RTCP 数据包的结构如下:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTCP SR/RR |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTCP SDES |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Other RTCP |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
可以看出,规定了必须先以SR/RR开头,然后紧接着SDES,后面是其他的信息。Compound RTCP 需要周期发送。
2、规则:
- 如果RTCP加密了,Compound RTCP 中必须包含加密前缀(可选);
- 必须包含SR 或 RR报文;
- 必须包含SDES报文,并且,SDES当中只可以有一项CNAME Item;
- 可以包含一个或者多个FB报文;
3、具体例子:
下面是一个SR和SDES组成的Compound RTCP;

- UDP总长为64个字节;
- UDP载荷是56个字节(也就是整个Compound RTCP占56个字节);
- 这56个字节中有两个RTCP报文,一个SR和一个SDES;
- header中也有length,为6,长度为(6+1)*4 = 28字节,56-28=28就是剩下其他RTCP报文长度;
五、总结:
本文主要介绍了RTCP协议,它配合RTP完成了WebRtc强大的流控策略。
欢迎学习交流:

相关文章:
WebRTC服务质量(03)- RTCP协议
一、前言: RTCP(RTP Control Protocol)是一种控制协议,与RTP(Real-time Transport Protocol)一起用于实时通信中的控制和反馈。RTCP负责监控和调节实时媒体流。通过不断交换RTCP信息,WebRTC应用…...
STM32F103单片机HAL库串口通信卡死问题解决方法
在上篇文章 STM32F103单片机使用STM32CubeMX创建IAR串口工程 中分享了使用cubeMX直接生成串口代码的方法,在测试的过程中无意间发现,串口会出现卡死的问题。 当串口一次性发送十几个数据的时候,串口感觉像卡死了一样,不再接收数据…...
Scala正则表达式
一、定义:正则表达式是一种用于匹配、查找和替换文本中特定模式的字符串。 使用方式:①定义一个正则 正则表达式应用场景:查找、验证、替换。 Ⅰ、查找 在目标字符串中,找到符合正则表达式规则要求的 子串。 方括号ÿ…...
每日一刷——二叉树的构建——12.12
第一题:最大二叉树 题目描述:654. 最大二叉树 - 力扣(LeetCode) 我的想法: 我感觉这个题目最开始大家都能想到的暴力做法就是遍历找到数组中的最大值,然后再遍历一遍,把在它左边的依次找到最大…...
Redis配置文件中 supervised指令
什么是Supervised? supervised模式允许Redis被外部进程管理器监控。通过这个选项,Redis能够在崩溃后自动重启,确保服务的高可用性。常见的进程管理器包括systemd和upstart。 开启方法 vim修改: sudo vi /etc/redis/redis.conf…...
OpenCV相机标定与3D重建(18)根据基础矩阵(Fundamental Matrix)校正两组匹配点函数correctMatches()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 优化对应点的坐标。 cv::correctMatches 是 OpenCV 库中的一个函数,用于根据基础矩阵(Fundamental Matrix)校…...
python脚本:向kafka数据库中插入测试数据
# coding:utf-8 import datetime import json import random import timefrom kafka import KafkaProducer生产者demo向branch-event主题中循环写入10条json数据注意事项:要写入json数据需加上value_serializer参数,如下代码producer KafkaProducer(val…...
10. 高效利用Excel导入报警信息
高效利用Excel导入报警信息 1.添加报警服务器2.导出报警EXCEL3.报警控件使用1.添加报警服务器 右键项目名称——Add New Sever——Tag Alarm and Event Sever 给报警服务器命名Alarm 给报警服务器分配优先级。如果想要使能历史的话需要和SQL sever配合使用,之前写过。记住这…...
k8s service 配置AWS nlb load_balancing.cross_zone.enabled
在Kubernetes中配置NLB(Network Load Balancer)的跨区域负载均衡(cross-zone load balancing),需要使用服务注解(service annotations)来实现。根据AWS官方文档,以下是配置NLB跨区域…...
国标GB28181网页直播平台EasyGBS国标GB28181-2016协议解读:媒体流保活机制
GB28181-2016在为视频监控系统提供统一的网络视频传输协议。这项标准主要用于公共安全视频监控系统,支持视频监控设备间的互联互通。其主要应用场景包括城市公共安全监控、交通监控、消防监控等。 GB28181-2016标准中的媒体流保活机制,主要是在确保视频…...
面试经验分享 | 杭州某安全大厂渗透测试岗
目录: 所面试的公司:某安全大厂 所在城市:杭州 面试职位:渗透测试工程师 面试过程: 面试官的问题: 1、面试官开始就问了我,为什么要学网络安全? …...
26. Three.js案例-自定义多面体
26. Three.js案例-自定义多面体 实现效果 知识点 WebGLRenderer WebGLRenderer 是 Three.js 中用于渲染场景的主要类。它支持 WebGL 渲染,并提供了多种配置选项。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&…...
HarmonyOS-高级(四)
文章目录 应用开发安全应用DFX能力介绍HiLog使用指导HiAppEvent 🏡作者主页:点击! 🤖HarmonyOS专栏:点击! ⏰️创作时间:2024年12月11日11点18分 应用开发安全 应用隐私保护 隐私声明弹窗的作…...
Qt-chart 画折线图(以时间为x轴)
上图 代码 #include <iostream> #include <random> #include <qcategoryaxis.h>void MainWindow::testLine() {//1、创建图表视图QChartView* view new QChartView(this);//2.创建图表QChart* chart new QChart();//3.将图表设置给图表视图view->setCh…...
【入门】晶晶的补习班
描述 晶晶上初中了。妈妈认为晶晶应该更加用功学习,所以晶晶除了上学之外,还要参加妈妈为她报名的各科补习班。晶晶的妈妈给了晶晶的下周每天上补习班的小时数,晶晶同学想知道,下周平均一天要上多少小时的补习班(结果…...
c#动态更新替换json节点
需求项目json作为主模板,会应用到多个子模版,当后续项目变更只需要修改主模板中节点,并且能够动态更新到原来的子模版中去。 主模板示例: {"A": {"A1": "","A2": false,"A3"…...
cf补题日记
听退役选手建议,补40道C、D题。 (又又又开新专题。。。 进度:2/40 原题1: You are given a string ss, consisting of digits from 00 to 99. In one operation, you can pick any digit in this string, except for 00 or the…...
Golang学习笔记_01——包
文章目录 包(package)1. 定义2. 导入3. 初始化4. 可见性4. 注意4.1 包声明4.2 main包4.3 包的导入4.4标识符的可见性4.5 包的初始化4.6 避免命名冲突4.7 包的路径和名称4.8 匿名导入4.9 使用Go Modules 包(package) 在Golang&…...
RPC设计--应用层缓冲区,TcpBuffer
为什么需要应用层的buffer 为了方便数据处理,从fd上直接读写然后做包的组装、拆解不够方便方便异步发送,将数据写到应用层buffer后即可返回,让epoll即event_loop去异步发送。提高发送效率,多个小包可合并发送 buffer 设计 可以…...
基于单片机智能控制的饮水机控制系统
基于单片机智能控制的饮水机控制系统,以STC89C52单片机为核心,利用防水型DS18B20温度传感器对饮水机内的水温做出检测,其次利用水位传感器对饮水机内的水量做出检测,并显示在OLED液晶显示屏上。用户在使用饮水机时,通过…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...
聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...
