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字节

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

相关推荐
她说..15 小时前
万字详解WebSocket的用法
java·网络·websocket·网络协议·springboot
会周易的程序员15 小时前
openplc runtime v4 安全
网络·c++·物联网·websocket·安全·https·ssl
NGC_661117 小时前
webSocket通讯流程
websocket
feasibility.2 天前
打造实时电商数据大屏:Vue 3 + FastAPI + WebSocket
大数据·前端·javascript·vue.js·websocket·fastapi·数据可视化
~央千澈~2 天前
抖音弹幕游戏开发之第3集:WebSocket基础知识·优雅草云桧·卓伊凡
网络·websocket·网络协议
qq_297574672 天前
SpringBoot 集成 WebSocket 实现双屏实时消息互推(零基础可直接用)
spring boot·后端·websocket
半路_出家ren2 天前
10.子域名和后台扫描
网络·python·websocket·网络安全·kali·域名扫描·web站点扫描
码云数智-大飞2 天前
实时通信选型指南:WebSocket 与 HTTP 长轮询深度对比及适用场景分析
websocket·网络协议·http
Tony6666888883 天前
Websocket的理论与实践应用
网络·websocket·网络协议
yuwei0213 天前
websocket中所遇到的tcp粘包问题
websocket·网络协议·tcp/ip