中 进阶
WebSocket原理#
一句话答案#
WebSocket 基于 HTTP 升级握手后保持全双工长连接,服务端可主动推送,适合聊天/实时通知/行情推送。
核心要点
握手: HTTP 请求头 Upgrade: websocket → 服务端 101 Switching Protocols
vs HTTP: 全双工(服务端可主动推) / 长连接 / 开销小(无HTTP头重复)
适用: 聊天/实时通知/协同编辑/行情推送
面试回答(2分钟版)
WebSocket是一种在单个TCP连接上实现全双工通信的协议,解决了HTTP只能客户端发起请求的限制,让服务端可以主动向客户端推送数据。建立过程是先通过HTTP发起一次握手,请求头带上Upgrade: websocket,服务端返回101 Switching Protocols后就完成了协议升级,之后双方就在这条TCP连接上用WebSocket帧格式双向通信。相比HTTP轮询,WebSocket的优势很明显:全双工所以服务端可以主动推送,不需要客户端反复发请求;长连接复用所以没有反复建连的开销;数据帧头很小没有HTTP那些重复的头信息。典型的应用场景包括即时聊天、实时通知、协同编辑、股票行情推送等需要实时性的场景。不过对于只需要服务端单向推送的简单场景,SSE(Server-Sent Events)更轻量,基于HTTP就能实现,不需要额外的协议升级。实际使用中还需要考虑断线重连和心跳保活机制。
追问与易错
追问方向:
- “WebSocket 和 HTTP 长轮询区别?”→ 长轮询是客户端反复发 HTTP 请求等响应(半双工、开销大),WebSocket 是一次握手后全双工通信(帧头小、服务端主动推送)
- “WebSocket 断线重连怎么做?”→ 客户端监听 onclose 事件后指数退避重连 + 应用层心跳检测(ping/pong 帧)+ 重连后用 lastEventId 恢复消息
- “WebSocket 和 SSE 怎么选?”→ SSE 基于 HTTP 单向推送(服务端→客户端),轻量易用自动重连;WebSocket 全双工适合需要双向通信的场景(聊天/游戏)
易错点:
- ❌ WebSocket 就是 HTTP——独立协议只是借 HTTP 握手
- ❌ WebSocket 适合所有实时场景——简单的用 SSE 更轻量