WebSocket vs SSE:实时通信技术的对比与选择_websocket与sse-CSDN博客 一、WebSocket概述 🌐 (一)WebSocket的工作原理 🔧 WebSocket 是一种全双工通信协议 🔄 可以在客户端和服务器之间建立持久连接。一旦连接建立,双方就可以在不需要再次握手的情况下,实时双向发送数据。 WebSocket是基于TCP/IP的, 基于可靠性传输协议。 处于OSI七层协议中的应用层。 没有同源限制,客户端可以与任意服务器通信。 可以发送文本,也可以发送二进制数据。 握手阶段采用 HTTP 协议,然后进行 upgrade 升级成 websocket 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。 1.优点:

  • 双向通信 🔄:客户端和服务器可以同时发送和接收消息,实时互动更加灵活。
  • 持久连接 🔗:一次握手建立连接后,可以维持长时间的连接,减少了频繁建立连接的开销。
  • 低延迟 ⚡:适合高频率的实时数据交换,延迟较低。 2.缺点: 协议复杂性 🧩:相较于HTTP,WebSocket协议较为复杂,需要更多的实现细节来管理连接和数据交换。 浏览器支持 🌐:虽然大部分现代浏览器都支持WebSocket,但仍有部分旧版浏览器不兼容。 通过在请求头中增加 upgrade:websocket 及通信密钥(Sec-WebSocket-Key),使双方握手成功,建立全双工通信。 二、SSE概述 📡 (一)SSE的工作原理 🔧
  • Server-Sent Events (SSE) 是一种单向通信协议 🔀,
  • 允许服务器向客户端实时推送数据。
  • 与WebSocket不同,SSE是完全基于HTTP协议的,处于OSI七层协议中的应用层。 响应头的类型是content-type: text/event-stream,表示这个响应是文本流输出,然后响应体每次都以data: 开头,后面携带的是一个json数据,最后以data: [DONE]作为结束标志。 SSE 的工作原理非常简单直观。客户端通过与服务器建立一条持久化的 HTTP 连接,然后服务器使用该连接将数据以事件流(event stream)的形式发送给客户端。这些事件流由多个事件(event)组成,每个事件包含一个标识符、类型和数据字段。客户端通过监听事件流来获取最新的数据,并在接收到事件后进行处理。 与 WebSocket 技术相比,SSE 使用的是基于 HTTP 的长轮询机制,而不需要建立全双工的网络连接。这使得 SSE 更容易在现有的基础设施上部署,无需特殊的代理或中间件支持。 1.优点: 简单易用 🍰:完全基于HTTP协议,实现和使用都相对简单。 自动重连 🔄:如果连接断开,SSE会自动尝试重新连接。 原生支持 🌈:现代浏览器原生支持SSE,无需额外库。 轻量级 🪶:相比WebSocket,SSE更加轻量,适合单向数据流场景。 2.缺点: 单向通信 👉:只能服务器向客户端推送数据,不支持客户端向服务器发送数据。 连接数限制 🚫:浏览器对同一个域名的SSE连接数有限制。 数据格式限制 📄:只能发送文本数据,二进制数据需要编码后传输。 三、为什么 大模型 选择 SSE? 🎯 简单的文本推送需求 SSE 更加轻量, SSE 不需要维护WS连接状态,服务器资源消耗更少 内存占用更少,因为不需要维护完整的 TCP 连接状态 SSE 拥有自动重连机制,更可靠 兼容性:由于SSE基于HTTP协议,因此它可以在大多数现代浏览器中使用,并且无需进行额外的协议升级。虽然WebSocket在绝大多数现代浏览器中也得到了支持,但在某些特定的网络环境下可能会遇到问题。 服务端:底层消息通道改动少、不用考虑流式消息时序、重排去重等管理机制,可能会影响服务的吞吐量,复杂度和工作量上考虑

补充

补充:WebSocket 与 SSE 都是「服务器主动推」方案,前者是全双工 TCP 协议,后者是单向基于 HTTP 的流式响应。

对比要点:

  • 方向:WebSocket 双向;SSE 单向(只能服务器向客户端推)。
  • 协议:WebSocket 基于 TCP 自定义帧;SSE 完全基于 HTTP,部署简单,能直接用 Nginx/CDN。
  • 自动重连:WebSocket 需手动实现;SSE 浏览器原生支持。
  • 数据格式:WebSocket 支持文本和二进制;SSE 只能发送 UTF-8 文本。
  • 连接数:WebSocket 单个浏览器对单域名有限制(与浏览器实现相关);SSE 同源连接数也有限制(HTTP/1.1 6 个)。
  • 大模型场景选择 SSE 的原因:单向流式输出、轻量、自动重连、HTTP 友好、CDN 友好、服务器无需维护连接状态。

补充:如果需要客户端也能向服务器发消息(如协同编辑),WebSocket 更合适;如果只是「服务端持续推送结果」(如 ChatGPT 流式输出),SSE 足够。