设为首页收藏本站language→→ 语言切换

鸿鹄论坛

 找回密码
 论坛注册

QQ登录

先注册再绑定QQ

查看: 1084|回复: 1
收起左侧

[分享] RTCP详解

[复制链接]
 成长值: 59260
发表于 2024-2-18 14:10:48 | 显示全部楼层 |阅读模式
在流媒体传输的过程中,除了要传送媒体数据外,还需要传送一些额外信息来保证媒体传输的正确性以及质量保证。因此需要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:占若干个字节,用于描述会话结束的原因。这是一个可选字段,可以包含任意的文本信息,如 "用户退出"、"网络故障" 等。

发表于 2024-4-18 06:30:19 | 显示全部楼层
感謝分享觀念~~
沙发 2024-4-18 06:30:19 回复 收起回复
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2024-5-2 07:07 , Processed in 0.066471 second(s), 9 queries , Redis On.  

  Powered by Discuz!

  © 2001-2024 HH010.COM

快速回复 返回顶部 返回列表