WebSocket协议详解

The Redefine Team Lv3

WebSocket协议详解

WebSocket是一种在单个TCP连接上提供全双工通信的网络协议,允许服务器主动向客户端推送数据。下面详细介绍WebSocket协议的格式和相关知识。

WebSocket协议基本概念

WebSocket协议由IETF标准RFC 6455定义,主要特点:

  • 基于TCP的全双工通信
  • 持久连接,避免多次握手
  • 浏览器原生支持
  • 数据格式轻量,相比HTTP头部开销小
  • 支持二进制和文本数据传输

WebSocket握手过程

WebSocket连接建立需要通过HTTP升级机制

客户端请求示例:

1
2
3
4
5
6
GET /ws HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

服务器响应示例:

1
2
3
4
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

关键点:

  • Sec-WebSocket-Key:客户端随机生成的Base64编码字符串
  • Sec-WebSocket-Accept:服务器通过特定算法处理客户端提供的key
    • 将客户端的key与固定GUID字符串”258EAFA5-E914-47DA-95CA-C5AB0DC85B11”拼接
    • 计算SHA-1哈希值
    • 对结果进行Base64编码

WebSocket帧格式详解

WebSocket数据以**帧(Frame)**为单位传输,帧格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
 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 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| Payload Data continued ... |
+---------------------------------------------------------------+

帧头字段说明:

  1. FIN(1位): 标识是否为消息的最后一帧

    • 0: 消息还有后续帧
    • 1: 消息的最后一帧
  2. RSV1-3(3位): 保留位,通常为0

    • 只有使用WebSocket扩展时才非零
  3. Opcode(4位): 操作码,标识帧类型

    • 0x0: 继续帧
    • 0x1: 文本帧
    • 0x2: 二进制帧
    • 0x8: 关闭连接
    • 0x9: Ping
    • 0xA: Pong
  4. MASK(1位): 是否使用掩码

    • 客户端发送到服务器的消息必须掩码
    • 服务器发送到客户端的消息不得掩码
  5. Payload length(7位+扩展): 消息长度

    • 0-125: 实际长度
    • 126: 使用后续2字节表示长度(16位)
    • 127: 使用后续8字节表示长度(64位)
  6. Masking-key(0或4字节): 掩码密钥

    • 仅当MASK=1时存在
  7. Payload data: 实际数据

数据掩码机制

客户端发送到服务器的所有帧必须应用掩码

  1. 客户端生成4字节随机掩码密钥
  2. 对每个数据字节应用异或(XOR)操作:
    1
    转换后字节 = 原始字节 XOR 掩码密钥[i % 4]
  3. 服务器接收后使用相同算法解码

掩码的主要目的是防止缓存投毒攻击,增强安全性。

WebSocket操作码详解

  1. 文本帧(0x1)

    • 包含UTF-8编码文本
    • 完整消息可能跨多帧
  2. 二进制帧(0x2)

    • 包含任意二进制数据
  3. 关闭帧(0x8)

    • 可附带状态码和文本说明
    • 常见状态码:
      • 1000: 正常关闭
      • 1001: 离开
      • 1002: 协议错误
      • 1003: 数据类型不支持
  4. Ping(0x9)/Pong(0xA)

    • 心跳检测
    • 收到Ping必须回复Pong
    • 可包含应用数据

数据分片

大型消息可分片发送:

  • 首帧设置适当的opcode(1:文本或2:二进制)
  • 中间帧opcode为0(继续帧)
  • 最后一帧FIN=1
  • 只有首帧设置有效opcode,接收方需重组完整消息

WebSocket实现注意事项

  1. 连接管理

    • 维护活跃连接列表
    • 实现心跳检测
    • 优雅处理关闭
  2. 安全性考虑

    • 使用WSS(WebSocket Secure)
    • 验证Origin头
    • 防止资源枯竭攻击
    • 实施速率限制
  3. 性能优化

    • 使用事件驱动架构(如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 进行许可。
评论