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 关闭完成。