实时传输协议(RTP)为数据提供了具有实时特征的端对端传送服务,如在组播或单播网络服务下的交互式视频音频或模拟数据。应用程序通常在 UDP 上运行 RTP 以便使用其多路结点和校验服务;这两种协议都提供了传输层协议的功能。但是 RTP 可以与其它适合的底层网络或传输协议一起使用。如果底层网络提供组播方式,那么 RTP 可以使用该组播表传输数据到多个目的地。
RTP 本身并没有提供按时发送机制或其它服务质量(QoS)保证,它依赖于低层服务去实现这一过程。 RTP 并不保证传送或防止无序传送,也不确定底层网络的可靠性。 RTP 实行有序传送, RTP 中的序列号允许接收方重组发送方的包序列,同时序列号也能用于决定适当的包位置,例如:在视频解码中,就不需要顺序解码。
RTP 由两个紧密链接部分组成:
- RTP ― 传送具有实时属性的数据;
- RTP 控制协议(RTCP) ― 监控服务质量并传送正在进行的会话参与者的相关信息。RTCP 第二方面的功能对于“松散受控”会话是足够的,也就是说,在没有明确的成员控制和组织的情况下,它并不非得用来支持一个应用程序的所有控制通信请求。
| 协议结构 |
1 | 2 | 3 | 8 | 9 | 16bit |
V | P | X | CSRC Count | M | Payload Type |
Sequence number | Timestamp |
SSRC | CSRC (variable 0 – 15 items 32bits each) |
- V ― 版本。识别 RTP 版本。
- P ― 间隙(Padding)。设置时,数据包包含一个或多个附加间隙位组,其中这部分不属于有效载荷。
- X ― 扩展位。设置时,在固定头后面,根据指定格式设置一个扩展头。
- CSRC Count ― 包含 CSRC 标识符(在固定头后)的编号。
- M ― 标记。标记由 Profile 文件定义。允许重要事件如帧边界在数据包流中进行标记。
- Payload Type ― 识别 RTP 有效载荷的格式,并通过应用程序决定其解释。Profile 文件规定了从 Payload 编码到 Payload 格式的缺省静态映射。另外的 Payload Type 编码可能通过非 RTP 方法实现动态定义。
- Sequence Number ― 每发送一个 RTP 数据包,序列号增加1。接收方可以依次检测数据包的丢失并恢复数据包序列。
- Timestamp ― 反映 RTP 数据包中的第一个八位组的采样时间。采样时间必须通过时钟及时提供线性无变化增量获取,以支持同步和抖动计算。
- SSRC ― 同步源。该标识符随机选择,旨在确保在同一个 RTP 会话中不存在两个同步源具有相同的 SSRC 标识符。
- CSRC ― 贡献源标识符。识别该数据包中的有效载荷的贡献源。
RTP(Real-timeTransportProtocol)是用于Internet上针对多媒体数据流的一种传输协议。RTP被定义为在一对一或一对多的传输情况下工作,其目的是提供时间信息和实现流同步。RTP通常使用UDP来传送数据,但RTP也可以在TCP或ATM等其他协议之上工作。当应用程序开始一个RTP会话时将使用两个端口:一个给RTP,一个给RTCP。RTP本身并不能为按顺序传送数据包提供可靠的传送机制,也不提供流量控制或拥塞控制,它依靠RTCP提供这些服务。通常RTP算法并不作为一个独立的网络层来实现,而是作为应用程序代码的一部分。实时传输控制协议RTCP。RTCP(Real-timeTransportControlProtocol)和RTP一起提供流量控制和拥塞控制服务。在RTP会话期间,各参与者周期性地传送RTCP包。RTCP包中含有已发送的数据包的数量、丢失的数据包的数量等统计资料,因此,服务器可以利用这些信息动态地改变传输速率,甚至改变有效载荷类型。RTP和RTCP配合使用,它们能以有效的反馈和最小的开销使传输效率最佳化,因而特别适合传送网上的实时数据。 6.2.1 RTP数据传输协议 RTP提供端对端网络传输功能,适合通过组播和点播传送实时数据,如视频、音频和仿真数据。RTP没有涉及资源预订和质量保证等实时服务,RTCP扩充数据传输以允许监控数据传送,提供最小的控制和识别功能。RTP与RTCP设计成独立传输和网络层。 2.1.1 RTP固定头 RTP 头格式如下: ----------------------------------------------------------------------------------------------- |V=2|P|X| CC |M| PT | 系列号 | ----------------------------------------------------------------------------------------------- | 时标 | ----------------------------------------------------------------------------------------------- | 同步源标识(SSRC) | ----------------------------------------------------------------------------------------------- | 作用标识 (CSRC) | | .... | -----------------------------------------------------------------------------------------------
开始12个八进制出现在每个RTP包中,而CSRC标识列表仅出现在混合器插入时。 2.1.2 复用 RTP 连接 为使协议有效运行,复用点数目应减至最小。RTP中,复用由定义RTP连接的目的传输地址(网络地址与端口号)提供。例如,对音频和视频单独编码的远程会议,每个媒介被携带在单独RTP连接中,具有各自的目的传输地址。目标不在将音频和视频放在单一RTP连接中,而根据SSRC段载荷类型进行多路分解。使用同一SSRC ,而具有不同载荷类型的交叉包将带来几个问题: 如一种载荷类型在连接期间切换,没有办法识别新值将替换那一个旧值。 SSRC定义成用于标识单个计时和系列号空间。如媒体时钟速率不同,而要求不同系列号空间以说明那种载荷类型有丢包,交叉复用载荷类型将需要不同计时空间。 RTCP发送和接收报告可能仅描述每个SSRC的计时和系列号空间,而不携带载荷类型段。 RTP混合器不能将不兼容媒体流合并成一个流。 在一个RTP连接中携带多个媒介阻止几件事:使用不同网络路径或网络资源分配;接受媒介子集。 对每种媒介使用不同SSRC,但以相同RTP连接发送可避免前三个问题,但不能避免后两个问题。
2.1.3 对RTP头特定设置的修改 可以认为,现用RTP数据包头对RTP支持的所有应用类共同需要的功能集是完整的。然而,为维持ALF设计原则,头可通过改变或增加设置来裁剪,并仍允许设置无关监控和记录工具起作用。标记位与载荷类型段携带特定设置信息,但由于很多应用需要它们,否则要容纳它们,就要增加另外32位字,故允许分配在固定头中。包含这些段的八进制可通过设置重新定义以适应不同要求,如采用更多或更少标记位。如有标记位,既然设置无关监控器能观察包丢失模式和标记位间关系,我们就可以定位八进制中最重要的位。 其它特殊载荷格式(视频编码)所要求的信息应该携带在包的载荷部分。可出现在头,总是在载荷部分开始处,或在数据模式的保留值中指出。如特殊应用类需要独立载荷格式的附加功能,应用运行的设置应该定义附加固定段跟随在现存固定头SSRC之后。这些应用将能迅速而直接访问附加段,同时,与监控器和记录器无关设置仍能通过仅解释开始12个八进制处理RTP包。如证实附加功能是所有设置共同需要的,新版本RTP应该对固定头作出明确改变。
RTP控制协议-- RTCP RTCP协议将控制包周期发送给所有连接者,应用与数据包相同的分布机制。低层协议提供数据与控制包的复用,如使用单独的UDP端口号。RTCP执行下列四大功能: 主要是提供数据发布的质量反馈。是作为RTP传输协议的一部分,与其他传输协议的流和阻塞控制有关。反馈对自适应编码控制直接起作用,但IP组播经验表明,从发送者收到反馈对诊断发送错误是致关重要的。给所有参加者发送接收反馈报告允许问题观察者估计那些问题是局部的,还是全局的。诸如IP组播等发布机制使网络服务提供商类团体可能接收反馈信息,充当第三方监控者来诊断网络问题。反馈功能由RTCP发送者和接收者报告执行。 RTCP带有称作规范名字(CNAME)的RTP源持久传输层标识。如发现冲突,或程序重新启动,既然SSRC标识可改变,接收者需要CNAME跟踪参加者。接收者也需要CNAME 与相关RTP连接中给定的几个数据流联系 前两种功能要求所有参加者发送RTCP包,因此,为了RTP扩展到大规模数量,速率必须受到控制。让每个参加者给其它参加者发送控制包,就大独立观察参加者数量。该数量用语计算包发送的速率。 第四个可选功能是传送最小连接控制信息,如参加者辨识。最可能用在"松散控制"连接,那里参加者自由进入或离开,没有成员控制或参数协调,RTCP充当通往所有参加者的方便通道,但不必支持应用的所有控制通讯要求。高级连接控制协议超出本书范围。 在IP组播场合应用RTP时,前3个功能是必须的,推荐用于所有情形。RTP应用设计人员必须避免使用仅在单播模式下工作的机制,那将导致无法扩展规模。 6.2.2.1 RTCP 包格式 下面定义几个携带不同控制信息的RTCP包类型: SR: 发送报告,当前活动发送者发送、接收统计。 RR: 接收报告,非活动发送者接收统计。 SDES: 源描述项,包括CNAME。 BYE: 表示结束。 APP: 应用特定函数。 类似于RTP数据包,每个RTCP包以固定部分开始,紧接着的是可变长结构元素,但以一个32位边界结束。包含安排要求和固定部分中长度段,使RTCP包可堆叠。不需要插入任何分隔符将多哥RTCP包连接起来形成一个RTCP组合包,以低层协议用单一包发送出去。由于需要低层协议提供提供整体长度来决定组合包的结尾,在组合包中没有单个RTCP包显式计数。 组合包中每个RTCP包可独立处理,不需要根据包组合顺序。但未了执行协议功能,强加如下约束: 接收统计(在SR或RR中)应该经常发送,只要带宽允许,因此每个周期发送的组合RTCP 包应包含报告包。 新接收者需要接收CNAME,并尽快识别源,开始联系媒介进行同步,因此每个包应该包含SDES CNAME。 出现在组合包前面的是包类型数量,其增长应该受到限制,以提高常数位数量,提高成功确认RTCP包对错误地址RTP数据包或其他无关包的概率。 因此,所有RTCP包至少必须以两个包组合形式发送,推荐格式如下: 加密前缀(Encryption prefix): 仅当组合包被加密,才加上一个32位随机数用于每个组合包发送。 SR或RR: 组合包中第一个RTCP包必须总为一个报告包,方便头的确认。即使没有数据发送,也没有接收到数据,也要发送一个空RR,那怕组合包中RTCP包为BYE。 附加RR: 如报告统计源数目超过31,在初始报告包后应该有附加RR 包。 SDES: 包含CNAME 项的SDES包必须包含在每个组合RTCP包中。如应用要求,其他源描述项可选,但受到带宽限制。 BYE或APP: 其它RTCP包类型可以任意顺序排列,除了BYE应作为最后一个包发送,包类型出现可不止一次。 建议转换器或混合器从多个源组合单个RTCP包。如组合包整体长度超过网络路径最大传输单元,可分成多个较短组合包用低层协议以单个包形式发送。注意,每个组合包必须以SR或RR包开始。附加RTCP包类型可在Internet Assigned Numbers Authority (IANA)处注册。 6.2.2.2 RTCP传输间隔 RTP设计成允许应用自动扩展,连接数可从几个到上千个。例如,音频会议中,数据流量是内在限制的,因为同一时刻只有一两个人说话;对组播,给定连接数据率仍是常数,独立于连接数,但控制流量不是内在限制的。如每个参加者以固定速率发送接收报告,控制流量将随参加者数量线性增长,因此,速率必须按比例下降。 一旦确认地址有效,如后来标记成未活动,地址的状态应仍保留,地址应继续计入共享RTCP带宽地址的总数中,时间要保证能扫描典型网络分区,建议为30分钟。注意,这仍大于RTCP报告间隔最大值的五倍。 这个规范定义了除必需的CNAME外的几个源描述项,如NAME(人名)和EMAIL(电子邮件地址)。它也为定义新特定应用RTCP包类型的途径。给附加信息分配控制带宽应引起注意,因为它将降低接收报告和CNAME发送的速率而损害协议的性能。建议分配给单个参加者用于携带附加信息的RTCP带宽不要超过20%。而且并没有有意让所有SDES项包含在每个应用中。 6.2.2.3 发送者与接收者报告 RTP接收者使用RTCP报告包提供接收质量反馈,报告包根据接收者是否是发送者而采用两种格式中的一种。除包类型代码外,发送者报告与接收者报告间唯一的差别是发送者报告包含一个20个字节发送者信息段。如某地址在发出最后或前一个报告间隔期间发送数据包,就发布SR;否则,就发出RR;SR和RR都可没有或包括多个接收报告块。发布报告不是为列在CSRC列表上的起作用的源,每个接收报告块提供从特殊源接收数据的统计。既然最大可有31个接收报告块嵌入在SR 或 RR包中, 丢失包累计数差别给出间隔期间丢掉的数量,而所收到扩展的最后一个系列号的差别给出间隔期间希望发送的包数量,两者之比等于经过间隔期间包丢失百分比。如两报告连续,比值应该等于丢失段部分;否则,就不等。每秒包丢失绿可通过NTP时标差除以丢失部分得到。 从发送者信息,第三方监控器可计算载荷平均数据速率与没收到数据间隔的平均包速率,两者比值给出平均载荷大小。如假设包丢失与包大小无关,那么特殊接收者收到的包数量给出此接收者收到的表观流量。 6.2.2.4 SDES: 源描述RTCP包 SDES 包为三层结构,由头与数据块组成,数据块可以没有,也可有多个,组成项描述块所表明的源。项描述如下: 版本(V)、填充(P)、长度: 如SR包中所描述。 包类型(PT): 8位,包含常数202,识别RTCP SDES包。 源计数(SC): 5位,包含在SDES包中的SSRC/CSRC块数量,零值有效,但没有意义。 源描述项内容如下: CNAME: 规范终端标识SDES项 CNAME标识属性如下: 如发生冲突或重启程序,由于随机分配的SSRC标识可能发生变化,需要CNAME项提供从SSRC标识到仍为常量的源标识的绑定。 象SSRC标识,CNAME标识在RTP连接的所有参加者中应是唯一的。 为了提供一套相关RTP连接中某个参加者所采用的跨多媒体工具间的绑定,CNAME应固定为那个参加者。 为方便第三方监控,CNAME应适合程序或人员定位源。 NAME:用户名称SDES项 这是用于描述源的真正的名称,如"John Doe, Bit Recycler, Megacorp",可是用户想要的任意形式。对诸如会议应用,这种名称也许是参加者列表显示最适宜的形式,它将是除CNAME外发送最频繁的项目。设置可建立这样的优先级别。NAME值至少在连接期间仍希望保持为常数。它不该成为连接的所有参加者中唯一依赖。 EMAIL:电子邮件地址SDES项 邮件地址格式由RFC822规定,如"John.Doe@megacorp.com"。连接期间,电子邮件仍希望保持为常数。 PHONE:电话号码SDES项 电话号码应带有加号,代替国际接入代码,如"+1 908 555 1212"即为美国电话号码。 LOC:用户地理位置SDES项 根据应用,此项具有不同程度的细节。对会议应用,字符串如"Murray Hill, New Jersey"就足够了。然而,对活动标记系统,字符串如"Room 2A244, AT&T BL MH"也许就适用。细节留给实施或用户,但格式和内容可用设置指示。在连接期间,除移动主机外,LOC值期望仍保留为常数。 TOOL:应用或工具名称SDES项 是一个字符串,表示产生流的应用的名称与版本,如"videotool 1.2"。这部分信息对调试很有用,类似于邮件或邮件系统版本SMTP头。TOOL值在连接期间仍保持常数。 NOTE: 通知/状态SDES项 该项的推荐语法如下所述,但这些或其它语法可在设置中显式定义。NOTE 项旨在描述源当前状态的过渡信息,如"on the phone, can't talk",或在讲座期间用于传送谈话的题目。它应该只用于携带例外信息,而不应包含在全部参加者中,因为这将降低接收报告和CNAME发送的速度,因此损害协议的性能。特殊情况下,它不应作为用户设置文件的项目,也不是自动产生。 当其为活动时,由于NOTE项对显示很重要,其它非CNAME项(如NAME)传输速率将会降低,结果使NOTE项占用RTCP部分带宽。若过渡信息不活跃,NOTE项继续以同样的速度重复发送几次,但以一个串长为零的字符串通知接收者。然而,如对小倍数的重复或约20-30 RTCP间隔也没有接收到,接收者也应该考虑NOTE项是不活跃的。 PRIV: 专用扩展SDES项 该项用于定义实验或应用特定的SDES扩展,它包括由长字符串对组成的前缀,后跟填充该项其他部分和携带所需信息的字符串值。前缀长度段为8位。前缀字符串是定义PRIV项人员选择的名称,唯一对应应用接收到的其它PRIV项。应用实现者可选择使用应用名称,如有必要,外加附加子类型标识。另外,推荐其它人根据其代表的实体选择名称,然后,在实体内部协调名称的使用。 注意,前缀消耗了总长为255个八进制项的一些空间,因此,前缀应尽可能的短。这个设备和受到约束的RTCP带宽不应过载,其目的不在于满足所有应用的全部控制通讯要求。SDES PRIV前缀没在IANA处注册。如证实某些形式的PRIV项具有通用性, IANA应给它分配一个正式的SDES项类型,这样就不再需要前缀。这简化了应用,并提高了传输的效率。 6.2.2.5 BYE:断开RTCP包 如混合器接收到一个BYE包,混合器转发BYE包,而不改变SSRC/CSRC 标识。如混合器关闭,它也应该发出一个BYE包,列出它所处理的所有源,而不只是自己的SSRC标识。作为可选项,BYE包可包括一个8位八进制计数,后跟很多八进制文本,表示离开原因,如:"camera malfunction"或"RTP loop detected"。字符串具有同样的编码,如在SDES 中所描述的。如字符串填充包至下32位边界,字符串就不以空结尾;否则,BYE包以空八进制填充。 6.2.2.6 APP:定义应用的RTCP包 APP包用于开发新应用和新特征的实验,不要求注册包类型值。带有不可识别名称的APP包应被忽略掉。测试后,如确定应用广泛,推荐重新定义每个APP包,而不用向IANA注册子类型和名称段。 |