RTSP场景下的RTP与RTCP
一、RTP 数据包格式(RFC 3550 Section 5.1)
1. 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|X| CC |M| PT | Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| CSRC (可选) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload |
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2. 字段详解
字段 | 长度 | 说明 |
---|---|---|
V (Version) | 2 bits | 版本号,固定为 2 (二进制 10 )。 |
P (Padding) | 1 bit | 填充位。1 表示包尾有填充字节(用于对齐加密块)。 |
X (Extension) | 1 bit | 扩展头标志。1 表示存在扩展头(RFC 5285 定义)。 |
CC (CSRC Count) | 4 bits | CSRC 标识符的数量(范围 0~15)。 |
M (Marker) | 1 bit | 标记位,载荷类型相关。例如:视频流中 1 表示帧结束。 |
PT (Payload Type) | 7 bits | 载荷类型(如 96 表示 H.264,需通过 SDP 的 a=rtpmap 映射)。 |
Sequence Number | 16 bits | 序列号,每发送一个 RTP 包递增 1,用于检测丢包和乱序。 |
Timestamp | 32 bits | 时间戳,基于媒体时钟(如视频 90 kHz,音频 44.1 kHz)。 |
SSRC | 32 bits | 同步源标识符,随机生成,唯一标识一个媒体源。 |
CSRC | 32 bits | 贡献源列表(可选),最多 15 个 SSRC,用于混流场景。 |
Payload | 可变 | 媒体数据(如 H.264 NALU、AAC 帧)。 |
二、RTCP 控制包格式(RFC 3550 Section 6)
1. RTCP 通用头部
所有 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 | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload |
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段 | 长度 | 说明 |
---|---|---|
V (Version) | 2 bits | 版本号,固定为 2 。 |
P (Padding) | 1 bit | 填充位。1 表示包尾有填充字节(与 RTP 类似)。 |
RC (Reception Count) | 5 bits | 接收报告块数量(仅用于 SR/RR)。 |
PT (Packet Type) | 8 bits | 包类型(如 200 =SR,201 =RR,202 =SDES,203 =BYE)。 |
Length | 16 bits | RTCP 包的总长度(以 32 位字为单位,减 1)。 |
2. Sender Report (SR) 报文格式
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=5 | PT=200 | Length=28 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of Sender |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NTP Timestamp (64 bits) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP Timestamp (32 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sender's Packet Count |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sender's Octet Count |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC_1 (SSRC of first source) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Fraction Lost | Cumulative Lost |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Extended Highest Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Jitter (32 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Last SR Timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Delay Since Last SR |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段详解:
- NTP Timestamp:64 位 NTP 时间戳(高 32 位为秒,低 32 位为小数秒)。
- RTP Timestamp:与 NTP 时间戳对应的 RTP 时间戳。
- Sender’s Packet/Octet Count:发送端累计发送的包数和字节数。
- SSRC_1:接收报告块的 SSRC(最多 31 个接收报告)。
3. Receiver Report (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=1 | PT=201 | Length=7 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of Receiver |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of Source |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Fraction Lost | Cumulative Lost |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Extended Highest Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Jitter (32 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Last SR Timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Delay Since Last SR |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
关键 QoS 字段:
- Fraction Lost:8 位无符号整数,丢包率 =
Fraction Lost / 256.0 * 100%
。 - Cumulative Lost:24 位无符号整数,累计丢包数。
- Extended Highest Sequence Number:32 位序列号(高 16 位为循环计数)。
- Jitter:32 位无符号整数,抖动值(单位:RTP 时间戳间隔的 1/16)。
- Last SR Timestamp:最近收到的 SR 包中的 NTP 时间戳(中间 32 位)。
- Delay Since Last SR:从收到 SR 到发送 RR 的延迟(单位:1/65536 秒)。
4. Source Description (SDES) 报文格式
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=1 | PT=202 | Length=3 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC/CSRC |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| CNAME=1 | Length | user@example.com... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NAME=2 | Length | John Doe... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| END=0 | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明:
- CNAME:规范名(必选),格式为
user@host
或随机字符串,用于跨流同步。 - NAME/EMAIL/PHONE:可选描述字段。
- END:0 字节结束标记。
5. BYE 报文格式
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=1 | PT=203 | Length=1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC/CSRC |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reason | Length | "Network Error"... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明:
- Reason:可选,ASCII 编码的离开原因(如 “Network Error”)。
三、RTCP 复合包示例
一个典型的 RTCP 复合包可能包含多个报告:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SR (Sender Report) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SDES (CNAME) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| BYE (Leave Reason) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
四、QoS 参数计算规则(RFC 3550 Appendix A)
1. 丢包率(Fraction Lost)
expected = highest_seq - initial_seq + 1
received = packets_received
lost = expected - received
fraction_lost = (lost << 8) / expected // 结果范围 0~255
2. 抖动(Jitter)
// 对于第 i 个包:
arrival_time = current_time - initial_time
transit_time = arrival_time - rtp_timestamp
previous_transit = transit_time of packet i-1
D(i) = |transit_time - previous_transit|
jitter = jitter + (D(i) - jitter) / 16
3. 往返时间(RTT)
// 接收端计算:
last_sr_ntp = (SR 包中的 NTP 时间戳)
delay_since_last_sr = (收到 SR 到发送 RR 的延迟)
rtt = current_ntp_time - last_sr_ntp - delay_since_last_sr
五、总结
- RTP:负责媒体数据传输,通过序列号和时间戳支持实时播放。
- RTCP:通过 SR/RR 报文实现网络质量监控,SDES/BYE 维护会话元数据。
- QoS 控制:基于丢包率、抖动、RTT 动态调整缓冲区或码率(需应用层逻辑)。
- 协议扩展:RFC 3550 为基础,NACK/PLI/REMB 等高级功能需参考后续 RFC(如 4585、5104)。