2011年3月3日星期四

实时传输协议RTP (Real-time Transport Protocol)

继续完成hanyionet的长期计划,在博客中完成“流媒体技术”系列文章,今天谈谈RTP,其实以前的文章也提到过这个协议。

RTP是一个传输协议,具体制定了数据流如何通过IP网络,并且它是流媒体中最重要的标准。所有的媒体流封装在RTP包。它通常是封装在UDP/IP如下图,并与其他譬如ATM或IPv6协议兼容。

rtp_Location

RTP主要用于实时数据多播(multicast),但它也可用于单播(unicast)(例如,如视频点播单向传输)。

也许我们都有一个疑问,为什么RTP往往是使用UDP,而不是在TCP封装,hanyionet将在以后的文章做一些解释。

 

RTP的特征

RTP提供多媒体应用正确传输所需的信息:时间戳(timestamp),序列编号(sequence numbering),安全(security),内容识别(content identification)和其他机制。这些服务必须在执行应用层(Application level),但它不是RTP所负责。因此,RTP协议只是有助于低层(lower layers)对资源的控制和增加可靠性,流量/拥塞控制(flow/congestion control)与其他机制对于实时信息。

RTP协议传输实时数据包通过网络,这意味着丢失或损坏的数据包将不重发(not retransmitted)。客户端软件要解决这个问题。另一个问题是,如果连接速度(connection speed)比媒体数据传输速率(media data rate)慢,那么传输播放会不佳或者不能播放。

下图为RTP data in an IP packet:

rtp_packet

下图为RTP的Header Format:

rtp_header 

具体说明请查阅:http://en.wikipedia.org/wiki/Real-time_Transport_Protocol

 

RTP是如何工作的?

这其实是我们比较关心的问题。时间戳(timestamp)是实时应用(real-time applications)领域最重要的信息。时间戳将增加,在第一个字节的数据包被传输,并当每一个包被发送它也将增加。接收器(receiver)使用它来重建原始的时间,并且可以使用正确的速率来播放数据。时间戳也可用于同步不同的数据流,不同的时间属性,如音频和视频数据在MPEG中。

另一个重要域是序列号(sequence number)。UDP不提供数据包在一个时序(in timely order),所以有必要使用序列号,是接受的数据包放置传入正确的顺序,用于数据包丢失时的检测。此外,例如,一些视频格式,当一帧分割成几个RTP包,它们都可以有相同的时间戳。

负载类型(payload type)编码/压缩格式(encoding/compression format)是必要的负载识别码(payload identifier)。但是,一个RTP发送者每次传输只可以发送一个有效载荷类型,虽然负载类型(payload type)在传输过程中可能会发生变化,例如,调整网络拥塞。

MTU“最大传输单位”(Maximum Transmission Unit)。也就是通过TCP/IP协议所传输的数据包最大有多少字节,MTU值越大,封包就越大,理论上可增加传送速率,但MTU值又不能设得太大,因为封包太大,传送时出现错误的机会大增。
考虑MTU很重要,不要超过它。因为如果一个RTP包超过MTU,它会被路由器分割,这个过程被称为分裂(fragmentation),如果其中之一丢失了,所有剩余的也将丢失。分裂(fragmentation)也会增加资源的使用。MTU是因网络类型而定,譬如以太网为1500字节。

 

参考资料:
http://www.ietf.org/rfc/rfc1889.txt

没有评论: