1、RTP
RTP(Real-time Transport Protocol),实时运输协议,为实时应用提供端到端的运输,但是不提供任何服务质量的保证。
1.1 工作流程
需要发送的多媒体数据块经过压缩编码后,先发送给RTP封装成RTP分组(也叫RTP报文),然后把RTP分组装入运输层UDP用户数据报中,再向下递交给IP层。RTP协议本身不对多媒体数据块做任何处理,只是向应用层提供一些附加的信息,让应用层知道应该如何处理。
从应用开发者的角度,RTP应该是应用层的一部分,因为开发者需要编写RTP封装分组的程序代码,然后把RTP分组交付给UDP套接字接口。在接收端,RTP分组通过UDP套接字接口进入应用层后,还要利用开发者编写的程序从RTP分组中把应用数据块提取出来。
1.2 注意事项
需要注意的是:
- RTP分组只包含RTP数据,而控制是通过另一个配套协议RTCP提供的;
- RTP在1025和65535之间选择一个未使用的偶数UDP端口号,而在同一次会话中的RTCP则使用下一个技术端口号。RTP的默认端口号是5004,RTCP默认端口号是5005.
1.3 首部信息
在RTP首部中,前12个字节是必须的,12个字节以后的部分是可选的。
重要字段介绍:
1、有效荷载类型:
占7位,指出后面的RTP数据属于那种格式的应用,收到RTP分组的应用层会根据字段的值进行处理。例如,对于音频有效载荷,包括:GSM(3)、LPC(7)等。
2、序号:
占16位。会话开始时的序号是随机选择的,而对每发出一个RTP分组,其序号加1。接收端通过序号检查是否有分组丢失,也用来将失序的RTP分组重新排序。
3、时间戳:
32位。反映了RTP分组第一个字节的采样时刻。第一次会话开始时,时间戳的初始值也是随机选择的,即使没有信号发送,时间戳也要随时间流逝而不断增加。
接收端使用时间戳可以准确知道应当在什么时间还原哪一个数据块,从而消除时延抖动。时间戳还可以用来使视频应用中的声音和图像同步,RTP没有规定时间戳的粒度,这取决于有效荷载的类型,所以RTP的时间戳又被称为媒体时间戳。
例如,对于8kHz采样的话音信号,如果每隔20ms构成一个数据块,那么一个数据块中包含160个样本(0.02 * 8000),因此发送端每发送一个RTP分组,时间戳的值就增加160。
4、同步源标识符SSRC:
32位。同步源标识符SSRC,用来标识RTP流的来源。SSRC与IP地址无关,是在新的RTP流开始时随机产生的。RTP流使用UDP传输,所以例如有多个摄像机同时拍摄的时候,接收端可能接收到同一个节目的多个RTP流。同步源标识符可以将收到的同一来源的RTP流放到一起出来。如果两个RTP流都选择了同一个SSRC,首先这种概率非常小,万一真的发生了,两个源都会重新选择SSRC。
5、参与源标识符CSRC:
32位。最多有15个。参与源标识符CSRC用来标识不同地点的RTP流。在多播环境中,可以用中间的一个站(混合站),把发往同一个地点的多个RTP流混合成一个流,以节省通信资源。在目的站再根据CSRC的值把不同的RTP流分开。
2、RTCP
2.1 简介
RTCP(RTP Control Protocol),实时运输控制协议,是与RTP协议配合使用的协议。实际上,RTCP也是RTP不可分割的一部分。
RTCP的主要功能:
- 服务质量的监视与反馈;
- 媒体间的同步(如某个RTP发送的声音和图像的配合);
- 多播组中成员的标志。
RTCP分组(也叫RTCP报文),也是通过UDP来传送的,但是RTCP并不对音频/视频分组进行封装。而且RTCP分组很短,可以把多个RTCP分组封装在一个UDP用户数据报中。RTCP分组周期性地在网上传送,它带有发送端和接收端对服务质量的统计信息报告,例如已发送的分组数和字节数、分组字节丢失率、分组到达时间间隔的抖动等。
2.2 分组
RTCP使用五种分组类型:
1、发送端报告SR:
发送端周期性向所有接收端用多播方式进行报告。发送端每发送一个RTP流,就要发送一个发送端报告分组SR。SR分组的主要内容:
- 该RTP流的同步源标识SSRC;
- 该RTP流中新产生的RTP分组的时间戳和绝对时钟时间;
- 该RTP流包含的分组数;
- 该RTP流包含的字节数。
2、接收端报告RR:
RR用来使接收端周期性地向所有的点用多播方式进行报告。接收端每收到一个RTP流,就会产生一个RR分组。RR分组的内容:
- 所接受到的RTP流的SSRC;
- 所接受到的RTP流的分组丢失率(如果丢失率过高,发送端就要降低发送速率);
- 所接受到的RTP流的最后一个RTP分组的序号;
- 所接受到的RTP流到达时间间隔的抖动。
3、源点描述SDES:
给出会话中参加者的描述,包含参加者的规范名。规范名是参加者的电子邮件地址的字符串。
4、结束分组BYE:
表示关闭一个数据流。
5、特定应用分组APP:
使应用程序能够定义新的分组类型。