什么是 WebSocket?它和 HTTP 协议的区别?
这是一个非常经典的 Web 开发面试题,也是理解现代实时 Web 应用的关键。
以下是对 WebSocket 的详细解释,以及它与 HTTP 协议的深度对比。
一、 什么是 WebSocket?
WebSocket 是一种网络传输协议,位于 OSI 模型的应用层。它基于 TCP 协议,允许在单个 TCP 连接上进行全双工(Full-Duplex)通信。
简单来说,WebSocket 使得客户端和服务器之间的数据交换变得更加简单高效。
核心特点:
- 全双工通信: 允许数据同时在两个方向上传输。服务器可以主动向客户端推送数据,客户端也可以随时向服务器发送数据。
- 持久连接: 一旦建立连接,除非一方主动断开,否则连接一直保持打开状态。
- 建立在 TCP 之上: 它依赖于 TCP 协议来传输数据。
- 握手机制: WebSocket 在建立连接时,会借用 HTTP 协议来完成一次“握手”(Handshake),握手成功后,协议升级为 WebSocket,随后的通信就不再使用 HTTP 了。
二、 为什么需要 WebSocket?(背景)
在 WebSocket 出现之前,Web 世界主要由 HTTP 主导。HTTP 有一个核心限制:它是无状态的、基于“请求-响应”模式的协议。
这意味着:服务器不能主动联系客户端。 只有客户端发起请求,服务器才能回复。
为了实现“实时消息”(如股票走势、聊天室),以前通常使用以下低效的方法:
- 轮询 (Polling): 客户端每隔几秒钟问一次服务器:“有新消息吗?”(浪费带宽,大部分时间是空的)。
- 长轮询 (Long Polling): 客户端发起请求,服务器一直挂起不回复,直到有新消息才回复。(虽然比轮询好,但仍然开销大,且维持连接消耗服务器资源)。
WebSocket 的出现就是为了解决这个问题,实现真正的低延迟、低开销的实时通信。
三、 WebSocket 与 HTTP 的区别
我们可以通过以下几个维度来对比:
| 特性 | HTTP (1.0/1.1) | WebSocket |
|---|---|---|
| 通信方式 | 半双工 / 单向主导 通常是“一问一答”。客户端请求 -> 服务器响应。 |
全双工 服务器和客户端可以同时互相发送数据,互不干扰。 |
| 主动性 | 被动 服务器必须等待客户端请求才能发送数据。 |
主动 服务器可以随时主动向客户端推送数据。 |
| 连接生命周期 | 短连接 (虽然有 Keep-Alive,但逻辑上仍是独立的请求对) | 长连接 连接建立后一直保持,直到显式关闭。 |
| 数据开销 (Header) | 大 每次请求都要携带完整的 HTTP 头(Cookie、User-Agent等),几百字节到几千字节。 |
极小 建立连接后,数据帧头部非常小(2-14字节),传输效率极高。 |
| 状态 | 无状态 (Stateless) 服务器不记得上一次请求是谁发的(需靠 Cookie/Session 维持)。 |
有状态 连接本身就代表了状态,服务器知道连接的是谁。 |
| 协议标识 | http:// 或 https:// |
ws:// (非加密) 或 wss:// (加密) |
形象的比喻:
HTTP 就像“发邮件”或“对讲机”:
- 你发一封信(Request),对方回一封信(Response)。
- 如果你不发信,对方有急事也联系不上你。
- 每次发信都要写信封、贴邮票(Header 开销大)。
WebSocket 就像“打电话”:
- 你拨通电话(握手),对方接听。
- 连接建立后,你们可以同时说话(全双工)。
- 只要不挂电话,线一直通着。
- 说话时不需要每次都自报家门(Header 开销小)。
四、 WebSocket 是如何建立连接的?(握手过程)
WebSocket 的连接建立过程非常有趣,它借用了 HTTP。
客户端发起请求: 客户端发送一个标准的 HTTP GET 请求,但在 Header 里带上特殊的标记:
plaintextGET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==Upgrade: websocket和Connection: Upgrade告诉服务器:“我想把协议升级为 WebSocket”。
服务器响应: 如果服务器支持 WebSocket,它会返回状态码 101 (Switching Protocols):
plaintextHTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=连接升级: 此时,HTTP 连接断开(或者说被接管),底层的 TCP 连接保持打开,双方开始使用 WebSocket 协议传输二进制帧或文本帧。
五、 总结:什么时候用哪个?
使用 HTTP 的场景:
- 获取静态资源(HTML, CSS, 图片)。
- RESTful API 调用(查询数据、提交表单)。
- 不需要实时更新的页面。
- 原则: 绝大多数传统的 Web 交互依然依赖 HTTP。
使用 WebSocket 的场景:
- 即时通讯(IM): 微信网页版、Slack、聊天室。
- 实时数据展示: 股票 K 线图、体育比分直播。
- 多人协作工具: 腾讯文档、Figma(多人同时编辑)。
- 在线游戏: 多人对战游戏。
- 系统通知: 像知乎/B站右上角的“新消息”红点推送。
右滑查看面试常问