WebSocket 是一种全双工通信协议,主要用于在客户端和服务器之间进行实时数据传输。WebSocket 的数据包格式可以分为两个部分:头部和负载(消息体)。下面是 WebSocket 数据包的基本结构:
1. WebSocket 帧格式
每个 WebSocket 消息都由一个或多个帧组成。每一帧的结构如下:
字段 | 大小 | 描述 |
---|---|---|
FIN | 1 bit | 表示这是消息的最后一帧(1 = 是,0 = 否) |
RSV1, RSV2, RSV3 | 1 bit each | 保留位,通常用于扩展 |
Opcode | 4 bits | 指示当前帧的数据类型 |
Mask | 1 bit | 指示是否对负载进行掩码处理 (1 = 有, 0 = 没有) |
Payload length | Variable | 有效载荷的长度,依赖于长度值的大小 |
Masking key | 4 bytes | 如果 Mask 为 1,则包含掩码键 |
Payload data | Variable | 实际发送的数据 |
2. 字段详细说明
FIN (1 bit):
- 如果为
1
,表示这是一个完整消息的最后一帧;如果为0
,则还有后续帧。
- 如果为
RSV (3 bits):
- 保留字段,用于未来扩展,一般情况下可以设置为
000
。
- 保留字段,用于未来扩展,一般情况下可以设置为
Opcode (4 bits):
- 指示消息类型。常用值包括:
0x0
: 连续文本帧0x1
: 文本消息0x2
: 二进制消息0x8
: 连接关闭0x9
: ping0xA
: pong
- 指示消息类型。常用值包括:
Mask (1 bit):
- 客户端到服务器的所有消息必须使用掩码,而从服务器到客户端的消息不能使用掩码。
Payload length (7 bits / 7+16 bits / 7+64 bits):
- 根据实际长度可变:
- 如果小于等于 125 字节,直接使用该字节作为有效载荷长度;
- 如果为 126,则接下来的两个字节表示有效载荷长度(16 位);
- 如果为127,则接下来的八个字节表示有效载荷长度(64 位)。
- 根据实际长度可变:
Masking key (4 bytes):
- 当 Mask 为
1
时存在,是一个随机生成的四字节数组,用来掩码后面的 payload data。
- 当 Mask 为
Payload data:
- 实际传输的数据,根据 Payload length 的大小决定数据部分的长度。
示例
以下是一个简单的文本消息 “Hello” 的 WebSocket 数据包示例:
FIN: 1
RSV: 000
Opcode: 0001 (文本)
Mask: 0
Payload Length:5
Mask Key: A3 B2 C5 D7
Payload Data:
Original Data: H e l l o
Masked Data: M L K S J ... (根据掩码计算)
在构建和解析 WebSocket 消息时,需要遵循上述格式规则,以确保能够正确地与 WebSocket 服务进行交互。如果你需要更多具体信息或者更复杂的数据交换示例,请告诉我!
内容由零声教学AI助手提供,问题来源于学员提问