11. 网络和传输协议上的RTP (RTP over Network and Transport Protocols)
本节描述了在特定的网络和传输协议中传输RTP数据包的问题。除非此规范之外的协议特定定义覆盖,否则以下规则适用。
RTP依赖底层协议提供RTP数据和RTCP控制流的复用。对于UDP和类似的协议,RTP应使用偶数目的目标端口号,相应的RTCP流应使用下一个较高的(奇数)目标端口号。对于将单个端口号作为参数并从该号码派生RTP和RTCP端口对的应用程序,如果提供了奇数,则应用程序应将该号码替换为较低的(偶数)号码,用作端口对的基数。对于通过显式、单独的参数指定RTP和RTCP目标端口号的应用程序(使用信令协议或其他手段),应用程序可以忽略端口号为偶数/奇数且连续的限制,尽管仍鼓励使用偶数/奇数的端口对。RTP和RTCP端口号不能相同,因为RTP依赖于端口号来复用RTP数据和RTCP控制流。
在单播会话中,两个参与者都需要确定用于接收RTP和RTCP数据包的端口对。两个参与者可以使用相同的端口对。参与者不能假设传入RTP或RTCP数据包的源端口可以用作传出RTP或RTCP数据包的目标端口。当RTP数据包在双向发送时,每个参与者的RTCP SR数据包必须发送到另一参与者指定用于接收RTCP的端口。RTCP SR数据包将发送方信息与传入数据的接收报告信息进行合并。如果一方不活跃地发送数据(参见第6.4节),则发送RTCP RR数据包。
推荐使用分层编码应用程序(参见第2.4节)使用一组连续的端口号。端口号必须是唯一的,因为现有操作系统中存在的普遍缺陷阻止了使用同一端口与多个多播地址,而对于单播,只有一个合法地址。因此,对于层n,数据端口是P + 2n,控制端口是P + 2n + 1。当使用IP多播时,地址也必须是不同的,因为多播路由和组成员资格是基于地址的粒度进行管理。然而,不能假定连续的IP多播地址的分配,因为一些组可能需要不同的范围,因此可能被分配在不同的地址范围中。
前面的段落与SDP规范RFC 2327 [15]冲突,后者指出,在同一个会话描述中,指定多个地址和多个端口是非法的,因为地址与端口的关联可能是模糊的。打算在RFC 2327的修订稿中放宽此限制,以允许指定相等数量的地址和端口,并隐含进行一对一映射。
RTP数据包不包含长度字段或其他分界字段,因此RTP依赖底层协议提供长度指示。RTP数据包的最大长度仅受底层协议的限制。
如果要在提供连续八位字节流而不是消息(数据包)的底层协议中传输RTP数据包,则必须定义RTP数据包的封装以提供帧机制。如果底层协议可能包含填充,以便无法确定RTP负载的范围,则还需要帧机制。此处未定义帧机制。
即使在提供帧的协议中传输RTP时,配置文件也可以指定要使用的帧方法,以允许在一个较低层协议数据单元(如UDP数据包)中携带多个RTP数据包。在一个网络或传输数据包中传输多个RTP数据包可以减少头部开销,并且可以简化不同流之间的同步。