Skip to main content

7. Closing the Connection (关闭连接)

7.1 Definitions (定义)

7.1.1 Closing the WebSocket Connection (关闭WebSocket连接)

关闭WebSocket连接意味着关闭底层的TCP连接。

7.1.2 Start the WebSocket Closing Handshake (开始WebSocket关闭握手)

发送Close控制帧以开始关闭握手。

7.1.3 The WebSocket Closing Handshake is Started (WebSocket关闭握手已启动)

当任一端发送Close帧时,握手开始。

7.1.4 The WebSocket Connection is Closed (WebSocket连接已关闭)

当底层TCP连接关闭时,连接被认为已关闭。

7.1.5 The WebSocket Connection Close Code (WebSocket连接关闭代码)

Close帧中包含的状态码。

7.1.6 The WebSocket Connection Close Reason (WebSocket连接关闭原因)

Close帧中可选的文本原因。

7.1.7 Fail the WebSocket Connection (失败WebSocket连接)

由于错误立即关闭连接,不发送Close帧。

7.2 Abnormal Closures (异常关闭)

7.2.1 Client-Initiated Closure (客户端发起的关闭)

客户端检测到错误时,应该关闭连接。

7.2.2 Server-Initiated Closure (服务器发起的关闭)

服务器检测到错误时,应该关闭连接。

7.2.3 Recovering from Abnormal Closure (从异常关闭中恢复)

应用程序应该实现重连机制。

7.3 Normal Closure of Connections (正常关闭连接)

正常关闭流程:

  1. 发起方发送Close帧
  2. 接收方收到Close帧后发送Close帧响应
  3. 接收方关闭TCP连接
  4. 发起方收到Close帧后也关闭TCP连接
// 客户端正常关闭
ws.close(1000, 'Normal closure');

// 服务器端处理
ws.on('close', (code, reason) => {
console.log(`连接关闭: ${code} - ${reason}`);
});

7.4 Status Codes (状态代码)

7.4.1 Defined Status Codes (定义的状态代码)

代码名称说明
1000Normal Closure正常关闭
1001Going Away端点离开(如页面导航)
1002Protocol Error协议错误
1003Unsupported Data不支持的数据类型
1005No Status Rcvd保留,不应在Close帧中使用
1006Abnormal Closure保留,表示连接异常关闭
1007Invalid frame payload data无效的帧载荷数据(如无效UTF-8)
1008Policy Violation违反策略
1009Message Too Big消息过大
1010Mandatory Ext.客户端期望的扩展未协商
1011Internal Error服务器内部错误
1015TLS handshakeTLS握手失败(保留)

7.4.2 Reserved Status Code Ranges (保留的状态代码范围)

  • 0-999: 未使用
  • 1000-2999: 协议定义
  • 3000-3999: 库/框架使用
  • 4000-4999: 应用程序使用

Close帧结构

+--------+--------+------------------+
| Status | Reason |
| Code | (可选) |
| (2字节)| (UTF-8文本) |
+--------+--------+------------------+

参考链接