25

长期以来,浏览器使用每个主机最多 6 个并发 HTTP 1.1 连接来从网页检索资产。(远远)超出这个黄金标准被认为是 DOS 并让你被禁止访问服务器。

现在有了 HTTP/2,我们可以在一个连接上多路复用多个 HTTP 请求。为了防止服务器过载,我们是否还应该对连接上多路复用的并发请求数量使用类似的限制?还是在单个连接上多路复用更多请求没有害处?

任何人都知道浏览器对 HTTP/2 服务器的每个主机和每个连接使用的限制是什么?

4

1 回答 1

27

客户端和服务器可以发起的流的数量不是无限的,它是由每个对等点在连接开始时发送SETTINGS_MAX_CONCURRENT_STREAMS的帧的参数规定的:参见RFC 7540的 6.5.2 节默认是无限的,并且 RFC有以下建议:SETTINGS

建议此值不小于 100,以免不必要地限制并行度。

然而,在考虑 HTTP/2 中的并行性时,流的数量并不是唯一要考虑的参数。权重和流依赖也开始发挥作用。

每个流都有一个权重,RFC 建议服务器根据权重为流分配资源。在客户端,Firefox 为 CSS 分配比图像更高的权重。有关每个浏览器如何确定其流的优先级和组织方式的更多详细信息,请参阅这个精彩的演示文稿。Chrome 使用依赖项,因此最重要的元素(CSS、HTML)在依赖项链中比其他元素更高。请参阅此工具,该工具说明了 Chrome 生成的依赖关系树。服务器端,H2O,一个新的快速的 HTTP 服务器,为每个连接实现一个 O(1) 调度程序,以便根据依赖关系和权重将流发送到客户端。这意味着如果您请求 500 个具有默认依赖项的元素,则每个流将获得 1/500 的服务器资源。

请求尽可能多的元素(对于常规网页浏览)不应该有任何不利之处。根据HTTPArchive,40% 的页面包含超过 100 个元素,我认为同时询问它们是合理的(前提是流的数量保持在以下SETTINGS_MAX_CONCURRENT_STREAMS。我认为重要的是能够请求它们以允许浏览器尽可能快地呈现它的顺序。

于 2016-09-29T04:02:58.627 回答