什么是 WebSockets

WebSockets 是一种提供单一 TCP 连接上全双工、双向通信通道的通信协议。与遵循严格请求-响应模式的 HTTP 不同,WebSockets 允许客户端和服务器在建立连接后任意时刻自由发送消息。

WebSocket 协议由 URL 方案 `ws://`(未加密)和 `wss://`(加密,等同于 HTTPS)标识。它在端口 80 和 443 上工作,使其与包括代理和防火墙在内的现有网络基础设施兼容。

升级握手

WebSocket 连接以普通 HTTP 请求开始。客户端发送带有特殊头部的 HTTP 请求,请求服务器将连接升级为 WebSocket。此过程称为升级握手。

以下是初始 HTTP 升级请求的示例:

http
GET /chat HTTP/1.1
Host: example.com:8080
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Origin: http://example.com

服务器以 `101 Switching Protocols` 状态码响应,确认协议升级。完成握手后,底层的 TCP 连接保持打开,双方可以自由交换消息,而不需要重新建立连接。

要点头部需记住:

- `Upgrade: websocket` 与 `Connection: Upgrade` 表示切换协议的意图。 - `Sec-WebSocket-Key` 是服务器用于证明收到请求的随机生成的 base64 编码值。 - `Sec-WebSocket-Version: 13` 指定了协议版本。

HTTP 与 WebSocket:架构差异

HTTP 在一次请求—一次响应的循环中工作。每次交互都需要客户端发出新的请求,服务器在客户端未请求时不能主动推送数据。该模型简单但对于实时特性如聊天应用、实时通知或协作编辑等场景效率不高。

WebSockets 通过维持一个持久连接来解决。握手后,服务器可以在有新数据时主动推送给客户端,客户端也可以在不等待轮询的情况下发送消息。

下面是一个简单的通信流程对比:

http
HTTP (polling):
Client: GET /updates
Server: 200 OK (no new data)
Client: GET /updates (repeat every 2s)
Server: 200 OK (here is an update)
WebSocket:
Client: HTTP Upgrade request
Server: 101 Switching Protocols
Server: (pushes update when ready)
Client: (sends message when needed)
flowchart comparing HTTP polling cycle versus persistent WebSocket connection with bidirectional arrows

性能考量

WebSockets 的主要性能优势来自于消除了重复的连接开销。对于 HTTP 轮询,每次请求都携带完整的头信息(通常 500-800 字节),即使服务器没有新数据需要报告。WebSockets 在初始握手后仅发送少量帧头(大多数帧为 2-6 字节)。

这使得 WebSockets 在以下场景中显著更高效:

- 聊天应用,消息双向频繁流动。- 实时显示变化数据的仪表板。- 需要低延迟状态同步的多人在线游戏。- 多人协作工具,多个用户编辑共享内容。

然而,WebSockets 并不适用于所有场景。简单的一次性数据获取、静态内容传输和 REST API 调用更适合传统的 HTTP。

常见陷阱与误解

一个常见错误是认为 WebSockets 可以完全替代 HTTP。实际情况是,大多数现实世界的应用同时使用两者:HTTP 用于初始页面加载、认证和 REST API,而 WebSockets 只用于真正需要双向推送的实时通道。

另一个误解是 WebSockets 会自动提供安全性。像 HTTP 一样,您必须使用 `wss://`(TLS 加密)来保护传输中的数据。未加密的 `ws://` 连接与明文 HTTP 一样容易受到攻击。

最后,连接管理很重要。WebSocket 连接可能因网络中断、代理超时或服务器重启而断开。生产应用必须在客户端实现重新连接逻辑和心跳机制(ping/pong 帧)以检测死连接。

Summary

WebSockets 通过将初始 HTTP 连接升级为持久双向通道,从而实现实时的双向通信。升级握手使用特定头部信息,服务器以 `101 Switching Protocols` 响应。一旦建立,客户端和服务器可以独立发送数据,开销极小,因此 WebSockets 非常适合实时特性。请记住,WebSockets 是对 HTTP 的补充而非替代,生产实现需要适当的加密、重新连接处理和连接健康监控。

课程检查点

1. 服务器返回哪个 HTTP 状态码以确认 WebSocket 升级成功?

2. Sec-WebSocket-Key 头在初始升级请求中包含什么?

3. HTTP 和 WebSocket 通信之间的主要架构差异是什么?

4. 应使用哪种 URL 方案以确保 WebSocket 连接被加密?

5. 为什么 WebSocket 相比 HTTP 轮询在实时更新方面更高效?

6. 在什么场景下最适合使用 WebSocket?

7. 在部署 WebSocket 连接时必须处理的生产环境问题是什么?