Rtmp协议握手完成之后,就可以进行数据交互了,但交换的数据格式需要一个组织的标准,发送端按照该标准进行数据的组装,接收方按照该标准进行数据的拆解,这样才能完成通信。rtmp的协议的数据包,总的来讲分为两大部分,一部分是Rtmp Header,另一部分为Rtmp Body,这一篇我们来主要讲解一下Rtmp Header的组织形式。
RTMP header的长度不固定,可能的长度为12字节,8字节,4字节,1字节。具体长度为多少个字节,由RTMP header数据包的第一个字节的高2位决定。
如下方表格,Format决定了RTMP header的长度为多少个字节:
Format取值(2bits) | header的长度 | 说明 |
---|---|---|
0(二进制00) | 12字节 | onMetaData流开始的绝对时间戳控制消息(如connect) |
1(二进制01) | 8字节 | 大部分的rtmp header都是8字节的 |
2(二进制10) | 4字节 | 比较少见 |
3(二进制11) | 1字节 | 偶尔出现,低于8字节频率 |
下面,通过wireshark抓包看下,RTMP HEADER的长度。
图中,RTMP Header的第一个字节为0x03,高两位的值为00,所以,整个RTMP Header的长度就是4个字节了。
第一个字节的低6位,命名为Chunk Stream ID,Chunk Stream ID用来表示消息的级别:
chunk stream id | 级别 | 说明 |
---|---|---|
2 | low level | |
3 | high level(像connect, create_stream一类消息) | |
4 | control stream | |
5 | video | |
6 | audio | |
8 | control stream |
还是看上面抓包的图片:
chuk_stream id为3,表示消息的级别为high levle,这一条消息实际上是一条connect的消息。
知道了RTMP header的第一个字节的作用以后,接下来我们看下几种不同长度的RTMP Header。
12字节的RTMP Header
还是老规矩,借助抓包工具,我们时间分一个RTMP Header的包,还是拿前面举过的列子来分析吧,看下面的图:
下面来,详细说说这几个字段是干嘛的:
第一个时间戳,无需多言。
BodySize字段,表示RTMP Body所包含数据包的大小,此处为209,感兴趣的可以在图中数一数,除去RTMP Header部分,后面的数据部分长度便是209。
Type ID字段表示消息类型ID,比如此处0x14表示以AMF0编码(还有AMF3编码,Adobe定义的编码方式)。另外还有如0x04表示用户控制消息,0x05表示Window Acknowledgement Size,0x06表示 Set Peer Bandwith等等,就不一一列举了。
还有最后一个Stream ID,Stream ID通常用以完成某些特定的工作,如使用ID为0的Stream来完成客户端和服务器的连接和控制,使用ID为1的Stream来完成视频流的控制和播放等工作。
8字节的RTMP Header
还是直观点,上一个真实的抓包文件,来分析:
第一个字节,高2位为01,所以RTMP Header的长度为8字节,接下来是时间戳的delta,简单讲就是时间戳的变化量,BodySize不多说,后面6个字节也比较赤裸裸。TypeID此处为0x04,也就是用户控制信息(本条消息实际上是rtmp客户端和服务器之间的Ping Response)。
4字节的RTMP Header
4字节的就比较简单了,除了第一个字节之外,只有一个关于时间戳的增量,占用3个字节。
上一张抓包图:
可以看到,第一个字节为0xa2,所以高2位的值为10,所以,RTMP Header占用4个字节,后面跟着的时间戳的增量。
1字节的RTMP Header
抓个包,好奇的看一下。
一个字节,就是第一个字节,后面啥也没有喽,高2位为11,所以,RTMP Header占用1个字节,只包含Format 和chunk stream ID。
好了,关于RTMP Header格式的介绍就到这里了,下一篇我们来看一下RtmpBody的数据组织格式,下一篇不见不散。