前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手撕Rtmp协议细节(3)——Rtmp Body

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

作者头像
视界音你而不同
发布2020-05-20 00:43:16
2.4K0
发布2020-05-20 00:43:16
举报

上一篇讲了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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 视界音你而不同 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档