什么是Compound RTCP?
Compound RTCP 指的是:将多个 RTCP 报文(RTCP Packet)组合在一起,通过一次 UDP 发送的复合数据包。根据协议规范(RFC 3550),一个合法的 RTCP 数据包通常必须是一个 Compound RTCP 包,而不是单独发送某一种 RTCP 报文。
换句话说,RTCP 发送时并不是只发送一个 SR 或 RR,而是多个 RTCP 子包拼接形成一个整体。
Compound RTCP 的结构组成
一个 Compound RTCP 包由多个 RTCP 子包按顺序拼接组成,每个子包都有独立的头部。典型结构如下:
[ RTCP Header | SR ]
[ RTCP Header | SDES ]
[ RTCP Header | BYE (optional) ]
[ RTCP Header | APP (optional) ]
常见 RTCP 子包类型:
- SR(Sender Report)
- 由发送端使用
- 提供发送统计信息(发送字节数、包数、时间戳等)
- RR(Receiver Report)
- 由接收端使用
- 提供接收质量反馈(丢包率、抖动、延迟等)
- SDES(Source Description)
- 描述信息(如 CNAME、用户标识)
- Compound RTCP 中必须包含
- BYE
- 表示离开会话
- APP
- 自定义扩展数据
协议要求
RFC 3550 对 Compound RTCP 有明确规定:
1. 必须包含至少两个 RTCP 子包
- 第一个必须是:
- SR(如果该端在发送 RTP)
- 或 RR(如果仅接收)
- 第二个必须是:
- SDES(且必须包含 CNAME)
这是 Compound RTCP 的核心约束。
2. 必须按顺序排列
典型顺序为:
SR/RR → SDES → BYE → APP
顺序错误可能导致解析失败或协议不兼容。
3. 对齐要求
- 每个 RTCP 子包长度必须是 32bit 对齐
- Compound 包整体也是按 4 字节对齐
设计目的
Compound RTCP 的设计主要有以下几个目的:
1. 提高传输效率
将多个控制信息打包发送,减少 UDP 包数量,降低网络开销。
2. 保证关键信息必达
通过强制包含 SDES(尤其是 CNAME),确保:
- 每个参与者可被唯一标识
- 支持多流同步(音视频同步依赖 CNAME)
3. 提供完整上下文
一个 Compound RTCP 包可以同时包含:
- 发送统计(SR)
- 接收反馈(RR)
- 身份信息(SDES)
接收端可以一次性获取完整状态。
4. 支持带宽控制机制
RTCP 有带宽占比限制(默认 5%),Compound 机制可:
- 控制发送频率
- 动态调整报告间隔
流程示例
发送端(Sender)
发送 RTP 数据后,周期性发送:
Compound RTCP:
SR(发送统计)
SDES(CNAME)
接收端(Receiver)
接收 RTP 后,周期性发送:
Compound RTCP:
RR(接收质量)
SDES(CNAME)
结束会话
Compound RTCP:
BYE
SDES(可选但常见)
作用
在 WebRTC、SRS、GB28181 等系统中,Compound RTCP 承担关键功能:
1. QoS 质量监控
- 丢包率(fraction lost)
- 抖动(jitter)
- RTT(往返时延)
用于码率自适应(如 GCC、BBR)
2. 音视频同步
- SR 中的 RTP 时间戳 + NTP 时间
- SDES 中的 CNAME
实现 A/V Sync
3. 拥塞控制
RTCP 提供反馈数据,驱动:
- WebRTC 拥塞控制算法
- 带宽估计
4. 会话管理
- BYE 控制离会
- SDES 标识用户
总结
Compound RTCP 是 RTCP 协议中的核心机制,其本质是多个 RTCP 子报文的组合发送机制。它通过强制结构(SR/RR + SDES)保证了实时通信中的:
- 身份标识一致性(CNAME)
- 传输质量反馈(RR/SR)
- 会话控制(BYE)
- 高效网络利用
在现代流媒体系统(如 WebRTC、SRS、GB28181)中,Compound RTCP 是实现自适应码率控制、音视频同步和网络质量评估的基础。