跳到主要内容

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) |
+--------+--------+------------------+

参考链接