RTP协议简介

【RTP协议简介】实时运输协议RTP(real-time Transport protocol)为实时应用提供端到端的运输,但不提供任何服务质量的保证。需要发送的多媒体数据块(音/视频)经过压缩编码处理后,发送等RTP封装成为RTP分组——>RTP分组装入运输层的UDP用户数据报——>向下递交给IP层——>然后交给数据链路层等处理。接收流程和发送流程相反,流程如下图:
RTP协议简介
文章图片

实际上,RTP只是一个协议框架,它只包含了实时应用的一些共用功能,RTP自己并不对多媒体数据块做任何处理,而只是向应用层提供一些附加信息,让应用层知道应当如何进行处理。RTP协议可以归为应用层,因为从开发者的角度看,在应用程序的发送端和接收端,开发者必须编写用RTP封装分组和获取数据块的程序代码。RTP也可以认为是运输层协议,因为RTP封装了多媒体应用的数据块,并且向多媒体应用程序提供了服务(时间戳和序号),因此也可以把RTP看成是在UDP之上的一个运输层子层的协议。
RTP提供端到端的实时传输,RTP分组只包含RTP数据。而控制是由另一个配套使用的RTCP协议提供的。RTP使用的端口是系统端口(即1024~65535)除外选一个未被使用的偶数UDP端口号,而在同一次会话中的RTCP则使用下一个奇数UDP端口号,端口号5004和5005分别用作RTP和RTCP的默认端口号。所以在很多地方可以看到一对端口和多播的组地址。
在RTP分组的首部中,前12个字节是必需的,而12字节以后的部分则是可选的,下面简单介绍各个字段的含义:

  • 有效载荷类型(7bit):这个字段指出后面的RTP数据属于何种格式的应用。收到RTP分组的应用层就根据此字段指出的类型进行处理。对于视频有效载荷:H.261(31)、MPEG1(32)、MPEG1(33)等。
  • 序号(16bit):对每一个发送的RTP分组,其序号加1。在一次RTP会话开始时的初始序号是随机选择的。序号使接收端能够发现丢失的分组,同时也能将失序的RTP分组重新按序排列好。
  • 时间戳(32bit):反映了RTP分组中数据的第一个字节的采样时刻。在一次会话开始时间戳的初始值也是随机选择的。即使在没有信号发送时,时间戳的数值也要随时间而不断地增加。时间戳可以用来消除抖动以及同步音视频。
  • 同步源标识符(32bit):同步源标识符SSRC用来标志RTP流的来源。也是在RTP流开始时随机地产生,由于RTP使用UDP传送,因此可以有多个RTP流复用到一个UDP用户数据报中,SSRC可使接收端的能够将受到的RTP流送到各自的终点。
  • 参与源标识符:用来标志源于不同地点的RTP流。混合站把发往同一个地点的多个RTP流混合成一个流,在目的站再根据CSRC的数值把不同的RTP流分开。
  • 参与源数(4bit):参与源标识符的数目
  • 版本(2bit):当前使用的是版本2
  • 填充P(1bit):某些特殊情况下需要对应用数据块加密,这往往要求每一个数据块有确定的长度,如不满足这种长度要求,就需要进行填充。置1表示RTP分组的数据有若干个填充字节,在数据部分的最后一个字节用来表示所填充的字节数。
  • 拓展X(1bit):X置1表示在此RTP首部后面还有拓展首部。拓展首部很少使用。
  • 标记M(1bit):M置1表示这个RTP分组具有特殊意义。例如,在传送视频流时,用来表示每一帧的开始。
    上面讲了RTP协议只提供实时传输,并不保证服务质量。服务质量有**实时运输控制协议(RTP control Protocol)**提供,RTCP协议的主要功能是:服务质量的监视与反馈、媒体间的同步、多播成员的标志。RTCP分组也是使用UDP来传送,但由于RTCP分组很短,因此可以把多个RTCP分组封装在一个UDP用户数据报中。RTCP分组周期性地在网上传送。
    RTCP使用五种分组类型:
  • 结束分组BYE(203):表示关闭一个数据流
  • 特定应用分组APP(204):向应用程序定义新的分组类型。
  • 接收端报告分组RR(201):用来使接收端周期性地向所有的点用多播方式报告。接收端每收到一个RTP流就产生一个接收端报告分组RR,内容有:接收到RTP流的SSRC、该分组丢失率、在该RTP流中的最后一个RTP分组的序号、分组到达时间间隔的抖动等。

    推荐阅读