WebSocket 和 HTTP 长轮询有什么区别?

WebSocket 与 HTTP 长轮询的区别主要在于通信机制、性能及应用场景。WebSocket 提供全双工通信,而 HTTP 长轮询是半双工且每次请求。

网络协议 中等 WebSocket HTTP 长轮询

WebSocket 协议和 HTTP 长轮询是两种解决实时数据推送的技术, 主要区别在于通信模型、性能和实现机制。

  1. 通信模型差异
    • HTTP 长轮询:基于请求 - 响应模型(半双工)。客户端主动发起 HTTP 请求, 服务器等待直到有新数据或超时时返回响应, 随后客户端再次发起新请求。这导致服务器无法主动向客户端推送数据。
    • WebSocket:支持全双工通信(bilateral synchronous transmission)。一次握手建立持久连接后, 服务器和客户端均可主动发送数据, 实现实时双向交互, 不需反复重连。
  2. 建立连接方式
    • 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), 减少冗余传输。
  3. 性能开销和实时性
    • HTTP 长轮询:额外成本高 (每次 HTTP 头约几百字节), 可能因长时间保持连接占用服务器资源或触发网关超时 (504 错误)。延迟较高 (超时策略增加), 适用于低频更新场景, 但兼容性更好跨旧设备。
    • WebSocket:头部开销极小 (约 2 –6 字节), TCO开销低。提供毫秒级延迟, 高效处理高频交互如直播或聊天, 显著节省带宽。但实现需额外端支持, 虽现代浏览器均兼容。
  4. 适合场景小结
    • HTTP 长轮询:较简单部署, 兼容性广泛, 适合非实时高容忍延迟应用 (如基本 notification service)。
    • WebSocket:理想于实时性需求高的应用 (如多人协作平台或在线游戏), 通过最小化无数据处理优化响应效率。