3.2 open stream
当会话为 READY 状态时,客户端可以发起打开 Stream 的请求。客户端首先创建 Stream 对象,状态为 OPEN,然后生成一个4字节长无符号随机整数作为 Stream Id,并向服务端发送 openstream 帧
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-------------------------------+-------------------------------+
| [id from client] | [id from server] |
+-------------------------------+-------------------------------+
| timestamp ... |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| ... timestamp [curent time] |
+-+-+-+-----+-+-+-------+-------+-------------------------------+
|S|P|F| RSV |S|F| RSV |OPCODE | Payload len |
|T|A|R| [0] |L|I| [0] |[0x7] | [0] |
|R|C|A| |O|N| | | |
|E|K|G| |W| | | | |
|1|0|0| |0|0| | | |
+-+-+-+-----+-+-+-------+-------+-------------------------------+
| Stream Id [random id] |
+---------------------------------------------------------------+
timestamp 字段写入当前时间戳,精确到毫秒。STRE 字段设置为 1,PACK、FRAG、SLOW、FIN 设置为 0。RSV 字段设置为 0。OPCODE 字段设置为 0x7,Payload len 字段设置为 0。Stream Id 字段写入刚刚生成的随机数。
服务端收到 openstream 帧后,解析出 Stream Id 并创建 Stream,状态为 OPEN,并回复 streamopen 帧
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-------------------------------+-------------------------------+
| [id from client] | [id from server] |
+-------------------------------+-------------------------------+
| timestamp ... |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| ... timestamp [curent time] |
+-+-+-+-----+-+-+-------+-------+-------------------------------+
|S|P|F| RSV |S|F| RSV |OPCODE | Payload len |
|T|A|R| [0] |L|I| [0] |[0x8] | [0] |
|R|C|A| |O|N| | | |
|E|K|G| |W| | | | |
|1|0|0| |0|0| | | |
+-+-+-+-----+-+-+-------+-------+-------------------------------+
| Stream Id [random id from client] |
+---------------------------------------------------------------+
timestamp 字段写入当前时间戳,精确到毫秒。STRE 字段设置为 1,PACK、FRAG、SLOW、FIN 设置为 0。RSV 字段设置为 0。OPCODE 字段设置为 0x8,Payload len 字段设置为 0。Stream Id 字段写入客户端生成的标识 Stream 的随机数。
客户端收到服务端发出的 streamopen 帧后,更新 Stream 状态为 READY,并向上层应用程序返回 Stream 对象。然后回复服务端一个 streamopoen 帧
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-------------------------------+-------------------------------+
| [id from client] | [id from server] |
+-------------------------------+-------------------------------+
| timestamp ... |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| ... timestamp [curent time] |
+-+-+-+-----+-+-+-------+-------+-------------------------------+
|S|P|F| RSV |S|F| RSV |OPCODE | Payload len |
|T|A|R| [0] |L|I| [0] |[0x8] | [0] |
|R|C|A| |O|N| | | |
|E|K|G| |W| | | | |
|1|0|0| |0|0| | | |
+-+-+-+-----+-+-+-------+-------+-------------------------------+
| Stream Id [random id from client] |
+---------------------------------------------------------------+
timestamp 字段写入当前时间戳,精确到毫秒。STRE 字段设置为 1,PACK、FRAG、SLOW、FIN 设置为 0。RSV 字段设置为 0。OPCODE 字段设置为 0x8,Payload len 字段设置为 0。Stream Id 字段写入客户端生成的标识 Stream 的随机数。
服务端收到客户端的 streamopen 帧后,更新 Stream 状态为 READY,向上层应用程序返回 Stream 对象。
此时 Stream 创建完成,客户端与服务端可通过此 Stream 发送与接收数据。