在讲解具体协议前,先明确两个基础认知,理解两类技术的诞生逻辑与适配边界:

AI 场景的两类核心实时需求
AI 产品的实时通信需求本质分为两类,对应完全不同的技术路线:
长连接通信的两条技术路线
实现长连接通信有两条完全不同的技术路径,也是 SSE 与 WebSocket 的本质分界:
SSE(Server-Sent Events,服务端事件)是基于标准 HTTP 协议的单向长连接推送技术。客户端发起一次普通 HTTP 请求后,服务器保持响应连接不关闭,持续向客户端推送结构化的文本事件数据,是专门为服务端到客户端的单向数据流设计的通信方案。
SSE 完全运行在 HTTP 协议之上,核心机制分为三点:
text/event-stream类型的响应;服务端返回对应 Content-Type,保持响应体持续写入,不结束请求Last-Event-ID请求头告知服务端最后接收的消息 ID,实现断点续传标准事件格式仅包含 4 个字段,极简且通用:
| 字段 | 作用 | 示例 |
|---|---|---|
data: | 事件数据主体(必填) | data: {"token": "你好"} |
event: | 自定义事件类型名 | event: message |
id: | 事件唯一标识,用于断点续传 | id: 1024 |
retry: | 客户端自动重连的间隔时间(毫秒) | retry: 3000 |
一次标准 SSE 请求与响应的报文结构如下:
# 客户端请求GET /llm/stream HTTP/1.1Accept: text/event-stream# 服务端响应HTTP/1.1 200 OKContent-Type: text/event-streamCache-Control: no-cacheConnection: keep-alivedata: {"token": "你"}nndata: {"token": "好"}nndata: {"token": ","}nn
WebSocket 是一种独立的全双工应用层通信协议。它通过一次 HTTP 握手完成协议升级后,建立持久化的 TCP 连接,客户端与服务端可以在连接上双向、自由地传输文本或二进制数据,帧级传输开销极低。
WebSocket 的核心是「协议升级」与「帧传输」:
Upgrade: websocket头的 HTTP 请求,服务端返回101 Switching Protocols响应,完成协议切换,此后脱离 HTTP 协议WebSocket 握手阶段的报文结构如下:
# 客户端握手请求GET /ws/chat HTTP/1.1Host: api.example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==# 服务端握手响应HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
握手完成后,后续数据均以 WebSocket 二进制帧传输,不再有 HTTP 报文格式。
当前 OpenAI、Claude、Gemini、通义千问等所有主流 LLM 厂商的流式输出,均默认采用 SSE 协议,核心有五点原因:
当产品出现明确的双向实时交互需求时,WebSocket 不可替代,典型场景包括:
| 场景 | 核心诉求 | 代表产品 |
|---|---|---|
| 用户打断生成 | 低延迟发送停止指令,中断模型生成 | 高级对话机器人 |
| 实时语音对话 | 音频流双向传输,端到端延迟 < 500ms | OpenAI Realtime API |
| 多模态实时交互 | 同时传输音频、视频、文本流 | Gemini Live API |
| 协同编辑 / 创作 | 高频双向状态同步 | 在线协作文档 AI 功能 |
| Agent 实时控制 | 工具调用状态、执行进度实时回传 | 智能体工作流 |
成熟的 AI 产品最终都会走向分层混合架构,而非单一协议,标准的「三通道架构」分工如下:
plaintext
┌─────────────────────────────────────────────────────┐│API 网关 ││ (协议识别 / 流量路由 / 认证鉴权) │└─────────────┬──────────────┬────────────────────────┘││┌─────────▼──────┐ ┌────▼──────────┐┌──────────┐│SSE 流式通道 │ │ WebSocket ││ HTTP ││Token 逐字推送 │ │控制通道││ 降级通道││高频单向文本 │ │ 打断/状态/控制 ││ 防火墙兜底│└─────────────────┘ └───────────────┘└──────────┘
禁止将流式数据与控制消息放在同一 WebSocket 连接上。大流量的 Token 数据会造成 TCP 队头阻塞,导致关键控制指令延迟飙升,实际生产中曾出现控制消息延迟从 50ms 升至 2s 以上的案例。将流式数据与控制指令分通道传输,是混合架构的核心设计准则。
无需一开始就搭建完整混合架构,可按业务阶段逐步升级:
| 对比维度 | SSE | WebSocket |
|---|---|---|
| 传输方向 | 单向(服务端→客户端) | 全双工(双向自由传输) |
| 协议基础 | 标准 HTTP 协议,无需升级 | HTTP 101 协议升级,独立协议 |
| 自动重连 | ✅ 浏览器原生支持,零代码 | ❌ 需手动实现重连状态机 |
| 消息续传 | ✅ 原生 Last-Event-ID 机制 | ❌ 需自定义实现 |
| 二进制支持 | ❌ 仅文本,需 Base64 编码(+33% 开销) | ✅ 原生支持二进制 |
| 连接建立耗时 | 1 RTT | 2 RTT |
| 单消息延迟 | 5-10ms | 1-3ms |
| 单连接内存占用 | 2-5 KiB | 10-50+ KiB |
| 防火墙穿透性 | ✅ 标准 HTTP 端口,几乎无拦截 | ⚠️ 5%-10% 企业环境会被拦截 |
| CDN / 袋里支持 | ✅ 原生支持,关闭缓冲即可 | ❌ 需特殊配置,部分 CDN 不支持 |
| 调试难度 | 低,curl、浏览器控制台可直接查看 | 高,需专用工具解码帧 |
| 工程实现复杂度 | 低,标准 HTTP 响应逻辑 | 中高,需管理连接、心跳、重连 |
误区一:WebSocket 性能更好,应该优先选用
纠正:WebSocket 仅在传输层延迟上有微弱优势,在 LLM 流式输出场景中,推理耗时是绝对瓶颈,传输差异可忽略。而 SSE 在工程复杂度、兼容性、运维成本上有显著优势,单向场景下 SSE 才是更优解。
误区二:SSE 是简化版的 WebSocket,能力更弱
纠正:两者是定位不同的平行技术,而非进阶关系。SSE 原生具备的自动重连、断点续传、HTTP 生态全兼容等特性,是 WebSocket 不具备的。在单向推送场景下,SSE 是更专业、更完善的方案,而非简化版。
误区三:做 AI 产品就必须上混合架构
纠正:混合架构是应对复杂双向需求的演进方案,不是起步标配。绝大多数对话类产品在 MVP 和增长阶段,纯 SSE 完全可以满足需求。提前引入 WebSocket 只会徒增开发和运维成本,违背技术选型的极简原则。
误区四:SSE 只能传文本,完全无法支持多模态
纠正:SSE 可以通过 Base64 编码传输二进制数据,只是会增加约 33% 的传输开销。对于低频、小体积的多模态内容,SSE 完全可以承载;只有高频、大流量的二进制实时传输场景,才需要切换为 WebSocket。
误区五:WebSocket 连接数承载能力远不如 SSE
纠正:单连接内存占用 WebSocket 确实更高,但在合理的资源配置下,两者都能支撑万级以上并发。真正的瓶颈往往是业务逻辑与数据库性能,而非协议本身的连接承载能力。
遵循「极简优先,按需升级」的原则,按以下路径判断:
| 常见陷阱 | 后果 | 解决方案 |
|---|---|---|
| Nginx / 袋里默认开启缓冲 | 数据被批量缓存,用户看到整段一次性返回 | Nginx 配置proxy_buffering off;,响应头加X-Accel-Buffering: no |
| 长连接被袋里超时切断 | 连接意外中断,重连频繁 | 每 25-55 秒发送一次注释心跳:: keepalivenn |
| 原生 EventSource 不支持自定义请求头 | 无法携带 Authorization 等认证头 | 使用@microsoft/fetch-event-source等库,或通过 URL 参数传递 Token |
| 未过滤输入中的换行符 | 恶意内容注入额外事件字段,造成解析异常 | 严格过滤数据中的r、n字符,规范事件格式 |
| 常见陷阱 | 后果 | 解决方案 |
|---|---|---|
| 无空闲超时与僵尸连接清理 | 连接资源不释放,内存持续泄漏 | 设置空闲超时阈值,配合心跳检测定期清理无效连接 |
| 无完善的重连机制 | 网络抖动后服务中断,用户体验差 | 实现指数退避 + 随机抖动的重连逻辑,设置最大重试次数 |
| 大帧阻塞小消息 | 大数据帧占用通道,控制消息排队延迟 | 大消息分片传输,应用层实现优先级队列 |
| 缺少 Origin 校验 | 存在跨站 WebSocket 劫持风险 | 强制校验 Origin 头,首条消息完成身份认证 |
| 监控指标 | 告警阈值 | 说明 |
|---|---|---|
| 单机并发连接数 | 超过容量的 80% | 提前触发扩容 |
| 消息端到端延迟 p99 | >100ms | 排查后端处理或网络瓶颈 |
| 单连接重连频率 | >5 次 / 分钟 | 网络不稳定或服务端异常 |
| 单连接内存占用 | 超过基线 20% | 存在内存泄漏风险 |
| WebSocket 异常关闭码 1006 占比 | >10% | 网络连接质量差 |
默认优先选择 SSE,除非明确存在双向实时通信需求;WebSocket 是补充能力而非替代方案;成熟产品最终走向「SSE 流式 + WebSocket 控制 + HTTP 降级」的三通道混合架构。工程复杂度对项目成败的影响,远大于协议本身的性能差异,从简单开始,按需演进,是 AI 场景下技术选型的最佳准则。