跳到主要内容

7. 关闭连接

7.1 定义​

7.1.1 关闭 WebSocket 连接​

关闭 WebSocket 连接意味着关闭底层 TCP 连接.

7.1.2 启动 WebSocket 关闭握手​

发送一个 Close control frame 来发起 closing handshake (关闭握手).

7.1.3 WebSocket 关闭握手已启动​

当任一 endpoint 发送 Close frame 时, 握手即开始.

7.1.4 WebSocket 连接已关闭​

当底层 TCP 连接关闭时, 该连接被认为已经关闭.

7.1.5 WebSocket 连接关闭码​

Close frame 中包含的 status code (状态码).

7.1.6 WebSocket 连接关闭原因​

Close frame 中可选的文本原因.

7.1.7 使 WebSocket 连接失败​

由于错误立即关闭连接, 不发送 Close frame.

7.2 异常关闭​

7.2.1 客户端发起的关闭​

当客户端检测到错误时, 应关闭连接.

7.2.2 服务器发起的关闭​

当服务器检测到错误时, 应关闭连接.

7.2.3 从异常关闭中恢复​

应用应实现重新连接机制.

7.3 连接的正常关闭​

正常关闭过程:

  1. 发起方 发送 Close frame
  2. 接收方 在收到 Close frame 后发送 Close frame 响应
  3. 接收方 关闭 TCP 连接
  4. 发起方 在收到 Close frame 后也关闭 TCP 连接
// Client normal closure
ws.close(1000, 'Normal closure');

// Server-side handling
ws.on('close', (code, reason) => {
console.log(`Connection closed: ${code} - ${reason}`);
});

7.4 状态码​

7.4.1 已定义状态码​

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

7.4.2 保留状态码范围​

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

Close Frame 结构​

+--------+--------+------------------+
| Status | Reason |
| Code | (optional) |
| (2 bytes)| (UTF-8 text) |
+--------+--------+------------------+

参考链接​