基于本文回答

播面 播面

文图音视,全方位拆解八股文
0
评论

什么是 WebSocket?它和 HTTP 协议的区别?

知识点图片

这是一个非常经典的 Web 开发面试题,也是理解现代实时 Web 应用的关键。

以下是对 WebSocket 的详细解释,以及它与 HTTP 协议的深度对比。


一、 什么是 WebSocket?

WebSocket 是一种网络传输协议,位于 OSI 模型的应用层。它基于 TCP 协议,允许在单个 TCP 连接上进行全双工(Full-Duplex)通信

简单来说,WebSocket 使得客户端和服务器之间的数据交换变得更加简单高效。

核心特点:

  1. 全双工通信: 允许数据同时在两个方向上传输。服务器可以主动向客户端推送数据,客户端也可以随时向服务器发送数据。
  2. 持久连接: 一旦建立连接,除非一方主动断开,否则连接一直保持打开状态。
  3. 建立在 TCP 之上: 它依赖于 TCP 协议来传输数据。
  4. 握手机制: 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

  1. 客户端发起请求: 客户端发送一个标准的 HTTP GET 请求,但在 Header 里带上特殊的标记:

    plaintext
    GET /chat HTTP/1.1
    Host: server.example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
    • Upgrade: websocketConnection: Upgrade 告诉服务器:“我想把协议升级为 WebSocket”。
  2. 服务器响应: 如果服务器支持 WebSocket,它会返回状态码 101 (Switching Protocols)

    plaintext
    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
  3. 连接升级: 此时,HTTP 连接断开(或者说被接管),底层的 TCP 连接保持打开,双方开始使用 WebSocket 协议传输二进制帧或文本帧。


五、 总结:什么时候用哪个?

  • 使用 HTTP 的场景:

    • 获取静态资源(HTML, CSS, 图片)。
    • RESTful API 调用(查询数据、提交表单)。
    • 不需要实时更新的页面。
    • 原则: 绝大多数传统的 Web 交互依然依赖 HTTP。
  • 使用 WebSocket 的场景:

    • 即时通讯(IM): 微信网页版、Slack、聊天室。
    • 实时数据展示: 股票 K 线图、体育比分直播。
    • 多人协作工具: 腾讯文档、Figma(多人同时编辑)。
    • 在线游戏: 多人对战游戏。
    • 系统通知: 像知乎/B站右上角的“新消息”红点推送。
00:00
00:00