3.3 close stream

Stream 打开后会分配内存等资源,Stream 关闭后会被释放掉。Stream 不会自动关闭,因此需要上层应用程序完成通信后及时关闭。可由通信的一端或两端同时发起关闭 Stream 请求,经过4次握手关闭 Stream。发起端首先发出 closestream 帧

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]  |[0x9]  |              [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 字段设置为 0x9,Payload len 字段设置为 0。Stream Id 字段写入客户端生成的标识 Stream 的随机数。

另一端收到后,更新 Stream 状态为 CLOSING,然后回复一个 closestream 帧

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]  |[0x9]  |              [0]              |
|R|C|A|     |O|N|       |       |                               |
|E|K|G|     |W| |       |       |                               |
|1|0|0|     |0|0|       |       |                               |
+-+-+-+-----+-+-+-------+-------+-------------------------------+
|              Stream Id [random id from client]                |
+---------------------------------------------------------------+

除了 timestamp 字段设置为最新的时间戳,其他字段设置和发起端的 closestream 帧格式一致,发起端收到该帧后,更新 Stream 状态为 CLOSING,然后再发出 closestream 确认帧

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]  |[0x9]  |              [0]              |
|R|C|A|     |O|N|       |       |                               |
|E|K|G|     |W| |       |       |                               |
|1|0|0|     |0|0|       |       |                               |
+-+-+-+-----+-+-+-------+-------+-------------------------------+
|              Stream Id [random id from client]                |
+---------------------------------------------------------------+

除了 timestamp 字段设置为最新的时间戳,其他字段如上所述。另一端收到后,更新 Stream 状态为 CLOSE,然后清理占用的资源,通知上层应用程序 Stream 已关闭。然后向发起端发送 closestream 确认帧

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]  |[0x9]  |              [0]              |
|R|C|A|     |O|N|       |       |                               |
|E|K|G|     |W| |       |       |                               |
|1|0|0|     |0|0|       |       |                               |
+-+-+-+-----+-+-+-------+-------+-------------------------------+
|              Stream Id [random id from client]                |
+---------------------------------------------------------------+

除了 timestamp 字段设置为最新的时间戳,其他字段如上所述。发起端收到后,更新 Stream 状态为 CLOSE,然后清理占用的资源,通知上层应用程序 Stream 已关闭。此时 Stream 关闭完成。