websocket是真正的实时双向通信协议,支持服务端主动推送任意结构化数据;http/2 server push仅为静态资源预加载机制,单向、被动、已遭主流浏览器弃用。

WebSocket 和 HTTP/2 Server Push 看似都支持“服务端推送”,但本质完全不同:前者是真正的实时双向通信通道,后者只是资源预加载机制,且已在主流浏览器中被弃用。
核心定位完全不同
HTTP/2 Server Push 的设计目标是优化页面首次加载——比如用户请求 /index.html,服务器顺带把 /style.css 和 /app.js 推过去,省掉后续请求的 RTT。它不处理业务逻辑,也不允许你推送 JSON 消息或聊天内容。
WebSocket 则是为实时交互而生:连接建立后,服务端可随时调用 socket.send() 发送任意结构化数据(如 {"type":"message","content":"hi"}),客户端立刻收到,无需任何前置请求。
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
通信能力有根本差异
- Server Push 是单向、被动、一次性的:仅在客户端发起某个 HTTP 请求后触发,且只能推与该请求语义相关的静态资源(如图片、脚本)
- WebSocket 是全双工、主动、持续的:连接存活期间,双方可随时发消息;服务端能按业务规则(如新订单生成、用户上线)精准触发推送
- Server Push 不经过应用层:浏览器自动接收并缓存,JavaScript 无法监听或控制;WebSocket 的每条消息都由前端代码明确处理
实际可用性已严重受限
截至 2026 年中,Chrome 96+ 和 Firefox 90+ 默认禁用 Server Push,Nginx 1.21+ 移除了 http_v2_push 指令。即使配置了,浏览器也可能直接拒绝(例如资源已缓存时返回 RST_STREAM),或因带宽浪费被策略拦截。
而 WebSocket 已被所有现代浏览器原生支持,协议稳定,连接可控(有 onopen、onmessage、onclose 等标准事件),运维和调试工具链成熟(如 ws 握手状态、帧级监控)。
开发体验与运维成本对比
- Server Push 需配合 HTTP/2 部署,但多标签页可能共享同一连接,你无法区分某次推送对应哪个页面上下文
- WebSocket 连接独立、可标识:可通过 URL 参数(如
ws://host/ws?uid=123)绑定用户会话,服务端轻松做连接管理与广播控制 - 想用 Server Push 发业务消息?Node.js 的
res.push()只接受文件流或 buffer,传 JSON 字符串会报错或静默失败










