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: websocketConnection: 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: websocketConnection: 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

页面历史

撰写