协议之RTCP介绍

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 EMAIL 电子邮件
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 子包

复合包规则

  1. 第一个子包必须是 SR 或 RR
  2. SDES 必须包含且仅包含一个 CNAME 项
  3. BYE 应放在复合包末尾
相关推荐
却道天凉_好个秋3 个月前
音视频学习(九十四):NACK和RTX
音视频·nack·rtcp·rtx
却道天凉_好个秋3 个月前
音视频学习(九十三):CompoundRTCP
音视频·rtcp·compoundrtcp
REDcker4 个月前
RTP、RTCP 与 SRTP 协议详解
网络·音视频·webrtc·实时音视频·rtp·rtcp
小李独爱秋6 个月前
计算机网络经典问题透视:RTCP协议深度解析——从应用场景到五大分组类型
网络·网络协议·tcp/ip·计算机网络·信息与通信·rtcp
好多渔鱼好多6 个月前
【流媒体协议】RTCP 协议介绍
rtcp
好多渔鱼好多6 个月前
【流媒体协议】RTSP / RTP / RTCP 协议全景介绍
网络·网络协议·rtp·rtsp·rtcp·ipc摄像头
赖small强8 个月前
【ZeroRange WebRTC】NACK(Negative Acknowledgment)技术深度分析
webrtc·nack·rtcp·丢包检测·主动请求重传
赖small强8 个月前
【ZeroRange WebRTC】RTP/RTCP/RTSP协议深度分析
webrtc·rtp·rtsp·rtcp
邪恶的贝利亚1 年前
万字详解RTR RTSP SDP RTCP
网络·sdp·rtsp·rtcp·rtr