WebSocket的底层原理
WebSocket是一种通信协议,它提供了在单个TCP连接上进行全双工通信的能力。WebSocket协议在客户端和服务器之间创建了一个持久连接,这使得数据可以双向传输。它的主要优点是降低了通信延迟,提高了通信效率。下面将详细介绍WebSocket的底层原理。
1. 协议概述
WebSocket协议被设计为一种独立的协议,但它的握手阶段借用了HTTP协议。WebSocket连接的建立过程如下:
- 握手阶段:客户端发起一个HTTP请求来建立连接,这个请求包含特定的WebSocket字段。
- 建立连接:服务器收到请求并通过返回特定的响应头来接受连接。
- 数据传输:连接建立后,客户端和服务器可以通过这个连接互相发送数据包,直到连接关闭。
2. 握手阶段
客户端请求
客户端通过发送一个HTTP请求来发起WebSocket连接。这个请求与普通的HTTP请求类似,但包含了一些额外的头信息,例如:
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
- Upgrade 和 Connection 头字段用于表示请求升级到WebSocket协议。
- Sec-WebSocket-Key 是一个Base64编码的值,用于安全校验。
- Sec-WebSocket-Version 指定WebSocket协议的版本。
服务器响应
服务器收到请求后,会验证请求头信息,并返回如下的响应以建立连接:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
- 101 Switching Protocols 状态码表示协议切换。
- Sec-WebSocket-Accept 是根据客户端的 Sec-WebSocket-Key 生成的一个值,用于校验连接的合法性。
3. 数据传输
数据帧格式
一旦连接建立,数据以帧(Frame)的形式传输。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 ... :
+---------------------------------------------------------------+
- FIN:1 bit,表示这是消息的最后一帧。
- RSV1, RSV2, RSV3:各1 bit,保留位,通常为0。
- Opcode:4 bit,表示数据帧类型(例如文本帧、二进制帧、关闭连接等)。
- Mask:1 bit,表示是否对负载数据进行掩码处理。
- Payload length:7 bit,表示负载数据长度(如果值为126或127,则使用后续字段扩展长度)。
- Masking-key:32 bit,如果Mask位为1,则包含掩码密钥,用于解码数据。
- Payload Data:实际传输的数据。
数据传输过程
- 客户端发送数据:客户端将数据封装成帧,添加掩码并发送给服务器。
- 服务器接收数据:服务器接收数据帧,解析掩码并提取实际数据。
- 服务器发送数据:服务器将数据封装成帧发送给客户端,通常不使用掩码。
- 客户端接收数据:客户端接收数据帧并提取数据。
4. 连接关闭
WebSocket连接可以由客户端或服务器发起关闭。关闭过程如下:
- 一方发送一个带有关闭帧(Opcode为0x8)的数据帧,包含关闭状态码和可选的关闭原因。
- 另一方收到关闭帧后,应发送一个关闭帧作为响应,然后关闭连接。
关闭帧的负载数据格式如下:
- 状态码:2字节整数,表示关闭原因。
- 关闭原因:可选的文本数据,解释关闭原因。
5. 总结
WebSocket通过建立在HTTP基础上的握手阶段,实现了客户端与服务器之间的持久连接。通过高效的帧格式,WebSocket能够在保持低延迟的同时,进行全双工通信。理解WebSocket的底层原理,有助于开发更高效和可靠的实时通信应用。