6月1日 02:15

WebSocket 和 HTTP 轮询、长轮询有什么区别?各自适用什么场景?

HTTP轮询是客户端按固定间隔向服务器发请求,无论有无数据都返回响应。实现最简单,但大部分请求是无效的,浪费带宽和服务器资源,延迟取决于轮询间隔。HTTP长轮询是客户端发请求后服务器不立即返回,而是挂起连接直到有新数据或超时才响应,客户端收到后再发下一个请求。实时性明显好于普通轮询,但每次数据推送都需要重新建立连接,且服务器需要维护大量挂起请求。WebSocket通过一次HTTP握手升级为持久连接,建立后双方可以随时主动发数据,是真正的全双工通信。帧头仅2-10字节,开销远低于HTTP每次请求携带的完整头部。三种方式中,WebSocket实时性最好、开销最低,但需要服务器和客户端同时支持;轮询兼容性最强但效率最差;长轮询是两者之间的折中。

追问

性能对比

维度轮询长轮询WebSocket
实时性差(依赖间隔)较好
服务器负载高(大量无效请求)
带宽消耗
实现复杂度
浏览器兼容性最好好(IE10+)

各自适用什么场景?

轮询适合对实时性要求不高的场景,比如配置中心定期拉取最新配置。长轮询适合无需双向通信但需要服务端及时推送的场景,比如消息通知、扫码登录状态检查。WebSocket适合高频双向通信场景,比如即时聊天、协同编辑、实时行情推送、在线游戏。

WebSocket连接如何建立?

客户端发一个特殊的HTTP请求,携带Upgrade: websocket头:

http
GET /ws HTTP/1.1 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13

服务器返回101状态码表示协议切换成功:

http
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

之后TCP连接保持,双方通过WebSocket帧格式通信,不再走HTTP协议。

长轮询和WebSocket在断线处理上有什么区别?

长轮询本身是"请求-响应"模式,断线后客户端只需重新发请求即可,天然具备重连能力,但重连期间会丢失消息,需要服务端做消息缓存。WebSocket断线后需要客户端主动重连并重新握手,通常配合心跳检测(ping/pong帧)判断连接存活,重连后还需处理会话恢复和消息补发逻辑。

标签:WebSocket