Bootstrap

WebSocket的底层原理

WebSocket的底层原理

WebSocket是一种通信协议,它提供了在单个TCP连接上进行全双工通信的能力。WebSocket协议在客户端和服务器之间创建了一个持久连接,这使得数据可以双向传输。它的主要优点是降低了通信延迟,提高了通信效率。下面将详细介绍WebSocket的底层原理。

1. 协议概述

WebSocket协议被设计为一种独立的协议,但它的握手阶段借用了HTTP协议。WebSocket连接的建立过程如下:

  1. 握手阶段:客户端发起一个HTTP请求来建立连接,这个请求包含特定的WebSocket字段。
  2. 建立连接:服务器收到请求并通过返回特定的响应头来接受连接。
  3. 数据传输:连接建立后,客户端和服务器可以通过这个连接互相发送数据包,直到连接关闭。

2. 握手阶段

客户端请求

客户端通过发送一个HTTP请求来发起WebSocket连接。这个请求与普通的HTTP请求类似,但包含了一些额外的头信息,例如:

GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
  • UpgradeConnection 头字段用于表示请求升级到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连接可以由客户端或服务器发起关闭。关闭过程如下:

  1. 一方发送一个带有关闭帧(Opcode为0x8)的数据帧,包含关闭状态码和可选的关闭原因。
  2. 另一方收到关闭帧后,应发送一个关闭帧作为响应,然后关闭连接。

关闭帧的负载数据格式如下:

  • 状态码:2字节整数,表示关闭原因。
  • 关闭原因:可选的文本数据,解释关闭原因。

5. 总结

WebSocket通过建立在HTTP基础上的握手阶段,实现了客户端与服务器之间的持久连接。通过高效的帧格式,WebSocket能够在保持低延迟的同时,进行全双工通信。理解WebSocket的底层原理,有助于开发更高效和可靠的实时通信应用。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;