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应用…...
[python SQLAlchemy数据库操作入门]-10.性能优化:提升 SQLAlchemy 在股票数据处理中的速度
哈喽,大家好,我是木头左! 当处理大量数据时,如股票数据,默认的ORM操作可能会显得效率低下。本文将探讨如何通过一些技巧和策略来优化SQLAlchemy ORM的性能,从而提升其在股票数据处理中的速度。 1. 选择合适的数据类型 在定义模型时,选择合适的数据类型对于性能至关重要…...
23种设计模式之中介者模式
目录 1. 简介2. 代码2.1 Mediator (中介者接口)2.2 ChatRoom (具体中介者类)2.3 User (同事接口)2.4 ChatUser (具体同事类)2.5 Test (测试)2.6 运行结果 3. …...
MySQL:GROUP_CONCAT分组合并
目录 一、概述二、用法三、分组去重 一、概述 GROUP_CONCAT函数要配合group by才能发挥作用,主要用于分组之后合并某一字段。 二、用法 SELECT GROUP_CONCAT(age) FROM tb_user GROUP BY banner;三、分组去重 SELECT GROUP_CONCAT(DISTINCT age) FROM tb_user GRO…...
递归方式渲染嵌套的菜单项
1. 递归组件 递归方式渲染嵌套的菜单项,这个是非常好的做法。为了避免在每个子菜单上都渲染一个新的 <ul> 标签,可以使用 v-if 来判断是否有子菜单,再决定是否渲染子菜单的部分。 2. 提高性能 对于递归渲染组件,Vue 可能…...
常用Vim操作
vimrc配置 ctags -R * 生成tags文件 set number set ts4 set sw4 set autoindent set cindent set tag~/tmp/log/help/tags 自动补全: ctrln:自动补全 输入: a:从当前文字后插入i:从当前文字前插入s: 删除当前字…...
spark3 sql优化:同一个表关联多次,优化方案
目录 1.合并查询2.使用 JOIN 条件的过滤优化3.使用 Map-side Join 或 Broadcast Join4.使用 Partitioning 和 Bucketing5.利用 DataFrame API 进行优化假设 A 和 B 已经加载为 DataFramePerform left joins with specific conditions6.使用缓存或持久化7.避免笛卡尔积总结 1.合…...
XML 在线格式化 - 加菲工具
XML 在线格式化 打开网站 加菲工具 选择“XML 在线格式化” 输入XML,点击左上角的“格式化”按钮 得到格式化后的结果...
陪玩系统小程序源码/游戏陪玩APP系统用户端有哪些功能?游戏陪玩小程序APP源码开发
多客陪玩系统-游戏陪玩线下预约上门服务等陪玩圈子陪玩社区系统源码 陪玩系统源码,高质量的陪玩系统源码,游戏陪玩APP源码开发,语音陪玩源码搭建: 线上陪玩活动组局与线下家政服务系统的部署需要综合考虑技术选型、开发流程、部署流程、功能实…...
力扣-图论-9【算法学习day.59】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...
ViT学习笔记(三) RepViT和TransNext简介
标准ViT的其他模块的功能以及源码解读,在CSDN上有很多优秀文章,参考文章将代码大致过一遍。像我这种只做工程不写论文的,个人认为大致明白就好,用不着特别细究。下面跟踪两个ViT比较新的变种继续深入学习一下:RepViT和…...
大华DSS数字监控系统 attachment_downloadAtt.action 任意文件下载漏洞复现
0x01 产品描述: 大华 DSS 数字监控系统是大华开发的一款安防视频监控系统,拥有实时监视、云台操作、录像回放、报警处理、设备管理等功能。0x02 漏洞描述: 大华DSS数字监控系统 attachment_downloadAtt.action接口存在任意文件读取漏洞,未经身份验证攻击者可通过该漏洞读取…...
Dockerfile容器镜像构建技术
文章目录 1、容器回顾1_容器与容器镜像之间的关系2_容器镜像分类3_容器镜像获取的方法 2、其他容器镜像获取方法演示1_在DockerHub直接下载2_把操作系统的文件系统打包为容器镜像3_把正在运行的容器打包为容器镜像 3、Dockerfile介绍4、Dockerfile指令1_FROM2_RUN3_CMD4_EXPOSE…...
LabVIEW实现MQTT通信
目录 1、MQTT通信原理 2、硬件环境部署 3、云端环境部署 4、程序架构 5、前面板设计 6、程序框图设计 7、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和常用…...
分布式事物XA、BASE、TCC、SAGA、AT
分布式事务——Seata 一、Seata的架构: 1、什么是Seata: 它是一款分布式事务解决方案。官网查看:Seata 2.执行过程 在分布式事务中,会有一个入口方法去调用各个微服务,每一个微服务都有一个分支事务,因…...
[创业之路-182]:《华为战略管理法-DSTE实战体系》-1-华为的发展历程和战略管理演变
目录 前言、华为在战略管理上做对了什么? 1、前瞻性的战略眼光 2、有效的战略解码 3、灵活的战略调整 4、注重创新和研发 5、以客户为中心的战略导向 6、完善的内部管理体系 一、华为不同时期的战略选择 1.1 华为不同时期的战略选择 1、创业初期ÿ…...
python爬虫--小白篇【爬取B站视频】
目录 一、任务分析 二、网页分析 三、任务实现 一、任务分析 将B站视频爬取并保存到本地,经过分析可知可以分为四个步骤,分别是: 爬取视频页的网页源代码;提取视频和音频的播放地址;下载并保存视频和音频&#x…...
web 自动化 selenium
1、下载Chrome对应的driver版本 我的chrome是 131.0.6778.109,我下载的driver是131.0.6778.69(想找一模一样的,但是没有) https://googlechromelabs.github.io/chrome-for-testing/ chromedriver下载 2、配置Chrome deriver及 …...
【OpenCV】Canny边缘检测
理论 Canny 边缘检测是一种流行的边缘检测算法。它是由 John F. Canny 在 1986 年提出。 这是一个多阶段算法,我们将介绍算法的每一个步骤。 降噪 由于边缘检测易受图像中的噪声影响,因此第一步是使用 5x5 高斯滤波器去除图像中的噪声。我们在前面的章…...
D94【python 接口自动化学习】- pytest进阶之fixture用法
day94 pytest的fixture详解 学习日期:20241210 学习目标:pytest基础用法 -- pytest的fixture详解 学习笔记: fixture的介绍 fixture是 pytest 用于将测试前后进行预备、清理工作的代码处理机制。 fixture相对于setup和teardown来说有以…...
关于idea-Java-servlet-Tomcat-Web开发中出现404NOT FOUND问题的解决
在做web项目时,第一次使用servlet开发链接前端和后端的操作,果不其然,遇到了诸多问题,而遇到最多的就是运行项目打开页面时出现404NOT FOUND的情况。因为这个问题我也是鼓捣了好久,上网查了许多资料才最终解决…...
SpringBoot Maven快速上手
文章目录 一、Maven 1.1 Maven 简介:1.2 Maven 的核心功能: 1.2.1 项目构建:1.2.2 依赖管理: 1.3 Maven 仓库: 1.3.1 本地仓库:1.3.2 中央仓库:1.3.3 私服: 二、第一个 SpringBoot…...
全面解析MySQL底层概念
mysql的概念 (1)mysql的架构 客户端请求--->连接器(验证用户身份,给予权限)--->查询缓存(存在则直接返回,不存在则执行后续操作 --->分析器(对SQL进行词法分析和语法分析…...
【C++】string类
一、C 标准库中的string类 1、string类 string类的文档介绍 首先string并不是STL中的,而是一个类string比STL出现的早 从上面可以看出string是从一个类模板中实例化出来的一个对象 在使用string类是必须要包头文件#include< string > 又因为是std中的类…...
《Python制作动态爱心粒子特效》
一、实现思路 粒子效果: – 使用Pygame模拟粒子运动,粒子会以爱心的轨迹分布并运动。爱心公式: 爱心的数学公式: x16sin 3 (t),y13cos(t)−5cos(2t)−2cos(3t)−cos(4t) 参数 t t 的范围决定爱心形状。 动态效果: 粒子…...
ssd202d-badblock-坏块检测
这边文章讲述的是坏快检测功能 思路: 1.第一次烧录固件会实现跳坏块,但是后续使用会导致坏块的产生; 于是我在uboot环境变量添加了两个变量来控制坏快 lb_badnum = //坏块个数 lb_badoff = //坏块所在位置 2.第一次开机会根据lb_badnum是否存在判断,如果不存在则保存上…...
使用html 和javascript 实现微信界面功能1
1.功能说明: 搜索模块: 提供一个搜索框,但目前没有实现具体的搜索功能。 好友模块: 在左侧的“好友”部分有一个“查看好友”按钮。点击左侧的“查看好友”按钮时,会在右侧显示所有好友的列表。列表中每个好友可以点击查看详情,包…...
趣味编程:猜拳小游戏
1.简介 这个系列的第一篇以猜拳小游戏开始,这是源于我们生活的灵感,在忙碌的时代中,我们每个人都在为自己的生活各自忙碌着,奔赴着自己所走向的那条路上,即使遍体鳞伤。 但是,生活虽然很苦,也不…...
图形化界面MySQL(MySQL)(超级详细)
目录 1.官网地址 1.1在Linux直接点击NO thanks..... 1.2任何远端登录,再把jj数据库给授权 1.3建立新用户 优点和好处 示例代码(MySQL Workbench) 示例代码(phpMyAdmin) 总结 图形化界面 MySQL 工具大全及其功…...
JavaScript技巧方法总结
技巧总结 字符串字符串首字母大写翻转字符串字符串过滤 数字十进制转换二进制、八进制、十六进制获取随机数字符串转数字指数幂运算 数组从数组中过滤出虚假值数组查找检测是否为一个安全数组数组清空实现并集、交集、和差集 对象检查对象是否为空从对象中选择指定数据动态属性…...
【Web】2023安洵杯第六届网络安全挑战赛 WP
目录 Whats my name easy_unserialize signal Swagger docs 赛题链接:GitHub - D0g3-Lab/i-SOON_CTF_2023: 2023 第六届安洵杯 题目环境/源码 Whats my name 第一段正则用于匹配以 include 结尾的字符串,并且在 include 之前,可以有任…...
【VUE2】纯前端播放海康视频录像回放,视频格式为rtsp格式,插件使用海康视频插件[1.5.4版本]
一、需求 1、后端从海康平台拉流视频回放数据,前端进行页面渲染播放,视频格式为rtsp eg: 基本格式:rtsp://<username>:<password><ip_addr>:<port>/<path>参数说明: usernameÿ…...
mysql程序介绍,选项介绍(常用选项,指定选项的方式,特性),命令介绍(查看,部分命令),从sql文件执行sql语句的两种方法
目录 mysql程序 介绍 选项 介绍 常用选项 指定选项的方式 编辑配置文件 环境变量 选项特性 指定选项 选项名 选项值 命令 介绍 查看客户端命令 tee/notee prompt source system help contents 从.sql文件执行sql语句 介绍 方式 source 从外部直接导入…...
3D 生成重建032-Find3D去找到它身上的每一份碎片吧
3D 生成重建032-Find3D去找到它身上的每一份碎片吧 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 该论文研究三维开放世界部件分割问题:基于任何文本查询分割任何物体中的任何部件。以往的方法在物体类别或部件词汇方面存在局限性。最近人工智能的进步在二…...
树莓派4B android 系统添加led灯 Hal 层
本文内容需要用到我上一篇文章做的驱动,可以先看文章https://blog.csdn.net/ange_li/article/details/136759249 一、Hal 层的实现 1.Hal 层的实现一般放在 vendor 目录下,我们在 vendor 目录下创建如下的目录 aosp/vendor/arpi/hardware/interfaces/…...
LLama系列模型简要概述
LLama-1(7B, 13B, 33B, 65B参数量;1.4T tokens训练数据量) 要做真正Open的AI Efficient:同等预算下,增大训练数据,比增大模型参数量,效果要更好 训练数据: 书、Wiki这种量少、质量高…...
Elasticsearch使用(2):docker安装es、基础操作、mapping映射
1 安装es 1.1 拉取镜像 docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/elasticsearch:7.17.3 1.2 运行容器 运行elasticsearch容器,挂载的目录给更高的权限,否则可能会因为目录权限问题导致启动失败: docker r…...
Python跳动的爱心
系列文章 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代码8Python普通的玫瑰花代码9Python炫酷的玫瑰花代码10Python多…...
安卓手机怎么轻松转换更新ip网络地址
随着移动互联网的快速发展,IP地址作为网络身份标识的重要性日益凸显。对于安卓手机用户来说,但有时候我们希望能够轻松转更换ip地址,以提高网络安全性或访问特定内容的需要。那么,安卓手机如何更换IP地址呢?本文将为您…...
socket UDP 环路回显的服务端
基于socket通讯的方式,无论用http或者udp或者自定义的协议,程序结构都是类似的。这个以UDP协议为例简要说明。 #include <stdio.h> // 标准输入输出库 #include <sys/types.h> // 提供了一些数据类型,如ssize_t #include <sy…...
单例模式的缺点
1. 违反单一职责原则 单例模式不仅管理对象的实例化,还负责提供对该实例的全局访问。这使得单例类承担了过多的职责。复杂的单例类可能变得难以维护和扩展。 2. 难以进行单元测试 单例模式引入了全局状态,使得测试环境中的依赖关系难以隔离。在测试中…...
如何通过看板进行跨境电商的圣诞商品数据分析与优化选品流程?
引言 随着圣诞季的临近,跨境电商迎来了重要的销售时机。选品工作对于跨境电商的成功至关重要,直接关系到销售业绩和利润。本文结合相关网页信息,深入探讨跨境电商在圣诞期间如何利用信息整合工具展开选品工作,并优化选品流程。同…...
【Linux】vi/vim 使用技巧
文章目录 1. 简介vi和vim的历史vi和vim的区别安装vimUbuntu/DebianCentOS/RHELFedoramacOSWindows 2. 基本操作启动和退出启动退出 模式介绍普通模式插入模式命令模式 光标移动基本移动高级移动 3. 文本编辑插入文本删除文本复制和粘贴撤销和重做 4. 搜索与替换基本搜索搜索文本…...
React的功能是什么?
以下是一些React的主要功能和特点: 组件化架构: React将UI拆分为可复用的独立组件,每个组件负责一部分UI的逻辑和展示。组件可以嵌套使用,形成复杂的UI结构。 虚拟DOM: React使用虚拟DOM来管理UI的状态和更新ÿ…...
【6】数据分析检测(DataFrame 1)
学习目标3 昨天,我们学习了Series。 而Pandas的另一种数据类型:DataFrame,在许多特性上和Series有相似之处。 今天,我们将学习DataFrame的相关知识: 1. DataFrame的概念 2. 构造一个DataFrame 3. DataFrame的常用…...
React初体验 - [Next.js项目]
效果 须知 Next.js与React有哪些区别?https://juejin.cn/post/7112334604027035655 React中文手册 https://react.docschina.org/learn/start-a-new-react-project Next.js中文手册 https://www.nextjs.cn/docs/getting-started 步骤 npx提速 - 更换npm国内源 - 参考文档 …...
学生信息管理系统(简化版)
前端部分(vue2) !!前端采用vue2框架,下面只写出必要的代码文件,想要使用需自行先创建vue项目 部分截图 下面是目录结构 下面是public文件夹里面的html文件 <!DOCTYPE html> <html lang"&q…...
网易云信荣获“HarmonyOS NEXT SDK星河奖”
近日,鸿蒙生态伙伴 SDK 开发者论坛在北京举行。 网易云信凭借在融合通信领域的技术创新和鸿蒙生态贡献,荣获鸿蒙生态“HarmonyOS NEXT SDK星河奖”。 会上,华为鸿蒙正式推出 SDK 生态繁荣伙伴支持计划,旨在为 SDK 领域伙伴和开发…...
Java版-图论-最小生成树-Prim算法
实现描述 如图: Prim算法的基本思想是从一个顶点开始,逐步构建最小生成树。具体步骤如下: 随机选取一个顶点作为起始点,并将其加入最小生成树的集合中。从该顶点出发,选择一条边连接到其他未被访问的顶点中的最小权值边。将该顶点加入到最小生成树的集合中,并标记为已…...
python-@property 和setter属性
T 一个装饰器,使得类中方法像属性一样被使用。 W 这是原本的类及其属性的访问 class Person():def __init__(self, firstname:str, lastname:str):self.first firstnameself.last lastnameself.full_name self.first self.lastdef printFullname(self):re…...