WebSocket
你可能会说
页面要一直实时更新,轮询太费,什么时候非上 WebSocket 不可?
一次握手之后,浏览器和服务器之间一直开着的双向通道用普通 HTTP 升级握手建连,之后两端随时互发消息,不用每次带完整请求头。适合聊天、协同编辑、实时行情、游戏。代价是连接得自己管:重连、心跳、鉴权、网关和负载均衡都要为长连接做适配。
也常被叫作WS长连接
什么时候选它
- 聊天、协同编辑、实时行情、多人游戏
- 客户端也要频繁上行,不只是收推送
- 延迟敏感,轮询的间隔和开销都受不了
什么时候别选
- 只是服务端单向推进度或通知(SSE 更省事)
- 一问一答的普通接口
- 网关、负载均衡不支持长连接,又不打算改
容易混在一起 · 怎么分
WebSocket≠HTTP 轮询
WebSocket 是一条持续的双向连接;轮询每次都是新请求,实时性和开销都差一截。
WebSocket≠SSE
WebSocket 双向;SSE 只能服务端往下推,但自带断线重连,走普通 HTTP。
WebSocket≠Socket.IO
WebSocket 是协议(RFC 6455);Socket.IO 是带降级和重连的封装库。
Q面试会问什么
- 问:握手是怎么完成的?
答:客户端发带 Upgrade: websocket 的 HTTP 请求,服务端回 101,用 Sec-WebSocket-Key 校验后切换到帧协议。 - 问:为什么需要心跳和重连?
答:中间代理会悄悄断开空闲连接,应用层感知不到;要定期 ping/pong 并做指数退避重连。 - 问:怎么做鉴权?
答:握手阶段带 token(cookie 或 query);连接建立后不能再改请求头。 - 问:多实例怎么广播?
答:连接散在各节点上,要用 Redis Pub/Sub 或消息队列把消息转发到所有节点。
延伸阅读 · 权威出处