跳到主要内容

4. 可区分的 RTP 和 RTCP 数据包

当 RTP 和 RTCP 数据包被复用到单一端口上时, RTCP packet type 字段在数据包中的位置与 RTP marker (M) bit 和 RTP payload type (PT) 的组合相同. 在满足两个限制时, 可使用该字段区分 RTP 和 RTCP 数据包: 1) 所使用的 RTP payload type 值不同于所使用的 RTCP packet type; 2) 对每个 RTP payload type (PT), PT+128 不同于所使用的 RTCP packet type. 第一个约束避免 RTP payload type 与 RTCP packet type 之间的直接冲突. 第二个约束避免设置了 marker bit 的 RTP 数据包与 RTCP 数据包之间发生冲突.

已知以下 RTP 与 RTCP packet type 之间的冲突:

  • RTP payload types 64-65 与原始 "RTP Payload Format for H.261 Video Streams" [3] 中定义的 (已废止) RTCP FIR 和 NACK 数据包冲突 (该文档已由 [17] 废止).

  • RTP payload types 72-76 与 RTP 规范 [1] 中定义的 RTCP SR, RR, SDES, BYE, 和 APP 数据包冲突.

  • RTP payload types 77-78 与 RTP/AVPF profile [4] 中定义的 RTCP RTPFB 和 PSFB 数据包冲突.

  • RTP payload type 79 与 RTCP 扩展报告 (Extended Report, XR) [5] 数据包冲突.

  • RTP payload type 80 与 "RTCP Extensions for Single-Source Multicast Sessions with Unicast Feedback" [6] 中定义的接收方摘要信息 (Receiver Summary Information, RSI) 数据包冲突.

未来可能会注册新的 RTCP packet type, 这会进一步减少在单一端口上复用 RTP 和 RTCP 时可用的 RTP payload type. 为支持这种复用, 未来的 RTCP packet type 分配应该在当前分配之后进行, 先使用 209-223 范围, 再使用 194-199 范围, 从而只阻塞 64-95 范围内的 RTP payload type. 只有在其他值已经耗尽时, 才应该使用 1-191 和 224-254 范围内的 RTCP packet type.

在这些约束下, 选择 RTP payload type 值时推荐遵循 RTP/AVP profile [7] 中的指南, 并增加一项限制: 64-95 范围内的 payload type 值不得使用. 具体而言, 在可能的情况下, 动态 RTP payload type 应该从 96-127 范围内选择. 如果该范围不足, 可以使用低于 64 的值. 在这种情况下, 推荐优先使用未由 [7] 静态分配的 payload type 编号.

注: 由于 [1] 的 Section 6.1 规定所有 RTCP 数据包必须作为复合数据包发送, 并以 Sender Report (SR) 或 Receiver Report (RR) 数据包开头, 读者可能会疑惑, 为什么在复用 RTP 和 RTCP 时还要禁止 72 和 73 以外的 RTP payload type. 这样做是为了支持 [18], 后者允许在某些情况下使用非复合 RTCP 数据包.