WebSocket消息帧是WebSocket协议中的一个基本单位,它定义了数据在客户端和服务器之间传递的格式。每个数据帧包含了不同类型的数据和各种控制信息。以下是WebSocket消息帧的组成结构:
WebSocket 帧结构
-
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)
-
MASK 和 Payload length(第二个字节)
- MASK(1位):指示数据是否被掩码处理。客户端发送的数据必须被掩码,因此该位为1;服务器发送的数据不需要掩码,因此该位为0。
- Payload length(7位、7 + 16 位、或者 7 + 64 位) :表示有效载荷数据的长度。
- 如果值在0到125之间,表示数据的实际长度。
- 如果值为126,表示后续的2个字节(16位无符号整数)是有效载荷长度。
- 如果值为127,表示后续的8个字节(64位无符号整数)是有效载荷长度。
-
扩展的 Payload length(可选)
- 当
Payload length
为126时,这部分是16位的无符号整数,表示实际数据长度。 - 当
Payload length
为127时,这部分是64位的无符号整数,表示实际数据长度。
- 当
-
MASK key(0 或 4 字节)
- 仅在
MASK
位为1时存在,长度为4字节(32位),用于掩码/解码数据。
- 仅在
-
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字节
通过这种详细结构,可以灵活的把消息帧从客户端发送到服务器,或者从服务器发送到客户端,并进行解析或处理。