客户端通过JavaScript 创建EventSource 对象并指定服务端SSE端点URL,浏览器随即发起一个标准的HTTP GET请求,请求头中包含Accept: text/event-stream。服务器响应状态200 OK,响应头中包含Content-Type: text/event-stream、Cache-Control: no-cache、Connection: keep-alive,然后保持连接打开,开始持续写入事件数据。
SSE 协议定义了严格的文本格式:每条消息由一个或多个字段行组成,字段行格式为字段名: 字段值\n,消息之间用空行(\n\n)分隔。常用字段包括:data:消息负载(可多行,多行data会自动拼接)、event:自定义事件类型、id:消息ID(用于重连时标识最后接收的消息)、retry:建议的重连等待时间(毫秒)、:开头的行为注释行(常用于心跳保活)。
当SSE 连接因网络故障、服务器重启等原因断开时,浏览器内置的EventSource 会自动尝试重新连接,默认等待3秒后重试,等待时间可通过服务器下发的retry:字段调整。重连时浏览器会自动在HTTP请求头中携带Last-Event-ID字段,值为最后一次收到的消息ID,服务器可据此补发断线期间遗漏的消息。
在HTTP/2协议下,多个SSE连接可复用同一个TCP连接(多路复用),有效规避了HTTP/1.1的6连接并发限制。腾讯云CLB(负载均衡器)和腾讯云CDN均已支持HTTP/2,在实际部署中建议优先使用HTTP/2或HTTP/3以降低连接开销。