rtmp simple handshake

本文详细解析了RTMP协议的握手过程,包括C0、C1、C2及S0、S1、S2数据包的格式与作用。具体介绍了各字段如版本号、时间戳、随机数据等的功能,以及如何通过这些信息进行客户端与服务器间的同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • C0,C1,C2,S0,S1,S2 的数据格式

    • C0 和 S0 的格式
      C0 和 S0 包都是一个字节(8bit),表示版本号


      Paste_Image.png

      在 C0 中,这一字段指示出客户端要求的 RTMP 版本号。在 S0 中,这一字段指示出服务器端选择的 RTMP 版本号。默认为 3。0、1、2 三个值是由早期其他产品使用的,是废弃值;4 - 31 被保留为 RTMP 协议的未来实现版本使用;32 - 255 不允许使用 (以区分开 RTMP 和其他常以一个可打印字符开始的文本协议)。无法识别客户端所请求版本号的服务器应该以版本 3 响应,(收到响应的) 客户端可以选择降低到版本 3,或者放弃握手。

      • C1 和 S1 的格式
        C1 和 S1 数据包的长度都是 1536 字节,包含以下字段:


        Paste_Image.png

        Time (前四个字节):这个字段包含一个 timestamp,用于本终端发送的所有后续块的时间起点。这个值可以是 0,或者一些任意值。要同步多个块流,终端可以发送其他块流当前的 timestamp 的值。
        Zero (紧跟着的四个字节):这个字段必须都是 0。
        Random data (剩下的1528 个字节):这个字段可以包含任意值。终端需要区分出响应来自它发起的握手还是对端发起的握手,这个数据应该发送一些足够随机的数。简单点,就是随机数.

      • C2 和 S2 的格式
        C2 和 S2 数据包长度都是 1536 字节,基本就是 S1 和 C1 的副本 (分别),包含有以下字段:


        Paste_Image.png
        • Time (前四个字节):这个字段必须包含终端在 S1 (给 C2) 或者 C1 (给 S2) 发的 timestamp.例如:C1的前四个字节为0,那么S2的前四个字节也是0.
        • Time2 (紧跟着的四个字节):这个字段必须包含终端先前发出数据包 (s1 或者 c1) timestamp,例如,S1的前四个字节为 0x00 00 00 01,那么S2的第4~8字节就是0x 00 00 00 01
        • Random echo (剩下1528 个字节):这个字段必须包含终端发的 S1 (给 C2) 或者 S2 (给 C1) 的随机数。两端都可以一起使用 time 和 time2 字段再加当前 timestamp 以快速估算带宽和/或者连接延迟,但这不太可能是有多大用处。
  • 如果握手失败,服务器会终止响应,并断开socket连接

  • 如果握手成功,则可以进入到下一个环节,可以开始交换消息了.
  • 实际测试(用的SRS测的)发现,服务器端根本不鸟你,只要收到C1,后面就可能先发一部分,再发一部分(长度不定,不一定是上文所说的1536),也可能一次性全部给你,但是S0+S1+S2的总字节数(也就是3073个字节)是对的

    文/iOSSinger(简书作者)
    原文链接:http://www.jianshu.com/p/dc4884bd7908
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值