RTP:realtime transport protocol 实时传输协议 - 负责传输视频流数据;
RTCP:realtime transport control protocol 实时传输控制协议 - rtp的控制部分,用来保证服务质量;
RTSP:realtime transport streaming protocol 实时流传输协议 - 提供对流的远程控制,比如暂停,重新定位等;
RTP 由 IETF(http://www.ietf.org/)定义在 RFC 3550和3551中,RTSP定义在RFC2326中。
RTP被定义为传输音频、视频、模拟数据等实时数据的传输协议,与传统的注重的高可靠的数据传输的运输层协议相比,它更加侧重的数据传输的实时性,此协议提供的服务包括数据顺序号、时间标记、传输控制等。RTP通常与辅助控制协议RTCP一起工作,RTP只负责实时数据的传输,RTCP负责对RTP的通信和会话进行带外管理(如流量控制、拥塞控制、会话源管理等)。
RTP位于传输层(通常是UDP)之上,应用程序之下,实时语音、视频数据经过模数转换和压缩编码处理后,先送给RTP封装成为RTP数据单元,RTP数据单元被封装为UDP数据报,然后再向下递交给IP封装为IP数据包。RTP分组只包含RTP数据,而控制是由另一个配套协议RTCP提供。RTP在端口号1025到65535之间选择一个未使用的偶数UDP端口号,而在同一次会话中的RTCP则使用下一个奇数UDP端口号。RTP通常和RTCP一起工作,在RTP会话期间,各参与者周期的发送RTCP消息。RTCP消息含有已发送数据的丢包统计和网络拥塞等信息,服务器可以利用这些信息动态的改变传输速率,甚至改变净荷的类型。RTCP消息也被封装为UDP数据报进行传输。
RTP数据协议负责对流媒体数据进行封包并实现媒体流的实时传输,每一个RTP数据报都由头部(Header)和负载(Payload)两个部分组成,其中头部前12个字节的含义是固定的,而负载则可以是音频或者视频数据。
V:2bits - 版本号,固定值为2;
P:1bit - 填充位,在包尾是否包含一个8bits的填充字;
X:1bit - 固定头部后面有一个扩展头部;扩展头部是在固定头部之后的4个字节,如下图所示,length用于指示后面还有多少个4字节的扩展数据,可以位0;profile是用户自定义标识。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| defined by profile | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| header extension |
| .... |
CC:4bits - CSRC的个数
M: 1bit - 标识
PT: 7bits - 编码类型。G711,H264等等。
sequence number:16bits - 每个RTP包都增加1,初始值随机。
timestamp:32bits - 随机产生一个初始值,在初始值的基础上,每次递增固定的值(每秒25帧,那么每次递增的值应该是90000/25);
NOTE:如果一个数据包需要分片传输时,可以通过设置相同的timestamp和每次递增的sequence number来区分,客户端可以重组相应的数据包;
SSRC: - 源 一个随机值,但相同源这个值不变;
参考资料:
1、http://www.cppblog.com/czanyou/archive/2009/12/25/67940.html
2、http://www.chinavideo.org/forum.php?mod=viewthread&tid=7575&extra=&page=1