简单探索 SSE 网络协议

是什么

这种通信方式并非传统的 http 接口或者 WebSockets,而是基于 EventStream 的事件流,像打字机一样,一段一段的返回答案。GPT就是采取的这种网络协议

Server-Sent Events 服务器推送事件,简称 SSE,是一种服务端实时主动向浏览器推送消息的技术。

​ SSE 是 HTML5 中一个与通信相关的 API,主要由两部分组成:服务端与浏览器端的通信协议(HTTP 协议)及浏览器端可供 JavaScript 使用的 EventSource 对象。

​ 从“服务端主动向浏览器实时推送消息”这一点来看,该 API 与 WebSockets API 有一些相似之处。但是,该 API 与 WebSockers API 的不同之处在于:

实现

SSE 的实现相对比较简单(指和其他网络协议相比),因为它是基于 HTTP 的在应用层上的协议

本质是浏览器发起 http 请求,服务器在收到请求后,返回状态与数据,并附带以下 headers:

Content-Type: text/event-stream

Cache-Control: no-cache

Connection: keep-alive

SSE API规定推送事件流的 MIME 类型为 text/event-stream。必须指定浏览器不缓存服务端发送的数据,以确保浏览器可以实时显示服务端发送的数据。SSE 是一个一直保持开启的 TCP 连接,所以 Connection 为 keep-alive。

消息格式

EventStream(事件流)为 UTF-8 格式编码的文本或使用 Base64 编码和 gzip 压缩的二进制消息。

​ 每条消息由一行或多行字段(eventidretrydata)组成,每个字段组成形式为:字段名:字段值。字段以行为单位,每行一个(即以 \n 结尾)。以冒号开头的行为注释行,会被浏览器忽略。

​ 每次推送,可由多个消息组成,每个消息之间以空行分隔(即最后一个字段以\n\n结尾)。

客户端实现

客户端实现其实也比较简单,只要设置好 URL ,相应的一些 Header,然后自定义一些方法就能实现 SSE 客户端了。要实现一些比较强大的功能比如说断线重连、传输大文件、通道传输等等就需要在服务端多思考

总结

​ SSE 可以在 Web 应用程序中实现诸如股票在线数据、日志推送、聊天室实时人数等即时数据推送功能。需要注意的是,SSE 并不是适用于所有的实时推送场景。在需要高并发、高吞吐量和低延迟的场景下,WebSockets 可能更加适合。而在需要更轻量级的推送场景下,SSE 可能更加适合。因此,在选择即时更新方案时,需要根据具体的需求和场景进行选择。