Skip to content
标签
note
字数
805 字
阅读时间
4 分钟

概述 ​

WebSocket 是一种在单个 TCP 连接上进行全双工通信的应用层协议。

它旨在弥补 HTTP 协议在持久化、双向通信能力上的不足。传统的 HTTP 轮询或长轮询方式会带来不必要的开销和延迟,而 WebSocket 建立连接后,客户端和服务器可以随时、主动地向对方发送数据。

协议原理:一次“升级”的握手 ​

WebSocket 的连接建立过程非常巧妙,它“伪装”成一次 HTTP 请求,通过一个“升级(Upgrade)”握手来从 HTTP 协议切换到 WebSocket 协议。

1. 客户端发起握手请求 ​

客户端首先发起一个特殊的 HTTP GET 请求,其中包含了几个关键的头部字段:

http
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
  • Upgrade: websocket 和 Connection: Upgrade: 这两个头部是协议升级的核心,明确告知服务器:“我希望将这个 HTTP 连接升级到 WebSocket 协议。”
  • Sec-WebSocket-Key: 一个由客户端随机生成的、经过 Base64 编码的字符串。用于服务器验证和防止缓存代理的干扰。
  • Sec-WebSocket-Version: 指定了客户端期望使用的 WebSocket 协议版本(目前广泛使用的是版本 13)。
  • Sec-WebSocket-Protocol (可选): 指定客户端支持的子协议,允许在同一 WebSocket 连接上实现不同的应用逻辑。

2. 服务器响应握手 ​

如果服务器支持 WebSocket,它会返回一个状态码为 101 Switching Protocols 的 HTTP 响应,表示同意协议转换。

http
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat
  • HTTP/1.1 101 Switching Protocols: 明确表示服务器已同意切换协议。
  • Upgrade: websocket 和 Connection: Upgrade: 确认升级到 WebSocket 协议。
  • Sec-WebSocket-Accept: 这是对客户端 Sec-WebSocket-Key 的响应。服务器会将客户端的 Sec-WebSocket-Key 与一个固定的“魔术字符串”(258EAFA5-E914-47DA-95CA-C5AB0DC85B11)拼接,然后计算 SHA-1 哈希,最后进行 Base64 编码得到这个值。客户端会验证这个值以确认服务器确实支持 WebSocket。

3. 连接建立,双向通信 ​

一旦握手完成,这条底层的 TCP 连接就从 HTTP 协议“切换”到了 WebSocket 协议。此后,双方的数据传输不再遵循 HTTP 的请求-响应模式,而是可以随时双向发送数据帧 (Data Frame)。

HTTP 在这个过程中的角色到此结束,它仅仅是“引导”了 WebSocket 连接的建立。

总结流程 ​

  1. 客户端发起一个特殊的 HTTP GET 请求,请求“升级”协议。
  2. 服务器响应 101 状态码,同意升级。
  3. 双方完成基于 HTTP 的握手,底层的 TCP 连接转而用于 WebSocket 协议的通信。
  4. 客户端和服务器在该连接上进行全双工、持久化的数据传输。

参考 ​

贡献者

The avatar of contributor named as jiechen jiechen

页面历史

用 ♥ 撰写