将服务器发送的事件与 HTTP2 一起使用时是否仍然存在实际的 6 个连接限制?

Is there still a practical 6 connection limit when using Server Sent Events with HTTP2?

我一直在谷歌搜索,我似乎无法找到这个问题的直接答案,而且有些人提供了相互矛盾的答案。

大多数浏览器对每个域都有 6 个连接限制。因此,例如,如果您的网站是 example.com 并且它在页面加载时初始化持久服务器发送事件连接,那么最终用户可以再打开该选项卡五次,但第六个选项卡根本不会加载,因为该域已达到 6 个持久 TCP 连接。

现在,我看到有人说这只是 SSE 的一个长期问题,唯一的替代方法是涉及检测此连接限制然后关闭隐藏选项卡中的连接或关闭这些选项卡中的那些连接的 hacky 解决方法并切换到长轮询。

但是,一些 人声称 HTTP2 通过多路复用解决了这个问题,这样您就可以打开该网站的任意多个选项卡,因为所有选项卡都是多路复用的到同一个 TCP 连接上。我找不到此声明的主要来源,也找不到任何具有重大权威的人。

那么,这是真的吗? HTTP2多路复用是否解决了网站域名常见的6个连接限制问题?或者如果他们想要支持许多打开的标签到他们的网站,基本上需要改用 websockets 吗?

我在 Jetty 中实现了 HTTP/2。

中所述,HTTP/2 浏览器可以向服务器发出的最大并发请求数大幅增加 - 不是无限,而是从 6-8 增加到大约 100。

所以是的,多路复用在实践中解决了这个问题(除非你打开超过 100 个左右的标签)。

注意这个值是由服务器配置的,所以有可能服务器给客户端发送一个配置,最大并发请求数设置的比较小,但是在练习服务器已经确定了 100 左右的数字。

话虽如此,您还想阅读 以了解有关 SSE 与 WebSocket 的讨论。

限制在浏览器中应用(不是服务器端),varies per browser

至少从 http/1.1 开始是这样。我一直无法找到任何特定于 http/2 的配置,所以我认为我们必须假设限制仍然存在。我假设它们一直被保留以防止滥用或意外的 DoS 攻击。

https://developer.mozilla.org/en-US/docs/Mozilla/Preferences/Mozilla_networking_preferences

参见 network.http.max-persistent-connections-per-server。 (您也可以在about:config中看到它。)

以下是我看到的所有设置(在 Firefox 中)过滤 "connections":

我想知道 SSE 是由 http.max-connections 还是 websocket.max-connections 管理的? (暂时忽略任何每个域的限制。)

当然你也可以试一试(在我上面的链接问题中有示例脚本)。但是除非你控制所有客户端的配置,否则你必须假设有些人会 运行 限制为 6.