rtmp信令第一步是握手(Handshake),握手有Simple Handshake和Complex Handshake,Simple Handshake为简单握手,不需要使用加密算法校验,Complex Handshake为复杂握手,需要使用openssl的算法校验。
一、Simple Handshake
概述
1) C0 1 byte,表示客户端RTMP的版本号。
2) C1 1536 bytes (4-time + 4-zero + 1528-random)
- 时间:4 bytes。时间戳。
- 零:4 bytes。本字段必须是全零。
- 随机数据:1528 bytes。随即数据用于区分身份,应充分的随机性。
3) C2 1536 bytes (4-time + 4-time2 + 1528-echo),是对S1的回复
- 时间:4 bytes。S1的时间。
- 时间 2:4 bytes。C1的时间。
- 随机回复:1528 bytes。S1的随机数据。
4) S0 1 byte 表示服务端RTMP的版本号,格式同C0
5) S1 1536 bytes (4-time + 4-zero + 1528-random),格式同C1
6) S2 1536 bytes (4-time + 4-zero + 1528-echo),是对C1的回复,格式同C2
举例
以下为使用wireshark抓包的部分内容:
C->S
Handshake C0+C1
Protocol version: 03
Handshake data: 5a49100000000000e16a3d0c750c0f46f8b4b87b61d8084f...
S->C
Handshake S0+S1+S2
Protocol version: 03
Handshake data: 5a49100000000000e16a3d0c750c0f46f8b4b87b61d8084f...
Handshake data: 5a49100000000000e16a3d0c750c0f46f8b4b87b61d8084f...
C->S
Handshake C2
Handshake data: 5a4910005a491000e16a3d0c750c0f46f8b4b87b61d8084f...
二、Complex Handshake
概述
1) C0 1 byte,表示客户端RTMP的版本号。
2) C1 1536 bytes (4-time + 4-version + 764-key + 764-digest)
764 bytes key:
- random-data:(offset)bytes
- key-data:128bytes
- random-data:(764-offset-128-4)bytes
- offset:4bytes
764 bytes digest:
- offset:4bytes
- random-data:(offset)bytes
- digest-data:32bytes
- random-data:(764-4-offset-32)bytes
3) C2 1536 bytes (4-time + 4-version + 764-key + 764-digest),是对S1的回复
4) S0 1 byte 表示服务端RTMP的版本号,格式同C0
5) S1 1536 bytes (4-time + 4-version + 764-key + 764-digest),格式同C1
6) S2 1536 bytes (4-time + 4-version + 764-key + 764-digest),是对C1的回复,格式同C2
举例
C->S
Handshake C0+C1
Protocol version: 03
Handshake data: 0000000009007c02f778551eceab8e1e362f07c5868a70b2...
S->C
Handshake S0+S1+S2
Protocol version: 03
Handshake data: 38a29c830d0e0a0db2cf54ce67b9f0d74acb2a8e231ce5f9...
Handshake data: 63c00fbe06cb65b72238eafa4a5c4822b34aa75c413fb365...
C->S
Handshake C2
Handshake data: e25c15c22caf72d0986fbd3eda0d7151973e19083e0abbef...