RTCP详解
在流媒体传输的过程中,除了要传送媒体数据外,还需要传送一些额外信息来保证媒体传输的正确性以及质量保证。因此需要RTCP(Real-Time Transport Control Protocol,实时数据传输的控制协议)与rtp结合使用。RTCP 通过定期发送控制包来提供一些关于 RTP 数据流的统计信息和控制信息,以便接收端和发送端能够进行协调和优化。RTCP包根据功能的不同有以下几种:[*]SR(Sender Report):PT 值为 200,发送端报告,用于报告发送端的统计信息,如发送端的时间戳、发送端的包数量、发送端的字节数等。SR 包可以让接受端计算往返延迟、计算丢包等。
[*]RR(Receiver Report):PT 值为 201,接收端报告,用于报告接收端的统计信息,如接收到的最高序列号、接收到的数据包数量、丢包数量等。发送端根据收到的rr包估算当前网络状态,常见网络状态估算算法有REMB- GCC、TFB-GCC等。
[*]SDES(Source Description):PT 值为 202,源描述,用于描述 RTP 数据源的信息,如源的名称、邮箱地址、电话号码等。
[*]BYE(Goodbye):PT 值为 203,用于通知其他参与者 RTP 会话的结束。
[*]APP(Application-specific):PT 值为 204,应用特定,用于传输自定义的控制信息。
[*]RTPFB(RTP Feedback):PT 值为 205,用于传输 RTP 数据包的反馈信息,如 NACK 请求、TMMBR(Temporary Maximum Media Stream Bit Rate Request)等。RTPFB 包可以帮助发送端了解接收端的反馈信息,并进行相应的调整。
[*]PSFB(Payload-specific Feedback):PT 值为 206,用于传输负载特定的反馈信息,如 Picture Loss Indication(PLI)、Slice Loss Indication(SLI)等。PSFB 包可以帮助发送端了解
[*]XR(Extended Report):PT 值为 207,扩展报告,用于传输更多的控制信息,如网络抖动、丢包率等信息。XR 包可以包含多个报告块(Block),每个报告块可以包含不同类型的控制信息。XR 包可以帮助接收端了解发送端的详细信息,并进行相应的处理。实际上XR包是作为信息的补充,由于SR、RR携带的信息相对固定,因此如果需要更加细节的信息就需要通过XR来传递,发送端和接受端都可以发送;
这里主要解析一下RR、SR和RTCP-BYE包的格式;RR包格式如下: 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| RC | PT=RR=201 | length |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| SSRC of packet sender |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| SSRC of media source |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| fraction lost | cumulative number of || | packets lost |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| extended highest sequence number received |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| interarrival jitter |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| last SR (LSR) |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| delay since last SR (DLSR) |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
RR 包的格式包含以下几个字段:
[*]版本号(V):占 2 位,用于指示 RTCP 协议的版本号,当前版本号为 2。
[*]填充位(P):占 1 位,用于指示 RR 包是否包含填充字节。如果 P=1,则表示 RR 包的末尾存在填充数据。
[*]报告计数器(RC):占 5 位,用于指示 RR 包中包含的报告块数目。
[*]报告类型(PT):占 8 位,用于指示 RTCP 包的类型,RR 包的 PT 值为 201。
[*]长度(length):占 16 位,用于指示 RR 包的长度,以 32 位字(4 个字节)为单位计算,不包括头部的 4 个字节。
[*]SSRC of packet sender:占 32 位,用于指示 RR 包的发送者的同步源(SSRC)标识符。
[*]SSRC of media source:占 32 位,用于指示 RR 包中报告的媒体源的同步源(SSRC)标识符。
接下来的字段是针对每个报告块的:
[*]fraction lost:占 8 位,用于表示自上次 RR 包发送后,丢失的数据包占接收到的数据包的比例,实际上在webrtc中,rr包计算的丢包率会偏低,因为发送过nack后收到的包是不算丢包的。
[*]cumulative number of packets lost:占 24 位,用于表示从会话开始到现在累计丢失的数据包数量。
[*]extended highest sequence number received:占 32 位,用于表示接收到的 RTP 数据包的最高序列号。
[*]interarrival jitter:占 32 位,用于表示接收端计算的 RTP 数据包之间的抖动。
[*]last SR (LSR):占 32 位,用于表示上次接收到的 SR(Sender Report)包的 NTP 时间戳的中间 32 位。
[*]delay since last SR (DLSR):占 32 位,用于表示从上次接收到 SR 包到发送此 RR 包之间的延迟,以 1/65536 秒为单位。
SR包格式如下: 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| RC | PT=SR=200 | length |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| SSRC of sender |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| NTP timestamp, most significant word |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| NTP timestamp, least significant word |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| RTP timestamp |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| sender's packet count |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| sender's octet count |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| report block || .... |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
SR 包的格式包含以下几个字段:
[*]版本号(V):占 2 位,用于指示 RTCP 协议的版本号,当前版本号为 2。
[*]填充位(P):占 1 位,用于指示 SR 包是否包含填充字节。如果 P=1,则表示 SR 包的末尾存在填充数据。
[*]报告计数器(RC):占 5 位,用于指示 SR 包中包含的报告块数目。
[*]报告类型(PT):占 8 位,用于指示 RTCP 包的类型,SR 包的 PT 值为 200。
[*]长度(length):占 16 位,用于指示 SR 包的长度,以 32 位字(4 个字节)为单位计算,不包括头部的 4 个字节。
[*]SSRC of sender:占 32 位,用于指示 SR 包的发送者的同步源(SSRC)标识符。
[*]NTP timestamp:占 64 位,用于表示发送端的 NTP(Network Time Protocol)时间戳。NTP 时间戳是一个绝对时间,用于同步发送端和接收端的时钟。接收端可以根据 NTP 时间戳来计算往返时延(RTT)和同步音视频数据的播放。
[*]RTP timestamp:占 32 位,用于表示发送端的 RTP 时间戳。RTP 时间戳是一个相对时间,用于确定音视频数据包在时间轴上的位置。接收端可以根据 RTP 时间戳来对音视频数据包进行排序和同步播放。
[*]sender's packet count:占 32 位,用于表示发送端发送的数据包数量。
[*]sender's octet count:占 32 位,用于表示发送端发送的数据包字节数量。
接下来的字段是针对每个报告块的:
[*]report block:包含了接收端的统计信息,如接收端的 SSRC、分组丢失率、抖动等。
RTCP-BYE格式如下: 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=BYE=203| length |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| SSRC/CSRC |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+: ... :+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| length of reason for leaving |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| reason for leaving |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+: ... :+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
BYE 包的格式包含以下几个字段:
[*]版本号(V):占 2 位,用于指示 RTCP 协议的版本号,当前版本号为 2。
[*]填充位(P):占 1 位,用于指示 BYE 包是否包含填充字节。如果 P=1,则表示 BYE 包的末尾存在填充数据。
[*]源计数器(SC):占 5 位,用于指示 BYE 包中包含的 SSRC/CSRC 标识符的数量。
[*]报告类型(PT):占 8 位,用于指示 RTCP 包的类型,BYE 包的 PT 值为 203。
[*]长度(length):占 16 位,用于指示 BYE 包的长度,以 32 位字(4 个字节)为单位计算,不包括头部的 4 个字节。
[*]SSRC/CSRC:占 32 位,用于指示 BYE 包中包含的 SSRC(同步源)或 CSRC(贡献源)标识符。一个 BYE 包可以包含多个 SSRC/CSRC 标识符,用于表示多个同步源或贡献源的会话结束。
[*]length of reason for leaving:占 8 位,用于指示离开原因的长度。这是一个可选字段,如果存在,表示 BYE 包中包含了离开原因的具体描述。
[*]reason for leaving:占若干个字节,用于描述会话结束的原因。这是一个可选字段,可以包含任意的文本信息,如 "用户退出"、"网络故障" 等。
感謝分享觀念~~{:6_299:} 謝謝分享
页:
[1]