进阶通信协议
WebSocket 实时双向通信
微信消息如何做到毫秒级实时推送
HTTP 是请求-响应模型,服务器无法主动推送——每次聊天消息都需要客户端轮询(polling),即便没有新消息也在浪费请求。WebSocket 通过 HTTP Upgrade 握手,将一条普通的 TCP 连接升级为全双工通道:服务器可以随时主动向客户端推送帧,客户端也可以随时发送,单个连接的开销仅有约 TCP 保活包的成本。微信 PC 端每个会话维持一条 WebSocket 长连接,后端推送服务通过 Redis Pub/Sub 在多台服务器间广播,确保接收方无论连接到哪台服务器都能收到消息。
WebSocket长连接实时推送Redis Pub/Sub心跳断线重连
STEP_1
握手后 HTTP 协议栈完全退出,该连接专属 WebSocket将 HTTP 连接升级为 WEBSOCKET — PROCESSING
upgrade.log
// 客户端发起 WebSocket 握手
GET /ws/chat?token=eyJ... HTTP/1.1
Host: ws.weixin.qq.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
// 服务器响应 101,连接升级成功
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
// 之后该 TCP 连接不再是 HTTP,进入 WS 帧协议HTTP Upgrade 握手:WebSocket 连接始于一个特殊的 HTTP GET 请求,携带 Upgrade: websocket 和 Connection: Upgrade 头,以及一个随机的 Sec-WebSocket-Key(Base64 编码的 16 字节随机数)。服务器响应 101 Switching Protocols,将 Sec-WebSocket-Key 与魔法字符串拼接后做 SHA1 哈希返回 Sec-WebSocket-Accept,客户端验证通过后 TCP 连接进入 WebSocket 协议模式,后续所有数据以帧(Frame)格式传输,彻底脱离 HTTP。
实时沙盒SANDBOX
CRITICAL
快速场景
手动调节
并发 WebSocket 连接数
每台服务器的长连接数量
10k 条
连接数合理,内存和文件���述符充裕
心跳间隔
Ping 帧发送频率(秒)
20 s
心跳间隔合理,保活与带宽开销平衡
模拟网络抖动
网络稳定,连接持续保活
WebSocket 服务器节点数
集群规模
5 台
单节点,无法横向扩展