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 发送与接收数据。