标签
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, superchatUpgrade: 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: chatHTTP/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 连接的建立。
总结流程
- 客户端发起一个特殊的 HTTP GET 请求,请求“升级”协议。
- 服务器响应
101状态码,同意升级。 - 双方完成基于 HTTP 的握手,底层的 TCP 连接转而用于 WebSocket 协议的通信。
- 客户端和服务器在该连接上进行全双工、持久化的数据传输。