当前位置: 首页 > article >正文

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 bitsCSRC 标识符的数量(范围 0~15)。
M (Marker)1 bit标记位,载荷类型相关。例如:视频流中 1 表示帧结束。
PT (Payload Type)7 bits载荷类型(如 96 表示 H.264,需通过 SDP 的 a=rtpmap 映射)。
Sequence Number16 bits序列号,每发送一个 RTP 包递增 1,用于检测丢包和乱序。
Timestamp32 bits时间戳,基于媒体时钟(如视频 90 kHz,音频 44.1 kHz)。
SSRC32 bits同步源标识符,随机生成,唯一标识一个媒体源。
CSRC32 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)。
Length16 bitsRTCP 包的总长度(以 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)。

http://www.kler.cn/a/557495.html

相关文章:

  • Spring Boot3+Vue2极速整合:10分钟搭建DeepSeek AI对话系统
  • Linux/POSIX 多路IO复用
  • RTSP协议全解析
  • jQuery AJAX 方法详解
  • Java 异常(Exception)全面解析:类型与原理
  • 【网络安全】常见的web攻击
  • AI Agent实战:打造京东广告主的超级助手 | 京东零售技术实践
  • python与pycharm如何设置文件夹为源代码根目录
  • DeepSeek掘金——SpringBoot 调用 DeepSeek API 快速实现应用开发
  • 迎接2025,立个flag
  • 图像处理:模拟色差的生成
  • Spring MVC中环境配置的实战应用
  • 自制操作系统学习第七天
  • STM32-心知天气项目
  • Python----数据结构(队列,顺序队列,链式队列,双端队列)
  • 使用PyQt5和百度AI实现图片清晰度增强的GUI应用
  • Linux下安装中文输入法总结
  • pycharm中配置PyQt6详细教程
  • qt项目配置部署
  • java基于数组实现队列(二)