WebSocket的响应格式主要涉及到连接建立时的HTTP握手和随后数据帧的格式。以下是相关细节:
1. WebSocket 握手过程
在WebSocket建立连接时,客户端通过HTTP请求发起握手,服务器需返回相应的HTTP响应。
客户端请求示例:
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
服务器响应示例:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: dGhlIHNhbXBsZSBub25jZQ==
- Status Code:
101 Switching Protocols
表示协议切换。 - Sec-WebSocket-Accept 是根据客户端发送的
Sec-WebSocket-Key
经过特定处理(SHA-1 加密和 Base64 编码)后生成的值,用于验证连接。
2. WebSocket 数据帧格式
一旦连接建立成功,数据将以数据帧的形式在客户端和服务器之间传输。每个数据帧包含几个关键字段:
帧结构:
- FIN (1 bit): 表示这是最后一个帧(1为是,0为否)。
- RSV1, RSV2, RSV3 (各 1 bit): 保留位,用于扩展控制。一般情况下这些位都设置为0。
- Opcode (4 bits): 指明帧类型,例如文本消息、二进制消息、Ping、Pong等。
- Mask (1 bit): 如果设置为1,则表示该帧的数据部分是被掩码过的(仅对客户端到服务器的数据适用)。
- Payload length (7 bits or 7+16 or 7+64 bits): 有效负载长度,可变。如果长度小于125,使用7 bits表示;如果在126到65535之间,则使用16 bits表示;如果大于65535,则使用64 bits表示。
- Masking Key (4 bytes): 当 Mask 为真时,这里会包含4字节的掩码键,用于对有效负载进行解码。
- Payload Data: 实际的数据内容,根据有效负载长度决定其大小。
示例数据帧:
假设我们发送一个简单文本消息”Hello”:
| FIN | RSV | Opcode | Mask | Payload length | Masking Key | Payload Data |
|-----|-----|--------|------|-----------------|--------------|---------------|
| 1 | 000 | 0x1 | 0 | N/A | N/A | Hello |
常见 Opcode 值:
0x0
: continuation frame(续传帧)0x1
: text frame(文本帧)0x2
: binary frame(二进制帧)0x8
: connection close frame(关闭连接帧)0x9
: ping frame(Ping 帧)0xA
: pong frame(Pong 帧)
通过这种方式,WebSocket能够实现高效且灵活的双向通信。
内容由零声教学AI助手提供,问题来源于学员提问