什么是 WebSocket?为什么有了 HTTP 还需要它
在日常浏览网页、点击按钮或提交表单时,我们主要依赖的是 HTTP 协议。然而,在面对在线聊天、股票行情实时刷新、协作文档或在线游戏等场景时,HTTP 的局限性便显露无疑。这些场景要求服务器能够将内容和状态持续、即时地推送到客户端,而这正是 WebSocket 协议大显身手的地方。
``为什么有了 HTTP 还需要 WebSocket?
问题的核心在于:服务器能否主动给客户端发消息?
HTTP 的通信模式与局限
普通的 HTTP 通信遵循“客户端请求,服务器响应”的模式。如果客户端不发起请求,服务器通常不会主动发送数据。为了获取最新数据,开发者通常采用以下两种方案,但都存在明显缺陷:
-
短轮询(Short Polling)
- 机制:浏览器每隔几秒向服务器询问一次:“有新消息吗?”
- 缺点:
- 资源浪费:大部分请求返回的都是“没有新消息”,对服务器和网络造成巨大负担。
- 实时性差:消息到达存在延迟,取决于轮询间隔。
-
长轮询(Long Polling)
- 机制:客户端发起请求,若服务器无新消息,则保持连接等待,直到有消息才返回。返回后客户端立即发起下一次请求。
- 缺点:
- 虽然减少了空请求,但本质上仍是 HTTP 请求-响应模型。
- 每次响应结束后连接断开,下一轮需重新建立连接,管理复杂且开销依然存在。
WebSocket 的核心优势
WebSocket 旨在解决上述问题,其核心机制如下:
- 长连接保持:建立连接后,通道持续在线。
- 双向实时通信:只要连接存在,客户端和服务器都可以随时向对方发送消息。
- 低开销:避免了频繁建立和断开连接的开销。

简而言之,HTTP 是“客户端问,服务器答”,而 WebSocket 是“双方随时可以说话”。

WebSocket 是如何工作的?
WebSocket 并非一开始就使用独立协议,而是通过 HTTP 协议进行“握手”升级。
- 发起握手:浏览器发送一个特殊的 HTTP 请求,头部包含
Upgrade: websocket等字段,表示希望将连接升级为 WebSocket。 - 协议切换:如果服务器支持,会返回状态码 101 Switching Protocols。
- 建立通道:从这一刻起,该连接不再遵循 HTTP 请求-响应模式,而是进入 WebSocket 通信模式,形成一条持续在线的双向通道。

WebSocket 的典型应用场景
- 在线聊天
- 要求消息即时送达。WebSocket 允许服务器在收到新消息后直接推送给在线用户,避免轮询带来的延迟和无效请求。
- 实时通知
- 如系统告警、订单状态变更、审核结果、站内信等。服务端状态变化时可立即推送到前端,无需前端不断刷新。
- 实时数据看板
- 适用于股票行情、加密货币价格、服务器监控、物流轨迹、比赛比分等高频变化的数据场景。
- 在线协作
- 如多人文档编辑、在线白板、协同设计工具。WebSocket 用于同步操作事件,确保一人修改,其他人尽快看到变化。
- 游戏与互动应用
- 在线游戏、直播弹幕、互动答题等需要低延迟双向通信的场景,WebSocket 能显著减少频繁建联的开销。
实际开发中的组合策略
在实际项目中,HTTP 和 WebSocket 通常是配合使用的,而非互相替代:
- HTTP:用于用户登录、获取历史消息、加载初始页面数据等普通请求-响应场景。
- WebSocket:用于用户在线后,接收新消息、同步实时状态变化等持续双向通信场景。

WebSocket 的缺点与挑战
尽管 WebSocket 优势明显,但在实际应用中也面临以下挑战:
- 连接管理复杂
- HTTP 请求结束后资源即释放,而 WebSocket 是长连接。服务器需维护连接状态,处理断线、重连、心跳检测、超时等问题。
- 服务端压力大
- 若同时有十万甚至百万用户在线,服务器需维护大量连接状态。这对架构设计、负载均衡、网关配置、内存管理及最大连接数都有较高要求。
- 网络不稳定性
- 移动网络切换、弱网环境或浏览器后台挂起都可能导致连接断开。前端需实现自动重连机制,服务端也需处理用户重新上线后的状态同步。
- 消息可靠性需自行设计
- WebSocket 提供的是双向通信通道,但业务层面的消息是否送达、是否重复、是否按序处理,往往需要开发者自行设计确认机制、消息 ID、重试及去重逻辑。
总结
WebSocket 是一种支持浏览器与服务器之间长连接、双向实时通信的协议。它通过握手升级 HTTP 连接,解决了服务器无法主动推送数据的问题,特别适用于聊天、实时通知、行情推送、在线协作及游戏互动等对实时性要求高的场景。
需要注意的是,WebSocket 不是 HTTP 的替代品。HTTP 擅长处理普通的请求-响应,而 WebSocket 擅长持续的双向通信。在实际项目中,两者结合使用才是最佳实践。