RFC 6455 - WebSocket 协议
- 状态: Proposed Standard
- 发布日期: 2011 年 12 月
- 文档流: IETF
- 勘误: 无勘误
摘要
WebSocket 协议允许客户端和服务器在单个 TCP 连接上进行全双工通信. WebSocket 协议设计为可在 Web 浏览器和 Web 服务器中实现, 但也可由任何客户端或服务器应用使用.
WebSocket 协议是一个独立的, 基于 TCP 的协议. 它与 HTTP 的唯一关系是其握手会被 HTTP 服务器解释为 Upgrade 请求.
目录
- 1. 引言
- 1.1 背景
- 1.2 协议概览
- 1.3 开放握手
- 1.4 关闭握手
- 1.5 设计理念
- 1.6 安全模型
- 1.7 与 TCP 和 HTTP 的关系
- 1.8 建立连接
- 1.9 子协议和扩展
- 2. 一致性要求
- 2.1 术语和其他约定
- 3. WebSocket URI
- 4. 开放握手
- 4.1 客户端要求
- 4.2 服务器端要求
- 4.3 收集扩展和子协议
- 4.4 支持多个版本
- 5. 数据成帧
- 5.1 概览
- 5.2 基础成帧协议
- 5.3 客户端到服务器的掩码
- 5.4 分片
- 5.5 控制帧
- 5.6 数据帧
- 5.7 示例
- 5.8 可扩展性
- 6. 发送和接收数据
- 6.1 发送数据
- 6.2 接收数据
- 7. 关闭连接
- 7.1 定义
- 7.2 异常关闭
- 7.3 正常关闭
- 7.4 状态码
- 8. 错误处理
- 8.1 处理 UTF-8 编码数据中的错误
- 9. 扩展
- 9.1 协商扩展
- 9.2 已知扩展
- 10. 安全考虑
- 10.1 非浏览器客户端
- 10.2 Origin 考虑
- 10.3 针对基础设施的攻击
- 10.4 实现特定限制
- 10.5 WebSocket 客户端认证
- 10.6 连接保密性和完整性
- 10.7 无效数据处理
- 10.8 SHA-1 的使用
- 11. IANA 考虑
- 12. 在其他规范中使用 WebSocket 协议
- 13. 致谢
- 14. 参考文献
- 14.1 规范性引用
- 14.2 资料性引用
相关资源
- 实现指南: WebSocket 协议实现指南 - 详细技术文档, 代码示例和最佳实践
- 官方 RFC: RFC 6455
- DataTracker: RFC 6455 DataTracker
- 勘误: RFC Editor Errata
相关 RFC
- RFC 6455: The WebSocket Protocol ← 本文档
- RFC 7692: WebSocket Compression Extensions
- RFC 8441: Bootstrapping WebSockets with HTTP/2
快速参考
WebSocket URI 格式
ws-URI = "ws:" "//" host [ ":" port ] path [ "?" query ]
wss-URI = "wss:" "//" host [ ":" port ] path [ "?" query ]
ws://- 未加密连接, 默认端口 80wss://- TLS 加密连接, 默认端口 443, 生产环境推荐使用
握手示例
客户端请求:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Origin: http://example.com
服务器响应:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
帧类型 (Opcode)
| Opcode | 类型 | 描述 |
|---|---|---|
| 0x0 | Continuation | Continuation frame |
| 0x1 | Text | Text frame (UTF-8) |
| 0x2 | Binary | Binary frame |
| 0x8 | Close | Close frame |
| 0x9 | Ping | Ping frame (heartbeat) |
| 0xA | Pong | Pong frame (heartbeat response) |
关闭状态码
| Code | 名称 | 描述 |
|---|---|---|
| 1000 | Normal Closure | 正常关闭 |
| 1001 | Going Away | 端点离开, 例如页面导航 |
| 1002 | Protocol Error | 协议错误 |
| 1003 | Unsupported Data | 不支持的数据类型 |
| 1006 | Abnormal Closure | 异常关闭, 未发送 Close frame |
| 1009 | Message Too Big | 消息过大 |
| 1011 | Internal Error | 服务器内部错误 |
帧结构 (基础格式)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+-------------------------------+
| Extended payload length continued, if payload len == 127 |
+-------------------------------+-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------+-------------------------------+
要点:
- FIN: 1 表示最终帧, 0 表示后续还有帧
- MASK: 客户端到服务器必须为 1, 服务器到客户端必须为 0
- Opcode: 帧类型标识符
- Payload Length: 数据长度, 0-125 直接表示, 126 使用 16-bit, 127 使用 64-bit
核心术语
| 英文术语 | 描述 |
|---|---|
| Full-Duplex Communication | 双向同时通信 |
| Opening Handshake | 升级到 WebSocket 的 HTTP 握手过程 |
| Closing Handshake | 优雅关闭连接的过程 |
| Frame | 数据传输的基本单元 |
| Message | 由一个或多个帧组成 |
| Masking | 客户端数据必须进行掩码处理的安全机制 |
| Fragmentation | 将大型消息拆分为多个帧传输 |