RTSP场景下的RTP与RTCP

[复制链接]
发表于 2025-10-27 05:38:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、RTP 数据包格式(RFC 3550 Section 5.1)

1. RTP 头部结构
  1. 0                   1                   2                   3
  2. 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
  3. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  4. |V=2|P|X|  CC   |M|     PT      |       Sequence Number         |
  5. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  6. |                           Timestamp                           |
  7. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  8. |                           SSRC                                |
  9. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  10. |                           CSRC (可选)                         |
  11. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  12. |                            Payload                            |
  13. |                              ...                              |
  14. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码
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 包共享以下头部结构:
  1. 0                   1                   2                   3
  2. 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
  3. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  4. |V=2|P|   RC    |       PT      |             Length            |
  5. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  6. |                            Payload                            |
  7. |                              ...                              |
  8. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码
字段长度分析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) 报文格式
  1. 0                   1                   2                   3
  2. 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
  3. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  4. |V=2|P|   RC=5  |      PT=200   |             Length=28          |
  5. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  6. |                           SSRC of Sender                       |
  7. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  8. |                         NTP Timestamp (64 bits)                |
  9. |                                                               |
  10. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  11. |                         RTP Timestamp (32 bits)                |
  12. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  13. |                         Sender's Packet Count                  |
  14. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  15. |                         Sender's Octet Count                   |
  16. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  17. |          SSRC_1 (SSRC of first source)                         |
  18. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  19. |          Fraction Lost |       Cumulative Lost                 |
  20. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  21. |           Extended Highest Sequence Number                     |
  22. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  23. |                      Jitter (32 bits)                          |
  24. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  25. |                         Last SR Timestamp                      |
  26. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  27. |                         Delay Since Last SR                    |
  28. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码
字段详解:

  • NTP Timestamp:64 位 NTP 时间戳(高 32 位为秒,低 32 位为小数秒)。
  • RTP Timestamp:与 NTP 时间戳对应的 RTP 时间戳。
  • Sender’s Packet/Octet Count:发送端累计发送的包数和字节数。
  • SSRC_1:吸取陈诉块的 SSRC(最多 31 个吸取陈诉)。

3. Receiver Report (RR) 报文格式
  1. 0                   1                   2                   3
  2. 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
  3. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  4. |V=2|P|   RC=1  |      PT=201   |             Length=7           |
  5. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  6. |                           SSRC of Receiver                     |
  7. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  8. |                           SSRC of Source                       |
  9. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  10. |          Fraction Lost         |       Cumulative Lost         |
  11. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  12. |           Extended Highest Sequence Number                     |
  13. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  14. |                      Jitter (32 bits)                          |
  15. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  16. |                         Last SR Timestamp                      |
  17. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  18. |                         Delay Since Last SR                    |
  19. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码
关键 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) 报文格式
  1. 0                   1                   2                   3
  2. 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
  3. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  4. |V=2|P|   RC=1  |      PT=202   |             Length=3           |
  5. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  6. |                           SSRC/CSRC                            |
  7. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  8. |     CNAME=1    |     Length    |       [email protected]...     |
  9. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  10. |     NAME=2     |     Length    |         John Doe...           |
  11. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  12. |     END=0      |                    Padding                    |
  13. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码
字段分析:

  • CNAME:规范名(必选),格式为 user@host 或随机字符串,用于跨流同步。
  • NAME/EMAIL/PHONE:可选形貌字段。
  • END:0 字节竣事标记。

5. BYE 报文格式
  1. 0                   1                   2                   3
  2. 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
  3. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  4. |V=2|P|   RC=1  |      PT=203   |             Length=1           |
  5. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  6. |                           SSRC/CSRC                            |
  7. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  8. |     Reason     |    Length     |       "Network Error"...      |
  9. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码
字段分析:

  • Reason:可选,ASCII 编码的脱离缘故起因(如 “Network Error”)。

三、RTCP 复合包示例

一个范例的 RTCP 复合包大概包罗多个陈诉:
  1. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  2. |                          SR (Sender Report)                    |
  3. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  4. |                          SDES (CNAME)                          |
  5. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  6. |                          BYE (Leave Reason)                    |
  7. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码

四、QoS 参数盘算规则(RFC 3550 Appendix A)

1. 丢包率(Fraction Lost)
  1. expected = highest_seq - initial_seq + 1
  2. received = packets_received
  3. lost = expected - received
  4. fraction_lost = (lost << 8) / expected  // 结果范围 0~255
复制代码
2. 抖动(Jitter)
  1. // 对于第 i 个包:
  2. arrival_time = current_time - initial_time
  3. transit_time = arrival_time - rtp_timestamp
  4. previous_transit = transit_time of packet i-1
  5. D(i) = |transit_time - previous_transit|
  6. jitter = jitter + (D(i) - jitter) / 16
复制代码
3. 往返时间(RTT)
  1. // 接收端计算:
  2. last_sr_ntp = (SR 包中的 NTP 时间戳)
  3. delay_since_last_sr = (收到 SR 到发送 RR 的延迟)
  4. 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)。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表