rtmp握手机制:
RTMP连接以握手开始。握手与协议的其他部分不同;它由三个固定大小的块组成,而不是由包含头的可变大小的块组成。
客户端(发起连接的端点)和服务器各自发送三个相同的块。为了说明,当由客户端发送时,这些块将被指定为C0、C1和C2;当由服务器发送时,它们将被指定为S0、S1和S2。
握手序列 (handshake sequence):
握手过程从客户端发送C0和C1块开始。
客户端必须在收到S1之后才能发送C2。 客户端必须在收到S2之后才能发送任何其他数据。
服务器必须在收到C0之后才能发送S0和S1,并且也可以等到收到C1之后。服务器必须在收到C1之后才能发送S2。服务器必须在收到C2之后才能发送任何其他数据。
C0和S0的格式 :
C0和S0数据包是一个单一的八位字节,被视为一个单一的8位整数字段:
以下是C0/S0数据包中的字段:
- 版本 : 8 bits,在C0中,这个字段标识客户端请求的RTMP版本。在S0中,这个字段标识服务器选择的RTMP版本。本规范定义的版本是3。值0-2是由早期专有产品使用的已弃用的值;4-31是为未来实现保留的值;32-255是不允许的(以便允许区分RTMP和始终以可打印字符开始的基于文本的协议)。如果服务器不认识客户端请求的版本,应该用3响应。客户端可以选择降级到版本3,或者放弃握手。
C1和S1的格式:
C1和S1数据包长度为1536个八位字节,由以下字段组成:
-
time : 4个字节。该字段包含一个时间戳,它应该用作此端点发送的所有未来块的时间起点。这个时间戳可以是0,或者是一个任意值。为了同步多个块流,端点可能希望发送另一个块流的当前时间戳值。
-
Zero : 4个字节 。这个字段必须全部为0。
-
Random data : 1528个字节。这个字段可以包含任何任意值。由于每个端点都必须区分它自己发起的握手响应和其对等端发起的握手,因此这个数据应该发送足够随机的内容。但无需使用密码学安全的随机性,甚至也不需要动态值。
C2和 S2格式:
C2和S2数据包长度为1536个八位字节,几乎是S1和C1(分别)的回声,由以下字段组成:
-
time : 4个字节 ;这个字段必须包含在S1(对于C2)或C1(对于S2)中由对等端发送的时间戳。
-
time2 : 4个字节;这个字段必须包含读取对等端之前发送的包(S1或C1)的时间戳。
-
random echo : 1528 个字节; S1(对于C2)或S2(对于C1)。 任一端点都可以使用时间和time2字段以及当前时间戳,作为对连接带宽和/或延迟的快速估计,但这不太可能有用。
握手图表:
下表描述了握手图中提到的各个状态: