当前位置: 首页 > news >正文

协议之RTCP介绍

RTCP(RTP Control Protocol)RTP 控制协议,和 RTP 成对使用,主要职责为:

  • 媒体同步:通过 NTP 时间戳实现音视频同步
  • 质量反馈:报告丢包率、抖动等统计信息
  • 成员管理:追踪会话参与者的加入/离开
  • 带宽管理:动态调整发送速率

一 RTCP包类型(RFC3550定义)

类型名称用途
200SR(Sender Report)发送者报告,包含发送统计和时间戳
201RR(Receiver Report)接收者报告,包含接收统计
202SDES(Source Description)源描述,包含 CNAME、NAME 等信息
203BYE离开通知
204APP应用自定义数据

二、RTCP公共头结构

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 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明
V(Version)0-1版本号,固定为 2
P(Padding)2是否有填充(用于加密对齐)
RC(Report Count)3-7报告块数量(SR/RR)或子类型(APP)
PT(Payload Type)8-15包类型(200=SR, 201=RR, 202=SDES, 203=BYE, 204=APP)
length16-31包长度(单位:32位字,不包含头部)

三、RTCP包类型详解

3.1 SR(Sender Report)- 发送者报告 PT=200

SR 由主动发送 RTP 数据的端点发送,包含发送统计和 NTP/RTP 时间戳映射。

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 1 (if RC > 0) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | report block 2 (if RC > 1) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | . | | . |
字段长度说明
SSRC of sendern发送端媒体流 SSRC
NTP Timestamp MSW32位NTP 时间戳高32位(1900年起的秒数)。绝对墙上时钟(国际标准时间)
NTP Timestamp LSW32位NTP 时间戳低32位(秒的小数部分),核心作用:和下方 RTP 时间戳做映射,接收端计算音视频同步偏移。
RTP Timestamp32位与 NTP 时间对应的 RTP 时间戳,发送该 SR 包瞬间对应的媒体流 RTP 时间戳; 结合 NTP,把相对媒体时间戳换算成真实绝对时间,实现唇同步。
Packet Count32位发送的 RTP 包总数 ,发送至今总 RTP 包数量
Octet Count32位发送的字节总数,发送至今总媒体字节数(不含 RTP 头)

3.2 RR(Receiver Report)- 接收者报告 PT=201

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 sender | +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ | report block 1 (if RC > 0) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | . | | . |

报告块结构(每个 24 字节):

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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | SSRC_1 (source being reported) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | fraction lost | cumulative number of packets lost | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | extended highest sequence number received | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | interarrival jitter | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | LSR (last SR) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | DLSR (delay since last SR) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段长度说明
SSRC_n32位被报告源的 SSRC
Fraction Lost8位最近报告周期内的丢包率(0-255),对应 0~100%
Cumulative Lost24位累计丢包数(有符号)
Extended Highest Seq32位最高扩展序列号,收到的最大序列号(扩展 32 位,解决 16 位循环溢出)
Jitter32位抖动值(RTP时间戳单位),网络抖动,单位媒体时钟 tick
LSR32位上次收到的 SR 时间戳
DLSR32位自上次 SR 以来的延迟,收到远端 SR 到当前发送 RR 的间隔,单位 1/65536 秒; 接收端用 LSR+DLSR 计算往返时延 RTT

3.3 SDES(Source Description)- 源描述PT=202

SDES 包含参与者的文本描述信息。

SDES通用4字节头 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | SSRC | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Item Type | Length | 文本内容... | 0(结束标记) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 所处位置 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 | | . | | . | | SSRC/CSRC_2 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | SDES items | | . |

SDES 项类型

类型名称用途
0END项列表结束标记
1CNAME规范名称(强制)
2NAME用户名称
3EMAIL电子邮件
4PHONE电话号码
5LOC地理位置
6TOOL工具名称
7NOTE备注
8PRIV私有扩展

3.4 BYE-离开通知 PT=203

BYE 用于通知其他参与者某源将离开会话。

通用 4 字节头 +N 个 SSRC(每个 4 字节,RC 个) 可选:退出原因文本(1 字节长度 + 字符串)

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 | 通用4字节 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | SSRC/CSRC_1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | SSRC/CSRC_2 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | . | | . | | (optional) length of reason | reason for leaving... | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

3.5 APP-自定义扩展块PT=204

厂商私有扩展,用于传输自定义 QoS、硬件状态、业务信令 结构: 通用 4 字节头 32bit 应用标识(4 个 ASCII 字符) 剩余:自定义二进制数据

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| subtype | PT=APP=204 | length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | SSRC/CSRC | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | name (4 bytes) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | application-dependent data | | . |

name: 头

applicantion-dependent data: 扩展数据内容

四、RTCP复合包

RTCP 支持复合包(Compound Packet),即多个 RTCP 子包组合在一个 UDP 包中:

SR 子包 | RR 子包 | SDES 子包 | BYE 子包 | APP 子包

复合包规则

  1. 第一个子包必须是 SR 或 RR
  2. SDES 必须包含且仅包含一个 CNAME 项
  3. BYE 应放在复合包末尾
http://www.jsqmd.com/news/1120968/

相关文章:

  • readpe高级用法:CSV/XML/HTML输出格式定制与自动化分析技巧
  • postcss-write-svg与构建工具集成:Gulp/Grunt/PostCSS配置教程
  • Windows Research Kernel (WRK) 本地过程调用(LPC):Windows进程间通信的内核实现
  • 陶瓷基板在PCB设计中的核心价值与应用解析
  • Moodle完全指南:如何用3步创建您的第一个在线课程?
  • SC PV PVC volume svc的定义和区别
  • Node.js应用安全防护:从SQL注入与XSS攻击原理到实战防御体系构建
  • 3个颠覆性方法解决Iwara视频下载难题:让你的收藏效率提升500%
  • 3分钟掌握猫抓Cat-Catch:网页视频音频资源一键捕获终极指南
  • 【免费下载】 JHenTai 漫画阅读器开源项目教程
  • 开源Unity替代引擎Prowl:从痛点分析到完整解决方案
  • 炉石传说HsMod插件:让游戏体验焕然一新的55个实用功能
  • C语言内存编址
  • Ubuntu遭DDoS攻击事件剖析:漏洞修复受阻与基础设施韧性思考
  • Mermaid Live Editor:告别拖拽,用代码思维重塑图表创作体验
  • HsMod:基于BepInEx的炉石传说终极增强插件完全指南
  • Runbook:革命性Ruby自动化框架 - 10分钟快速上手指南
  • ClusterIP、NodePort、LoadBalancer 和 ExternalName
  • StatefulLayout核心API解析:showLoading/showEmpty/showError等方法全攻略
  • Turnilo性能优化:提升大数据集探索效率的8个方法
  • 终极Mac清理工具Mole:用一行命令释放数十GB存储空间
  • Windows Research Kernel (WRK) 缓存管理器分析:Windows文件系统性能优化的秘密
  • LV30条码扫描器与PIC18F47Q10微控制器硬件设计与优化
  • Gradle Docker插件实战:从零开始构建Java应用Docker镜像
  • 如何让AI告别平庸设计:Taste-Skill完整使用指南与实战技巧
  • 静态网站SEO检查:Instatic内容分析与优化建议终极指南
  • NCSN预训练模型使用指南:快速生成MNIST/CelebA/CIFAR-10样本
  • Context安全指南:保护你的MCP服务器认证与数据隐私
  • VINS-Mono:如何快速构建高精度单目视觉惯性里程计系统
  • HsMod深度解析:炉石传说终极游戏体验增强框架完全指南