WebSocket 和 HTTP 长轮询有什么区别?
WebSocket 与 HTTP 长轮询的区别主要在于通信机制、性能及应用场景。WebSocket 提供全双工通信,而 HTTP 长轮询是半双工且每次请求。
WebSocket 协议和 HTTP 长轮询是两种解决实时数据推送的技术, 主要区别在于通信模型、性能和实现机制。
- 通信模型差异
- HTTP 长轮询:基于请求 - 响应模型(半双工)。客户端主动发起 HTTP 请求, 服务器等待直到有新数据或超时时返回响应, 随后客户端再次发起新请求。这导致服务器无法主动向客户端推送数据。
- WebSocket:支持全双工通信(bilateral synchronous transmission)。一次握手建立持久连接后, 服务器和客户端均可主动发送数据, 实现实时双向交互, 不需反复重连。
- 建立连接方式
- HTTP 长轮询:每轮数据获取都需新建 TCP 连接和完整 HTTP 请求 (包括较大头部), 示例长轮询代码:
function longPolling(url) { fetch(url) .then(response => response.json()) .then(data => { console.log('Received data:', data); longPolling(url); // 继续新请求 }) .catch(error => console.error('Error:', error)); }
这导致频繁的开销。
- WebSocket:使用标准 HTTP 请求进行初始握手升级协议, 成功后建立单一持久化连接。采用较小控制头部 (协议标识 ws 或加密 wss), 减少冗余传输。
- HTTP 长轮询:每轮数据获取都需新建 TCP 连接和完整 HTTP 请求 (包括较大头部), 示例长轮询代码:
- 性能开销和实时性
- HTTP 长轮询:额外成本高 (每次 HTTP 头约几百字节), 可能因长时间保持连接占用服务器资源或触发网关超时 (504 错误)。延迟较高 (超时策略增加), 适用于低频更新场景, 但兼容性更好跨旧设备。
- WebSocket:头部开销极小 (约 2 –6 字节), TCO开销低。提供毫秒级延迟, 高效处理高频交互如直播或聊天, 显著节省带宽。但实现需额外端支持, 虽现代浏览器均兼容。
- 适合场景小结
- HTTP 长轮询:较简单部署, 兼容性广泛, 适合非实时高容忍延迟应用 (如基本 notification service)。
- WebSocket:理想于实时性需求高的应用 (如多人协作平台或在线游戏), 通过最小化无数据处理优化响应效率。