协议之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 应放在复合包末尾