在早期的 Web 端聊天应用中,由于无法直接使用 UDP、TCP 通讯协议,HTTP 协议成为了一种单向请求响应模式的通信方式。然而,对于实现即时通信系统而言,该方式存在难以获取最新聊天信息的问题,因为用户不知道新消息何时到达,服务端也无法主动通知用户。
为了解决这个实时性问题,短轮询技术被广泛采用。该技术下,客户端定时向服务端发送请求以检测是否有新消息。如果有新消息产生,服务器将消息推回给客户端。虽然短轮询技术简单易行,但是其需要高频率地发起请求才能提高实时性,导致多数请求是无效的,增加了服务端的性能负载和系统资源的浪费。因此,长轮询技术应运而生。与短轮询技术相比,长轮询技术可以将连接挂起一段时间,在此期间若有新消息产生,立即返回给客户端。虽然长轮询技术可以降低服务端负载、提高实时性,但在长轮询结束后的窗口期仍然存在实时性盲区。
HTTP 协议本身是一个设计目的是简化传统 TCP 长连接通信的短连接协议,因此无法从根本上解决即时通信系统的实时性问题。直到 HTML 5 提供了 WebSocket 协议,Web 端才出现了真正意义上的双向即时通信。WebSocket 协议提供了原生的全双工跨域通讯方式,真正实现了双向实时通信。这样可以减少轮询技术中高频率无效请求,降低网络负载和服务端的 QPS 压力,并且每次连接可以随时使用,不必再发起 HTTP 请求,减少了冗余协议头信息的携带。