服务器发送的事件是不是使用 HTTP/2 流水线

Posted

技术标签:

【中文标题】服务器发送的事件是不是使用 HTTP/2 流水线【英文标题】:Does Server-Sent Events Utilise HTTP/2 Pipelining服务器发送的事件是否使用 HTTP/2 流水线 【发布时间】:2017-01-09 12:45:34 【问题描述】:

当通过 html5 EventSource 对象使用 SSE 时,请求是否利用了 HTTP/2 多路复用/流水线功能?特别是,不同选项卡中的 SSE 请求会(重新)使用相同的 HTTP/2 连接吗?

我假设是这样,因为 SSE 基于 (AFAIK) HTTP/1.1 chunked_encoding 技术,但想检查一下。

【问题讨论】:

HTTP/2 在传输级别上工作,它更接近于 TLS(确切地说,它主要作为 TLS 的应用层协议协商 (ALPN) 扩展实现)作为 HTTP 1.1 的替代品。因此,服务器发送的事件与 HTTP/2 结合起来没有问题,并且应该利用流水线功能。 HTTP/2 的设计目标之一是:使用 HTTP 1.1 开发的旧应用程序应该自动使用 HTTP/2 的最大优势(仍然需要进行修改才能使用服务器推送)。 【参考方案1】:

是的,他们会的。 Chrome 的 http2 标签是探索如何发出 http2 请求的好方法:chrome://net-internals/#http2。

对于 SSE 发出的请求,您应该会看到如下内容:

                HTTP2_SESSION_SEND_HEADERS
                        --> exclusive = true
                        --> fin = true
                        --> has_priority = true
                        --> :method: GET
                            :authority: h2.example.org
                            :scheme: https
                            :path: /demo_sse.php
                            accept: text/event-stream
                            cache-control: no-cache
                            referer: https://h2.example.org/
                            accept-encoding: gzip, deflate, sdch, br
                            accept-language: en-US,en;q=0.8,fr;q=0.6,es;q=0.4
                        --> parent_stream_id = 0
                        --> priority = 1
                        --> stream_id = 7

正如您在此示例中所见,浏览器在流 id 7 上发送请求,并重新使用它必须获取 html 的连接。

【讨论】:

【参考方案2】:

理论上,是的。而且,实际上答案应该是相同的,因为大多数浏览器都在其 XmlHttpRequest2 对象之上实现了 SSE。

(说句公道话,我还没有找到明确的参考资料表明对同一来源的 AJAX 请求在选项卡之间共享,但很难想象为什么浏览器不允许这样做 - 我没能做到例如,想出一个安全原因。)

【讨论】:

以上是关于服务器发送的事件是不是使用 HTTP/2 流水线的主要内容,如果未能解决你的问题,请参考以下文章

服务器如何向应用发送事件

为啥以及如何 SSE(服务器发送事件)是单向的

HTTP/1.1 流水线和 HTTP/2 多路复用有啥区别?

AI神经网络流水线MLOps machine learning pipline 华为和深信服 等公司的落地 QCon 大会2022

AI神经网络流水线MLOps machine learning pipline 华为和深信服 等公司的落地 QCon 大会2022

AI神经网络流水线MLOps machine learning pipline 华为和深信服 等公司的落地 QCon 大会2022