WebSocket协议详解
WebSocket协议详解
WebSocket是一种在单个TCP连接上提供全双工通信的网络协议,允许服务器主动向客户端推送数据。下面详细介绍WebSocket协议的格式和相关知识。
WebSocket协议基本概念
WebSocket协议由IETF标准RFC 6455定义,主要特点:
- 基于TCP的全双工通信
- 持久连接,避免多次握手
- 浏览器原生支持
- 数据格式轻量,相比HTTP头部开销小
- 支持二进制和文本数据传输
WebSocket握手过程
WebSocket连接建立需要通过HTTP升级机制:
客户端请求示例:
1 | GET /ws |
服务器响应示例:
1 | 101 Switching Protocols |
关键点:
- Sec-WebSocket-Key:客户端随机生成的Base64编码字符串
- Sec-WebSocket-Accept:服务器通过特定算法处理客户端提供的key
- 将客户端的key与固定GUID字符串”258EAFA5-E914-47DA-95CA-C5AB0DC85B11”拼接
- 计算SHA-1哈希值
- 对结果进行Base64编码
WebSocket帧格式详解
WebSocket数据以**帧(Frame)**为单位传输,帧格式如下:
1 | 0 1 2 3 |
帧头字段说明:
FIN(1位): 标识是否为消息的最后一帧
- 0: 消息还有后续帧
- 1: 消息的最后一帧
RSV1-3(3位): 保留位,通常为0
- 只有使用WebSocket扩展时才非零
Opcode(4位): 操作码,标识帧类型
- 0x0: 继续帧
- 0x1: 文本帧
- 0x2: 二进制帧
- 0x8: 关闭连接
- 0x9: Ping
- 0xA: Pong
MASK(1位): 是否使用掩码
- 客户端发送到服务器的消息必须掩码
- 服务器发送到客户端的消息不得掩码
Payload length(7位+扩展): 消息长度
- 0-125: 实际长度
- 126: 使用后续2字节表示长度(16位)
- 127: 使用后续8字节表示长度(64位)
Masking-key(0或4字节): 掩码密钥
- 仅当MASK=1时存在
Payload data: 实际数据
数据掩码机制
客户端发送到服务器的所有帧必须应用掩码:
- 客户端生成4字节随机掩码密钥
- 对每个数据字节应用异或(XOR)操作:
1
转换后字节 = 原始字节 XOR 掩码密钥[i % 4]
- 服务器接收后使用相同算法解码
掩码的主要目的是防止缓存投毒攻击,增强安全性。
WebSocket操作码详解
文本帧(0x1)
- 包含UTF-8编码文本
- 完整消息可能跨多帧
二进制帧(0x2)
- 包含任意二进制数据
关闭帧(0x8)
- 可附带状态码和文本说明
- 常见状态码:
- 1000: 正常关闭
- 1001: 离开
- 1002: 协议错误
- 1003: 数据类型不支持
Ping(0x9)/Pong(0xA)
- 心跳检测
- 收到Ping必须回复Pong
- 可包含应用数据
数据分片
大型消息可分片发送:
- 首帧设置适当的opcode(1:文本或2:二进制)
- 中间帧opcode为0(继续帧)
- 最后一帧FIN=1
- 只有首帧设置有效opcode,接收方需重组完整消息
WebSocket实现注意事项
连接管理
- 维护活跃连接列表
- 实现心跳检测
- 优雅处理关闭
安全性考虑
- 使用WSS(WebSocket Secure)
- 验证Origin头
- 防止资源枯竭攻击
- 实施速率限制
性能优化
- 使用事件驱动架构(如Epoll)
- 避免频繁小消息
- 合理配置缓冲区大小
WebSocket与HTTP/2.0比较
| 特性 | WebSocket | HTTP/2.0 |
|---|---|---|
| 双向通信 | 原生支持 | 支持(PUSH) |
| 持久连接 | 是 | 是 |
| 头部开销 | 非常小 | 压缩减小 |
| 消息类型 | 文本/二进制 | 请求/响应 |
| 服务推送 | 完全支持 | 有限支持 |
应用场景
WebSocket特别适合以下场景:
- 实时协作平台
- 游戏和多媒体应用
- 股票交易和金融数据
- 聊天应用
- 社交媒体实时通知
- 物联网设备通信
- 日志实时监控
浏览器支持和兼容性
现代浏览器都很好地支持WebSocket:
- Chrome 4+
- Firefox 4+
- Safari 5+
- Edge/IE 10+
对于不支持WebSocket的环境,可使用的回退技术:
- 长轮询
- SSE (Server-Sent Events)
- Flash Socket
- 标题: WebSocket协议详解
- 作者: The Redefine Team
- 创建于 : 2024-12-27 13:15:00
- 更新于 : 2025-06-19 15:17:45
- 链接: https://redefine.ohevan.com/2024/12/27/WebSocket/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论