引言
最近比较流行的 AI 对话聊天软件基本都是使用 SSE 来实现的,原因在于 SSE 可以实时地将服务器端的计算结果推送给客户端。用户输入问题后,服务器端就会实时地以流式的方式返回计算结果。
什么是 SSE
SSE(Server-Sent Events)是一种基于 HTTP 协议的服务器推送技术,它允许服务器向客户端推送实时数据,而不需要客户端主动发起请求。
我们都知道 HTTP/2 协议支持服务器主动推送数据,那么 SSE 是基于 HTTP/2 实现的吗?答案是否定的,SSE 是 RFC6454 定义的标准,完全基于 HTTP/1.1 的持久连接。
服务器只要保持连接不关闭,并按 SSE 事件格式 (event:.\ndata:..\n\n) 写入数据即可,浏览器会把这些数据当作事件流处理。
SSE 与 HTTP/1.1 的关系
| 关键点 | 说明 |
|---|---|
| 协议 | SSE 使用 HTTP/1.1 的持久连接 (Connection: keep-alive) |
| 请求方式 | 只需要一个 GET 请求,服务器保持连接不关闭 |
| 内容类型 | Content-Type: text/event-stream |
| 传输方式 | 服务器通过 chunked transfer encoding(HTTP/1.1 的分块传输)发送事件 |
| 浏览器支持 | Chrome、Firefox、Safari、Edge 等均支持;IE 11 需要 polyfill |
HTTP/1.1 与 HTTP/2 的区别
| 关键点 | HTTP/1.1 | HTTP/2 |
|---|---|---|
| 连接 | 持久连接 (Connection: keep-alive) |
单个多路复用连接 |
| 传输 | Transfer-Encoding: chunked |
二进制帧 |
| 推送方式 | Server-Sent Events (SSE) | HTTP/2 Server Push |
| 实现 | 只需在同一请求上持续写数据 | 需要专门的 PUSH_PROMISE 帧 |
SSE 本质上是 HTTP/1.1 的持久连接,使用 text/event-stream 内容类型和 chunked 传输。
SSE 与 HTTP/2 Server Push 的区别
| SSE (HTTP/1.1) | HTTP/2 Server Push | |
|---|---|---|
| 方向 | 单向(服务器→客户端) | 单向(服务器→客户端) |
| 协议层 | HTTP/1.1 + chunked | HTTP/2 + PUSH_PROMISE |
| 使用场景 | 实时日志、推送通知、聊天(只需服务器推送) | 预加载资源 (CSS/JS) |
| 实现难度 | 只需写一个持续输出的路由 | 需要服务器支持 HTTP/2 并手动触发 push |
| 浏览器支持 | 所有现代浏览器 | 所有现代浏览器(但需要服务器开启 HTTP/2) |
| 兼容性 | 只要浏览器支持 SSE(IE11 需要 polyfill) | 需要 HTTP/2,IE11 不支持 |
结论
SSE 不是 HTTP/2 的服务器推送,而是基于 HTTP/1.1 的单向流。HTTP/2 的 Server Push 主要用于预加载资源,而 SSE 用于实时事件流。