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

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

相关推荐
vvilkim1 天前
WebSocket:实现实时通信的利器
网络·websocket·网络协议
木头没有瓜1 天前
使用websocket,注入依赖service的bean为null
网络·websocket·网络协议
hamburgerDaddy11 天前
从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(十二) socketio 消息处理
前端·javascript·websocket·mongodb·react.js·node.js·express
忍者算法1 天前
在 Linux 下,服务器如何知道某个 TCP 连接来了消息? 这就涉及 IO 事件通知机制!
websocket·网络协议·tcp/ip·http·信息与通信
简单点了2 天前
基于websocket搭建聊天室
网络·websocket·网络协议
是纯一呀2 天前
WebSocket(WS)协议系列(三)加密
网络·websocket·网络协议
名之以父2 天前
【前端跨域】WebSocket如何实现跨域通信?原理、实践与安全指南
前端·javascript·网络·websocket·网络协议·tcp/ip·安全
stayhungerstayflush2 天前
spring websocket 介绍
java·websocket·spring
木心操作3 天前
nodejs使用WebSocket实现聊天效果
javascript·网络·websocket·网络协议·node.js
徐白11774 天前
TCP、UDP、WebSocket 和 HTTP 教程
websocket·tcp/ip·udp