rtmp握手

RTMP协议的握手过程包括简单握手和复杂握手,由C0、C1、C2和S0、S1、S2六个块组成。在Go语言中,可以通过特定代码实现握手过程。简单握手的C0、S0包含版本号,C1、S1、C2、S2分别有timestamp、随机字节等信息。复杂握手则涉及到key和digest的两种schema。握手完成后,即可进行其他消息的发送。

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

握手
一个rtmp链接以握手开始,rtmp协议握手由三个固定大小的块组成,而不是像其他协议那样发送带有报头的可变长度的块。
simple handshake 是 rtmp spec 1.0 定义的握手方式,complex handshake 是Adobe 公司后来变更的握手方式

客户端向服务器按序发送C0、C1、C2三个chunk,服务端向客户端发送S0、S1、S2三个chunk。rtmp协议本身没有规定发送的顺序。但实现者需要保证下面的顺序
服务端收到C0才能发送S1
服务端收到C1才能发送S2
客户端收到S1才能才能发送C2
服务端收到C2才能发送其他消息
客户端收到S2才能发送其他消息

可以不用管上面的关系,大家通常这样安排握手的过程
1、客服端发送 C0+C1
2、服务端发送 S0+S1+S2
3、客户端发送C2
至此,握手完成,下面可以发送其他消息了(控制消息、音视频消息)

简单握手

C0和S0
C0和S0占用一个字节,表示版本号,结构如下
这里写图片描述
版本号 (八位):在 C0 中,这一字段指示出客户端要求的 RTMP 版本号。在 S0 中,这一字段指示出服务器端选择的 RTMP 版本号。本文档中规范的版本号为 3。0、1、2 三个值是由早期其他产品使用的,是废弃值;4 - 31 被保留为 RTMP 协议的未来实现版本使用;32 - 255 不允许使用(以区分开 RTMP 和其他常以一个可打印字符开始的文本协议)。无法识别客户端所请求版本号的服务器应该以版本 3 响应,(收到响应的) 客户端可以选择降低到版本 3,或者放弃握手。
C1和S1
C1和S1结构相同,占用1536个字节,结构如下
这里写图片描述
times:4字节,包含一个timestamp,用于本终端发送的所有后续块的时间起点。这个值可以是0,也可以是任意值。要传送多个块流,终端可以传送其他块流当前的timestamp值。
zero:4字节,这个字段的内容是0。
random-bytes:1528字节,这个字段可以是任意内容。终端需要区分出响应来自他发起的握手还是对端发起的握手。内容随机,不需要加密。(random-bytes count,没理解啥意思)
C2和S2
C2和S2的长度也是1536个字节,内容基本是S1和C1的副本。结构如下
这里写图片描述
以C2为例
time:4个字节,timestamp,内容为S1中的timestamp。
time2:4个字节,timestamp,内容C1中的timestamp。
random-echo: 1528字节,内容为S1中的random-bytes。

复杂握手

C0和S0
同简单握手
C1和S1
complex handshake 将C1(S1)划分成四个部分,根据key和digest的位置,会有两种方式


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值