从事或想要从事音视频相关工作的你,或多或少都听过RTP,RTCP,RTMP等等协议的名称,本篇将给大家介绍下流媒体相关的网络协议,话不多说,开始今天的文章。
如下罗列了部分流媒体相关协议,稍后的文章中我们详细介绍这些协议:
◆ RTP(Real-time Transport Protocol),实时传输协议。
◆ RTCP(Real-time Transport Control Protocol),实时传输控制协议。
◆ RTSP(Real Time Streaming Protocol),实时流协议。
◆ RTMP(Real Time Messaging Protocol),实时消息传输协议。
◆ HLS(HTTP Live Streaming),苹果公司提出的基于HTTP的流媒体网络传输协议。
◆ HTTP-FLV,将RTMP等负载信息携带在HTTP协议之上的码流传输协议。
为什么把 RTP、RPCP、RTSP放在一起介绍呢,因为RTP、RTCP这两个协议一般是成对出现,而他们与RTSP协同工作。本篇我们先介绍下这三篇协议。
RTP负责多媒体的传输,RTCP配合RTP做控制和流量统计, RTSP负责建立和控制会话,下图更直观的的描述了三者的关系:
RFC3550协议定义RTP和RTCP协议的最基本内容,包括报文格式及头部扩展、发送和接收规则、RTP Mixer和Translator、协议安全等内容。详细内容都在协议中定义,这里只简述RTP和RTCP报文的基本格式。
官网:RFC 3550 - RTP: A Transport Protocol for Real-Time Applications
◆ RTP建立在UDP协议上;
◆ RTP不确保网络底层的可靠性,不提供按时发送机制或其他服务质量(QoS)保证;
◆ RTP不保证传送或防止无序传送;
◆ RTP提供时间标志,序列号以及其他能够保证在实时数据传输时处理时间的方法;
◆ RTP报文格式如下:
RTP报文由固定头部、(可选)扩展头部和负载三部分组成。头部中的X域标示固定头部后面是否跟随扩展头部,PT域定义负载类型。各部分的详细定义请参考RFC3550。
V:RTP协议的版本号,占2位,当前协议版本号为2
P:填充标志,占1位,如果P=1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分。
X:扩展标志,占1位,如果X=1,则在RTP报头后跟有一个扩展报头
CC:CSRC计数器,占4位,指示CSRC 标识符的个数
M:标记,占1位,不同的有效载荷有不同的含义,对于视频,标记一帧的结束;对于音频,标记会话的开始。
PT:有效荷载类型,占7位,用于说明RTP报文中有效载荷的类型,如GSM音频、JPEM图像等,在流媒体中大部分是用来区分音频流和视频流的,这样便于客户端进行解析。
sequence number:序列号,16比特,发送方在每发送完一个RTP包后就将该域的值增加1,接收方可以由该域检测包的丢失及恢复包序列。序列号的初始值是随机的。
timestamp:时间戳,32比特,记录了该包中数据的第一个字节的采样时刻。在一次会话开始时,时间戳初始化成一个初始值。即使在没有信号发送时,时间戳的数值也要随时间而不断地增加(时间在流逝嘛)。时间戳是去除抖动和实现同步不可缺少的。
SSRC:同步源标识符,32比特,同步源就是指RTP包流的来源。在同一个RTP会话中不能有两个相同的SSRC值。该标识符是随机选取的 RFC1889推荐了MD5随机算法。
CSRC:贡献源列表,0~15项,每项32比特,用来标志对一个RTP混合器产生的新包有贡献的所有RTP包的源。由混合器将这些有贡献的SSRC标识符插入表中。SSRC标识符都被列出来,以便接收端能正确指出交谈双方的身份
◆ RTP和RTCP是一起使用的;
◆ RTCP的主要功能是为RTP所提供的服务质量提供反馈,RTCP收集媒体连接的统计信息,例如:传输字节数,传输分组数,丢失分组数,时延抖动,单向和双向网络延迟等等;
◆ 网络应用程序可以利用RTCP所提供的信息试图提高服务质量,比如限制信息流量或改用压缩比较小的编解码器;
◆ RTCP本身不提供数据加密或身份认证,其伴生协议SRTCP(安全实时传输控制协议)则可用于此类用途;
◆ RTCP报文格式如下:
RFC3550根据RTCP报文类型定义SR、RR、SDES、BYE和APP五种报文格式。下图显示了SR(Sender Report)的报文格式,包括固定头部、发送端信息和报告块三部分组成:发送端信息携带NTP时间同步和数据发送统计等内容,报告块则包含发送端接收到数据的统计信息。关于RTCP报文格式的详细信息,请继续参考RFC3550
◆ RTSP是一种双向实时数据传输协议;
◆ RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或RTP完成数据传输;
◆ RTSP主要用来控制具有实时特性的数据发送,比如:对流媒体提供诸如播放、暂停、快进等操作;
◆ RTSP负责定义具体的控制消息、操作方法、状态码等,但它本身并不传输数据,而是必须依赖于下层传输协议所提供的某些服务;
参考
学习RFC3550:RTP/RTCP实时传输协议基础知识 - 程序员大本营