websocket RFC声明如下:
如果终结点收到"关闭"帧,并且之前未发送"关闭"帧,则终结点必须发送"关闭"帧作为响应。
后来它还提到:
服务器必须立即关闭底层 TCP 连接;
当服务器启动关闭握手时是有意义的,因为在从客户端检索关闭帧响应时,服务器可以执行 TCP 关闭。
当从客户端开始握手时会发生什么?客户端是否应该重新发送某种类型的消息以指示服务器终结点执行 TCP 关闭?还是服务器应该在检索关闭帧时执行 TCP 关闭?
客户端是否应该重新发送某种类型的消息以指示服务器终结点执行 tcp 关闭?
(a) 这正是 CLOSE FRAME 消息的用途,并且 (b) 不,服务器必须根据您引用的文本立即关闭 TCP 连接。
还是服务器应该在检索关闭帧时执行 TCP 关闭?
这正是它所说的。当然,在向客户端发送关闭帧之后。
正如你所指出的,RFC 说:
If an endpoint receives a Close frame and did not previously send a Close frame, the endpoint MUST send a Close frame in response.
这适用于服务器和客户端。因此,当平仓源自客户端时,将发生以下情况:
- 客户端发送
Close
帧 - 服务器接收
Close
帧并将其回显到客户端,因为它自己没有发送一个帧 - 服务器关闭其 TCP 连接(它必须在发送
Close
帧后立即执行此操作) - 客户端关闭其 TCP 连接。它可以在收到来自服务器的回显
Close
后直接执行此操作,也可以等到服务器在其末尾关闭它(由于连接状态更改,它会知道这一点)