WebSocket 如何工作
在常见的 HTTP/1.1 流程中,客户端先发送包含 Upgrade: websocket 的 HTTP 请求。服务器返回 101 Switching Protocols,表示接受升级。
GET /stream HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
收到该响应后,任何一方都能以帧的形式发送文本或二进制消息,无需等待新请求。Ping 和 Pong 帧可用于检查对端是否仍然可达。
连接通常基于 TCP。ws:// URL 不加密,wss:// 则使用 SSL/TLS 保护连接,通常使用 443 端口。
WebSocket 的常见用途
WebSocket 适合需要频繁双向更新的应用:
- 实时聊天和通知流。
- 金融数据看板和动态市场数据。
- 需要交换玩家操作的多人游戏。
- 同步更改的协作编辑器。
普通网页或只需偶尔进行请求与响应交互的 API 通常不需要 WebSocket。
WebSocket 与 HTTP 对比
HTTP 连接可以复用,但每次常规交互仍由客户端发起。WebSocket 完成初始握手后会改变这种模式。
| WebSocket | HTTP 请求与响应 | |
|---|---|---|
| 连接 | 通常长时间保持 | 可供多次交互复用 |
| 消息方向 | 任何一方都可随时发送 | 通常由客户端发起 |
| 适用场景 | 频繁的实时更新 | 页面、文件和标准 API |
| 单条消息开销 | 建立连接后使用小型帧 | 请求头和响应头 |
通过代理使用 WebSocket
HTTP 代理服务器 可以传输 WebSocket 流量,但路径上的每个中间节点都必须支持这种连接:
- 安全连接: 显式代理通常对
wss://使用CONNECT,再通过隧道传输 TLS 和 WebSocket 握手。 - 升级处理: 反向代理必须正确转发升级请求,否则服务器可能始终不会返回
101。 - 认证: 代理凭据无效时,客户端可能会先收到 407 响应,WebSocket 连接因而无法到达目标服务器。
- 空闲超时: 连接长时间没有活动时,代理、防火墙和负载均衡器可能会将其关闭。
对于已经建立的 WebSocket 连接,轮换代理不会在消息传输期间更换出口 IP。通常只有建立新连接时才会轮换。应用要求客户端地址保持一致时,粘性会话 可让重新连接继续使用同一出口 IP。
常见问题
WebSocket 是基于 HTTP 的吗?
在常见的 HTTP/1.1 流程中,只有建立连接时使用 HTTP。收到 101 响应后,连接传输的是 WebSocket 帧,而不是普通的 HTTP 请求和响应。
WebSocket 能通过 HTTP 代理建立连接吗?
可以,前提是代理支持隧道或 WebSocket 升级,并允许长时间保持连接。代理认证、空闲超时或缺少升级请求头,都可能导致连接无法建立。
轮换代理会在 WebSocket 连接期间更换 IP 吗?
不会,只要同一连接保持打开,IP 就不会更换。通常需要关闭 WebSocket 并重新建立连接,才能使用新的出口 IP。