WebSocket消息帧的组成结构

WebSocket消息帧是WebSocket协议中的一个基本单位,它定义了数据在客户端和服务器之间传递的格式。每个数据帧包含了不同类型的数据和各种控制信息。以下是WebSocket消息帧的组成结构:

WebSocket 帧结构

  1. FIN、RSV1、RSV2、RSV3 和 opcode(第一个字节)

    • FIN(1位):表示是否为最后一个帧。值为1时,表示这是消息的最后一个帧;值为0时,表示后续还有帧。
    • RSV1、RSV2、RSV3(各1位):保留位,通常为0,除非协议规定了扩展。
    • opcode(4位) :表示帧的类型,常见的值有:
      • 0x0:继续帧(Continuation frame)
      • 0x1:文本帧(Text frame)
      • 0x2:二进制帧(Binary frame)
      • 0x8:连接关闭(Connection Close frame)
      • 0x9:Ping帧(Ping frame)
      • 0xA:Pong帧(Pong frame)
  2. MASK 和 Payload length(第二个字节)

    • MASK(1位):指示数据是否被掩码处理。客户端发送的数据必须被掩码,因此该位为1;服务器发送的数据不需要掩码,因此该位为0。
    • Payload length(7位、7 + 16 位、或者 7 + 64 位) :表示有效载荷数据的长度。
      • 如果值在0到125之间,表示数据的实际长度。
      • 如果值为126,表示后续的2个字节(16位无符号整数)是有效载荷长度。
      • 如果值为127,表示后续的8个字节(64位无符号整数)是有效载荷长度。
  3. 扩展的 Payload length(可选)

    • Payload length为126时,这部分是16位的无符号整数,表示实际数据长度。
    • Payload length为127时,这部分是64位的无符号整数,表示实际数据长度。
  4. MASK key(0 或 4 字节)

    • 仅在MASK位为1时存在,长度为4字节(32位),用于掩码/解码数据。
  5. Payload data(可变长度)

    • 实际的数据内容。数据长度由前面的Payload length字段定义。
    • 如果MASK位为1,则在发送数据时需要用MASK key解码,接收数据时需要用MASK key编码。

帧的发送和接收过程

一个典型的WebSocket消息帧在传输过程中的大致结构如下:

复制代码
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          |
+-------------------------------- - - - - - - - - - - - - - - - +
:                     Payload Data continued ...                :
+---------------------------------------------------------------+
:                     Payload Data continued ...                :
+---------------------------------------------------------------+

具体示例

例如,一个包含长度为126字节的数据文本帧的Basic示例如下:

复制代码
0xffff0000  // FIN=1, RSV1=0, RSV2=0, RSV3=0, opcode=0x1 (文本帧)
0x7e000002  // MASK=1, Payload length=126 (表示后面有126字节的数据)
0x12345678  // Masking key(掩码键)
<mask adjusted data>  // 实际数据,数据长度为126字节

通过这种详细结构,可以灵活的把消息帧从客户端发送到服务器,或者从服务器发送到客户端,并进行解析或处理。

相关推荐
烟雨江南7858 小时前
呼叫中心如何用语音识别做客服质检?从人工抽检到全量通话分析的落地方案
人工智能·websocket·音视频·语音识别·ai客服
脉动数据行情121 小时前
C# 实现德指 DAX 期货 WebSocket 实时行情监听
开发语言·websocket·c#
烟雨江南7851 天前
200路并发语音识别系统实践:CPU、GPU与国产昇腾三种部署方案怎么选?
人工智能·websocket·音视频·语音识别·ai客服
用户59362865610331 天前
Socket.IO 从入门到原理:一份新手也能看懂的完整笔记
websocket
TickDB1 天前
Python 接入 A 股盘前集合竞价数据:AkShare 报错到 TickDB 实测的完整解法
python·websocket·行情数据 api
幸运小圣1 天前
SSE 与 WebSocket 新手入门:前端实时通信完全指南【JavaScript】
前端·javascript·websocket
orient.lu2 天前
第 24 章《WebSocket 通道》· nanobot WebSocket 通道源码深度解析:多路复用 + 重连空闲 + 媒体接入
websocket·源码解析·nanobot
sugar__salt4 天前
从跨域到 WebSocket:一篇讲透浏览器的通信边界
网络·websocket·网络协议
ocean21034 天前
2025-2026年计算机网络大厂面试高频问题示例
websocket·计算机网络·秋招·tcp·后端面试·大厂面经·面试真题
Darling噜啦啦4 天前
WebSocket 双工通信实战:从协议握手到跨域原理,彻底搞懂实时通信的"另一条路"
websocket