手撕Rtmp协议细节(3)——Rtmp Body

 

 

上一篇讲了RTMP数据包中关于Header的数据组织格式,不过一个完整的RTMP数据包除了Header之外,紧跟着的是RTMP Body,这一篇就继续来说一下RTMP Body的数据组织结构了。

 

说到RTMP Body的数据包组织格式,就不得不提到AMF。AMF英文全称Action Message Format,是Adobe定义的一套用来进行数据打包的格式,主要的版本有AFM0和AMF3,不过发展至今,实际场景中AMF0一直用的比较多,AMF3相对少见,本篇就以AMF0为例来讲解了。

 

那么AMF和RTMP Body又有什么关系呢,不才,RTMP数据包的序列化就是按照AMF的格式进行的。RTMP的客户端和RTMP的服务端约定好,发送方说,我发送你的数据都是按照某种格式组织的,你如果收到了我发给你的数据包,你就按这个数据包格式进行解析就可以了。这个格式就是我们此处说的AMF。

 

好了,先说下AMF0,这一标准定义了16种核心的类型,如下表:

 

类型16进制值

表示类型

0x00

number

0x01

boolean

0x02

string

0x03

object

0x04

movieclip

0x05

null

0x06

undefined

0x07

reference

0x08

ecma-array

0x09

object-end

0x0a

strict-array

0x0b

date

0x0c

long string

0x0d

unsupported

0x0e

recordset

0x0f

xml-document

0x10

typed-object

 

AMF定义中,首先使用一个字节来表示数据类型,可选的核心数据类型如上表。在数据类型后面紧跟着的就是对应类型数据的长度,每一种类型长度字段所占用的字节数可能也不尽相同,比如string类型后面紧跟的是后面字符串的长度,长度占用2个字节,在长度后面就是具体的数值,还是拿string来举例,长度后面就是具体的字符数据。本质上,这也是一种类似key-len-val(也有叫type-len-val)的一种数据组织方式。

 

不过,AMF中对于某些类型的数据,没有长度的选项,因为AMF中规定了该类型所占据的字节长度大小。比如AMF规定,number类型所占用的长度为8字节,其表示方式是双精度浮点的网络字节序存储,因此就不需要再表示长度字段了。

 

还有些类型的数据,既没有长度的选项,也没有具体的值,比如null类型,只占用一个字节,表示类型,在其之后没有任何其他数据。

 

说了这么多,可能还是有点晕,还是直观的上一张图吧:

 

 

说完AMF,再回到我们的RTMP Body,RTMP Body就是按照AMF0规范,将数据包进行组织,然后再通过网络发送的。好了,接下来就结合wireshark实际抓到的RTMP数据包,一起熟悉AMF0,同时也熟悉RTMP Body的数据包组织方式。

 

先看一下_result的数据包。

 

 

从抓包中可以看出,该RTMP Body中包含三种类型,4个AMF0编码的数据,一个String类型,一个Number类型,和2个Object类型。接下来我们一一分析下:

 

首先看第一个String类型:

 

 

String类型对应的AMF0的type为0x02,表示string类型后面字符串的长度占用两个字节,在长度之后为具体的字符串,此处为"_result"。

 

接下来我们再看number

 

 

Number类型对应的AMF0的type为0x00,number类型占用8个字节,不需要增加长度的表示,其后紧跟着的就是8个字节的数值表示(抓包显示文件为16进制)。

 

再来看下object

 

 

object的类型为0x03,结束的时候会有一个object_end,类型是0x09,这也是AMF0中又一个只有类型,没有len和val的类型。图中绿色部分便是具体的object的数据。下面再深入内部看一眼:

 

 

通过抓包,我们可以看到,object类型的数据,内容实际上可以分为两部分,一部分表示object的名称,此处为fmsVer,另一部分就是具体的值。object的名称默认使用字符串,所以省略了类型,直接跟着的就是name对应的字符串的长度(占用两个字节表示),之后是具体的名称字符串;具体的值则再次按AMF0的格式进行编码,此处fmsVer的值为一个字符串,所以按照string类型的AMF0继续编码。

 

后面的一个object交给各位去分析了,哈哈,练练手,才知有没有:

 

 

这样,我们通过对RTMP Body的分析,也熟悉了AMF0的一些标准,当然还有其他的一些类型,朋友有需要可以自行学习,举一反三了,Adobe关于AMF0和AMF3的官方文档放在下方,各位自取哈。希望本篇对大家有所帮助,下一篇不见不散。

 

AMF3:https://www.adobe.com/content/dam/acom/en/devnet/pdf/amf-file-format-spec.pdf

AMF0:https://wwwimages2.adobe.com/content/dam/acom/en/devnet/pdf/amf0-file-format-specification.pdf

 

「 往期文章 」

Rtmp协议解析之握手

Rtmp协议解析之Rtmp Header

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值