RTMP协议抓包分析

       RTMP(Real Time Messaging Protocol) 是由 Adobe 公司基于 Flash Player 播放器对应的音视频 flv 封装格式提出的一种,基于TCP 的数据传输协议。

RTMP协议的交互流程

        RTMP Client和RTMP Server的交互需要经过握手、建立连接、建立流、播放/发布四个步骤。

        使用wireshake抓取RTMP协议,RTMP的连接过程如上图。其中8.130.x.x为RTMP的服务器所在地址,10.177.x.x为RTMP客户端所在地址。Handshake、connect、createStream、publish对应上述的四个步骤。

RTMP握手

        在实际抓包时Handshake流程是:客户端发送c0、c1后服务器回复s0、s1、s2,然后客户端再发送c2。而实现RTMP的握手需要保证以下几个必要条件:

        1.客户端要等到收到s1才能发送c2。
        2.客户端要等收到s2才能发送其他信息。
        3.服务器要收到c0才能发送s1。
        4.服务器要收到c1才能发送s2.
        5.服务器收到c2才能发送其他信息。

        RTMP握手的数据并非是c0、c1这样的字符串,它们有这具体的内容。c0、和s0的内容比较简单,都是一个字节的版本信息(通常其值为0x03)。

s1、s2、c1、c2的格式相同包括4字节的时间戳、4字节的zere填充、1528字节的随机字段,总长度1536字节。此外s2通常可以与c1相同、c2通常与s1相同。(通过实际抓包发现数据格式并不严格遵照这种方式,但是他们的总长度都是1536字节)。

RTMP消息块

        再RTMP中把消息分成消息块的形式发送,RTMP通过Set Chunk Size的控制信息设置消息块的大小。

        

消息块不能太大也不能太小,消息块太大时可以减少计算每个消息块的CPU占用,但是再低带宽环境下会阻塞后面优先级较高的消息。消息块设置较小时,会产生更多额外的信息(消息块的header),不能充分利用带宽。

        RTMP的消息块由消息块头部和消息体组成。头部包含块基本头、块消息头、扩展时间戳(块消息头的时间戳溢出时才会使用)。

RTMP块基本头

        RTMP块基本头包括块类型和块流ID,长度有1、2、3字节三种可能。它的长度主要是由块流ID(Chunk Stream ID)决定。Chunk Stream ID最多可以支持65597个流,ID的范围是3-65599,ID的0、1、2为保留值。Chunk Stream ID再计算时有下面的规则:

        1.块基本头长度为1字节时,前两位为块类型,2-7位为chunk stream id;
        2.2字节长度时,第一字节的前两位是块类型,2-7位全部置零,第二字节值+64是csid值;
        3.3字节时,第一字节前两位是块类型,2-7位全置一,第三字节*255 + 第二字节 + 64 为csid的值。

RTMP块消息头

        RTMP的块消息头有四种格式:

0类型块消息头

        0类型块消息头占11字节,包括3字节时间戳增量、3字节消息长度、1字节消息类型ID、4字节消息流ID。

        

        

        

        

1类型块消息头

        1类型块消息头占用7字节,0类型块消息头去掉后四位的消息流ID既是1类型消息头(沿用上一条消息的信息流ID)。
3字节时间戳增量、3字节消息长、1字节类型ID

2类型块消息头

        2类型消息头占用3字节,只包含3字节的时间戳增量,沿用上个消息的消息流ID和消息长度。

3类型块消息头

        3类型块消息头没有任何信息,长度为0。

RTMP扩展时间戳

        只用在块消息头中的3字节时间戳增量不够用时才会被使用。需要注意的是,当最近的相同块流ID的0类型块、1类型块、2类型块用这个字段时,3类型块也要用。

RTMP协议控制消息

        前面提到在块消息头中包含1字节的消息类型ID,在RTMP中使用1、2、3、5、6这些值作为协议控制消息。

        Type ID = 1,设置块大小

        

        Type ID = 2,终止消息

        Type ID = 3,确认消息

        Type ID = 5, 窗口大小确认

        

        Type ID = 6,设置对端带宽

       

在RTMP协议控制消息中没有被使用的Type ID 4被用作用户控制消息。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值