温故而知新。
实时传输协议RTP(Real-time Transport Protocol)是IETF的AVT工作组(Audio/Video Transport WG)开发的协议。RTP[RFC 3550,3551]为实时应用提供端到端的运输,但不提供任何服务质量的保证。需要发送的多媒体数据块(音频/视频)经过压缩编码处理后,先送给RTP封装成RTP分组,RTP分组再装入运输层的UDP用户数据报,然后再向下递交给IP层。RTP现已成为因特网建议标准,并且已被广泛使用。RTP同时也是ITU-T的标准(H.225.0)。实际上,RTP是一个协议框架,因为它只包含了实时应用的一些共同的功能,RTP自己并不对多媒体数据块做任何处理。
RTP协议可以划分在应用层。这是因为从应用开发者的角度来看,RTP应该是应用层的一部分。从应用程序的发送端,开发者必须编写用RTP封装分组的程序代码,然后把RTP分组交给UDP套接字接口。在接受端,RTP分组通过UDP套接字接口进入应用层后,还要利用开发者编写的程序代码从RTP分组中把应用数据块提取出来;然而,RTP的名称又隐含地表示它是一个运输层协议,这样划分也是可以的,因为RTP封装了多媒体应用的数据块,并且由于RTP向多媒体应用程序提供了服务(如时间戳和序号),因此也可以把RTP看成是在UDP之上的一个运输层协议。
RTP还有两点值得注意。首先,RTP分组只包含RTP数据,而控制是由另一个配套使用的RTCP协议提供的。其次,RTP在端口号1025到65535之间选择一个未使用的偶数UDP端口号,而在同一次会话中RTCP则使用下一个奇数UDP端口号。
下面给出了RTP分组首部的格式,以下的内容对其进行简单介绍。
Version |
P |
X |
CC |
Mark |
PType |
Sequence Number |
Time Stamp |
||||||
SSRC ID |
||||||
CSRC ID |
||||||
Extend Data |
||||||
PayLoad Data |
(1)Version 版本号,占2位。当前使用的是版本2。
(2)P 填充域,占1位。在某些特殊情况下需要对应用数据块加密,这往往要求每一个数据块有确定的长度。如不满足这种长度要求,就需要进行填充。这时就把P位置1,表示这个RTP分组的数据有若干填充字节。在数据部分的最后一个字节用来表示所填充的字节数。
(3)X 扩展域,占1位。X置1表示在此RTP首部后面还有扩展首部。扩展首部很少使用,这里不在讨论。
(4)CC 参与源数目,占4位。这个字段给出后面的参与源标识符的数目。
(5)Mark 标记域,占1位。M置1表示这个RTP分组具有特殊意义。例如,在传送视频流时用来表示每一帧的开始。
(6)PType 有效载荷类型,占7位。这个字段指出后面的RTP数据属于何种格式的应用。收到RTP分组的应用层就根据此字段指出的类型进行处理。例如,对于音频有效载荷(每一种格式后面括弧中的数字就表示其有效载荷的编码):u律PCM(0)、GSM(3)、LPC(7)、A律PCM(8)、G.722(9)、G.728(15)等。对于视频有效载荷:活动JPEG(26)、H.261(31)、MPEG1(32)、MPEG2(33)等。
(7)Sequence Number 序列号,占16位。对每一个发出的RTP分组,其序号加1。在一次会话开始时的初始序列号是随机选择的。序号使接收端能够发现丢失的分组,同时也能将失序的RTP分组重新按序排列好。例如,在收到序号为60的RTP分组后又收到了序号为65的RTP分组,那么就可以推断出中间还缺少61至64的4个RTP分组。
(8)Time Stamp 时间戳,占32位。时间戳反映了RTP分组中的数据的第一个字节的采样时刻。在一次会话开始时的时间戳初值也是随机选择的。即使是没有信号发送时,时间戳的数值也要随时间不断的增加。接收端使用时间戳可准确知道应当在什么时间还原哪一个数据块,从而消除实验的抖动。时间戳还可用来使视频应用中声音和图像的同步。在RTP协议中并没有规定时间戳的粒度,这取决于有效载荷的类型。因此RTP的时间戳又称为媒体时间戳,以强调这种时间戳的粒度取决于信号的类型。例如,对于8kHz采样的话音信号,若每隔20ms构成一个数据块,则一个数据块中包含有160个样本(0.02×8000=160)。因此每发送一个RTP分组,其时间戳的值就增加160。
(9)SSRC ID 同步源标识符,占32位。同步源标识符是一个数,用来标识RTP流的来源。SSRC与IP地址无关,在新的RTP流开始时随机地产生。由于RTP使用UDP传送,因此可以有多个RTP流复用到一个UDP数据报中。SSRC可使接收端的UDP能够将收到的RTP流送到各自的终点。两个RTP流恰好都选择同一个SSRC的概率是极小的。若发生这种情况,这两个源就都重新选择另一个SSRC。
(10)CSRC ID 参与源标识副,占32位。参与源标识符也是一个32位数,用来标识来自不同地点的RTP流。在多播环境中,可以用中间的一个站(叫做混合站)把发往 同一个地点的多个RTP流混合成一个流(可节省通信资源)。在目的站再根据CSRC的数值把不同的RTP流分开。