WebSocket 是一种在客户端和服务器之间进行全双工通信的协议,允许数据在两个方向上实时传输。WebSocket 的通信过程和数据格式可以分为以下几个部分:
1. 建立连接
首先,WebSocket 客户端(通常是浏览器)会发送一个 HTTP 请求以建立 WebSocket 连接。这个请求包含特定的头信息,例如 Upgrade
和 Connection
,如下所示:
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
- Sec-WebSocket-Key:一个随机生成的 Base64 编码字符串,用于安全性验证。
- Sec-WebSocket-Version:表示使用的 WebSocket 协议版本。
如果服务器支持 WebSocket,会返回类似以下的响应来确认升级:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: F6A5C4YH0hO0F59VNHSTe8ZKi94=
2. 数据帧格式
一旦建立了 WebSocket 连接,客户端和服务器可以开始发送消息。这些消息以数据帧(frame)的形式进行交换。每个数据帧都包含以下结构:
- FIN:第一个比特,用于指示这是最后一帧。
- Opcode:接下来的四个比特,用于指示帧的类型(文本、二进制、关闭等)。
- Mask:一个比特,指示负载是否被掩码化。
- Payload length:负载长度,指定实际消息的数据大小,可以是 7、7+16 或 7+64 位。
- Masking key(可选):如果 Mask 为真,将包含用于掩码的密钥。
- Payload data:实际的数据内容。
常见的数据帧类型
Opcode | 类型 |
---|---|
0x0 | Continuation Frame |
0x1 | Text Frame |
0x2 | Binary Frame |
0x8 | Connection Close |
0x9 | Ping |
0xA | Pong |
3. 示例
文本消息传输
假设客户端要发送一条文本消息 “Hello, Server!“。
客户端构建数据帧:
- FIN = 1(最后一帧)
- Opcode = 1(文本框)
- Payload length = 15(”Hello, Server!” 的字符数)
数据框架结构如下:
FIN=1, Opcode=1, Payload length=15, "Hello, Server!" (经过 UTF-8 编码)
接收消息
服务器接收到数据后,也会以相同的方式回复,比如发送 “Hello, Client!“,其过程类似。
总结
通过 WebSocket 协议,客户端与服务器可以通过简单有效的方式实现实时双向通信。在实现过程中,需要注意对不同类型的数据进行正确解析,同时保持与 WebSocket 协议规范的一致性。
内容由零声教学AI助手提供,问题来源于学员提问