RTCP(RTP Control Protocol)RTP 控制协议,和 RTP 成对使用,主要职责为:
- 媒体同步:通过 NTP 时间戳实现音视频同步
- 质量反馈:报告丢包率、抖动等统计信息
- 成员管理:追踪会话参与者的加入/离开
- 带宽管理:动态调整发送速率
一 RTCP包类型(RFC3550定义)
| 类型 | 名称 | 用途 |
|---|---|---|
| 200 | SR(Sender Report) | 发送者报告,包含发送统计和时间戳 |
| 201 | RR(Receiver Report) | 接收者报告,包含接收统计 |
| 202 | SDES(Source Description) | 源描述,包含 CNAME、NAME 等信息 |
| 203 | BYE | 离开通知 |
| 204 | APP | 应用自定义数据 |
二、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) |
| length | 16-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 sender | n | 发送端媒体流 SSRC |
| NTP Timestamp MSW | 32位 | NTP 时间戳高32位(1900年起的秒数)。绝对墙上时钟(国际标准时间) |
| NTP Timestamp LSW | 32位 | NTP 时间戳低32位(秒的小数部分),核心作用:和下方 RTP 时间戳做映射,接收端计算音视频同步偏移。 |
| RTP Timestamp | 32位 | 与 NTP 时间对应的 RTP 时间戳,发送该 SR 包瞬间对应的媒体流 RTP 时间戳; 结合 NTP,把相对媒体时间戳换算成真实绝对时间,实现唇同步。 |
| Packet Count | 32位 | 发送的 RTP 包总数 ,发送至今总 RTP 包数量 |
| Octet Count | 32位 | 发送的字节总数,发送至今总媒体字节数(不含 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_n | 32位 | 被报告源的 SSRC |
| Fraction Lost | 8位 | 最近报告周期内的丢包率(0-255),对应 0~100% |
| Cumulative Lost | 24位 | 累计丢包数(有符号) |
| Extended Highest Seq | 32位 | 最高扩展序列号,收到的最大序列号(扩展 32 位,解决 16 位循环溢出) |
| Jitter | 32位 | 抖动值(RTP时间戳单位),网络抖动,单位媒体时钟 tick |
| LSR | 32位 | 上次收到的 SR 时间戳 |
| DLSR | 32位 | 自上次 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 项类型:
| 类型 | 名称 | 用途 |
|---|---|---|
| 0 | END | 项列表结束标记 |
| 1 | CNAME | 规范名称(强制) |
| 2 | NAME | 用户名称 |
| 3 | 电子邮件 | |
| 4 | PHONE | 电话号码 |
| 5 | LOC | 地理位置 |
| 6 | TOOL | 工具名称 |
| 7 | NOTE | 备注 |
| 8 | PRIV | 私有扩展 |
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 子包复合包规则:
- 第一个子包必须是 SR 或 RR
- SDES 必须包含且仅包含一个 CNAME 项
- BYE 应放在复合包末尾