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 连接的正常关闭
正常关闭过程:
- 发起方 发送 Close frame
- 接收方 在收到 Close frame 后发送 Close frame 响应
- 接收方 关闭 TCP 连接
- 发起方 在收到 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 已定义状态码
| Code | Name | 描述 |
|---|---|---|
| 1000 | Normal Closure | 正常关闭 |
| 1001 | Going Away | endpoint 正在离开 (例如页面导航) |
| 1002 | Protocol Error | 协议错误 |
| 1003 | Unsupported Data | 不支持的数据类型 |
| 1005 | No Status Rcvd | 保留, 不应在 Close frame 中使用 |
| 1006 | Abnormal Closure | 保留, 表示异常连接关闭 |
| 1007 | Invalid frame payload data | 无效的 frame payload data (例如无效 UTF-8) |
| 1008 | Policy Violation | 策略违规 |
| 1009 | Message Too Big | 消息过大 |
| 1010 | Mandatory Ext. | 客户端期望的扩展未被协商 |
| 1011 | Internal Error | 服务器内部错误 |
| 1015 | TLS handshake | TLS 握手失败 (保留) |
7.4.2 保留状态码范围
- 0-999: 未使用
- 1000-2999: 协议定义
- 3000-3999: 库/框架使用
- 4000-4999: 应用使用
Close Frame 结构
+--------+--------+------------------+
| Status | Reason |
| Code | (optional) |
| (2 bytes)| (UTF-8 text) |
+--------+--------+------------------+
参考链接
- 上一章: 6. 发送和接收数据
- 下一章: 8. 错误处理
- 详细说明: 关闭过程