【问题标题】:Max parallel HTTP connections in a browser?浏览器中的最大并行 HTTP 连接数?
【发布时间】:2018-06-18 10:39:02
【问题描述】:

我正在创建一些与 HTTP 服务器(彗星、反向 AJAX 等)的暂停连接。它工作正常,但我看到浏览器只允许同时挂起两个到给定域的连接。因此,如果用户在其浏览器的 Tab1 中查看我的网站,然后还尝试在 Tab2 中加载它,则他们已经用完了与我网站的两个允许连接。

我想我可以做一些通配符域的事情,让我的 HTTP 服务器将任何地址解析到我的站点,例如:

*.example.com/webapp  -> 192.0.2.1 (the actual ip of my server)

所以:

a.example.com/webapp
b.example.com/webapp
c.example.com/webapp

all 仍然指向 (www.example.com/webapp) 但浏览器认为它们是不同的域,所以我没有遇到 2 个连接限制。这是真的吗?

即使 为真 - 每个浏览器的活动连接数是否有任何限制,跨所有域?假设我使用上面的方案 - 例如,Firefox 在任何给定时间只允许 24 个并行连接吗?比如:

1) a.example.com/webapp
2) www.download.example/hugefile.zip
3) b.example.com/webapp
4) c.example.com/webapp
...
24) x.example.com/webapp
25) // Error - all 24 possible connections currently in use!

我刚刚选择了 24 个连接/Firefox 作为示例。

【问题讨论】:

  • 是的,它被称为domain sharding,这是 HTTP/2 时代过时的策略
  • 这里的解决方案是为您的所有标签更新只暂停一个连接。当打开一个选项卡时,该选项卡的更新请求被发送到服务器,并且该选项卡在主挂起连接上侦听任何更新,并且只选择它感兴趣的那些。我知道这不是你的'在问,但认为它可能对某人有用。 :-)

标签: html http web-applications persistent-connection web-performance


【解决方案1】:

每个服务器/代理的最大默认同时持续连接数:

Firefox 2:  2
Firefox 3+: 6
Opera 9.26: 4
Opera 12:   6
Safari 3:   4
Safari 5:   6
IE 7:       2
IE 8:       6
IE 10:      8
Edge:       6
Chrome:     6

限制是每个服务器/代理,所以你的通配符方案可以工作。

仅供参考:这与 HTTP 1.1 相关;其他协议有不同的关注点和限制(即 SPDY、TLS、HTTP 2)。

【讨论】:

  • 我很惊讶。 HTTP 1.1 RFC 不是说将每个服务器的持久连接限制为 2 个吗?
  • 是的。最近的浏览器不再符合要求。
  • 对这些限制的引用?
  • 每个来源的 WebSockets 连接是否有任何限制?
  • HTTP 1.1 RFC:evertpot.com/http-11-updated 中删除了每台服务器 2 个连接的限制
【解决方案2】:
 BrowserVersion | ConnectionsPerHostname | MaxConnections
----------------------------------------------------------
 Chrome34/32    | 6                      | 10
 IE9            | 6                      | 35
 IE10           | 8                      | 17
 IE11           | 13                     | 17
 Firefox27/26   | 6                      | 17
 Safari7.0.1    | 6                      | 17
 Android4       | 6                      | 17
 ChromeMobile18 | 6                      | 16
 IE Mobile9     | 6                      | 60

第一个值为 ConnectionsPerHostname,第二个值为 MaxConnections

来源:http://www.browserscope.org/?category=network&v=top

注意:ConnectionsPerHostname 是浏览器向同一域发出的最大并发 http 请求数。 为了增加并发连接的数量,可以在不同的域中托管资源(例如图像)。但是,您不能超过 MaxConnections,浏览器总共打开的最大连接数 - 跨所有域。

2020 年更新

每个浏览器的并行连接数

| Browser              | Connections per Domain         | Max Connections                |
| -------------------- | ------------------------------ | ------------------------------ |
| Chrome 81            | 6 [^note1]                     | 256[^note2]                    |
| Edge 18              | *same as Internet Explorer 11* | *same as Internet Explorer 11* |
| Firefox 68           | 9 [^note1] or 6 [^note3]       | 1000+[^note2]                  |
| Internet Explorer 11 | 12 [^note4]                    | 1000+[^note2]                  |
| Safari 13            | 6 [^note1]                     | 1000+[^note2]                  |
  • [^note1]:测试了 72 个请求,1 个域(127.0.0.1)
  • [^note2]:测试了 1002 个请求,每个域 6 个请求 * 167 个域 (127.0.0.*)
  • [^note3]:在异步上下文中调用时,例如在setTimeout的回调中,+requestAnimationFramethen...
  • [^note4]:其中后6个为后续(2、4、6分别在0.5s、1s、1.5s可用)

【讨论】:

  • 从 50+ 版开始,Chrome 现在最多支持 17 个 Max Connections,使其与 Firefox 和 Safari 不相上下。
  • 我认为这个答案有点误导。主机和域完全不同。 ConnectionsPerHostname 表示每个子域。因此,如果有 2 个子域,它会使用额外的连接。如果没有子域,则意味着每个域。
  • 这是每个 chrome 标签的限制吗?还是单个 Chrome 实例中的所有选项卡?还是所有 Chrome 实例中的所有标签页?
  • 一个网站是否可能需要如此多的资源,以至于同时使用所有 81 个连接?我的意思是使用相同的服务器,网站可能需要超过 81 个资源,并不意味着它需要 81 个连接才能有效地获取。
  • 任何人都有浏览器范围的替代品来测试这个,看起来工具不再托管。
【解决方案3】:

HTTP/1.1

IE 6 and 7:      2
IE 8:            6
IE 9:            6
IE 10:           8
IE 11:           8
Firefox 2:       2
Firefox 3:       6
Firefox 4 to 46: 6
Opera 9.63:      4
Opera 10:        8
Opera 11 and 12: 6
Chrome 1 and 2:  6
Chrome 3:        4
Chrome 4 to 23:  6
Safari 3 and 4:  4

来源:http://p2p.wrox.com/book-professional-website-performance-optimizing-front-end-back-end-705/

HTTP/2(SPDY)

Multiplexed support(one single TCP connection for all requests)

【讨论】:

  • 如果在操作系统级别限制为较低的值,浏览器真的可以使用这些高值吗?浏览器可以覆盖操作系统设置吗?就像在 Windows 中一样,您只有很少的注册表设置(MaxConnectionsPerServer 和 MaxConnectionsPer1_0Server)来控制每台服务器的最大连接数,如本文所述:stackoverflow.com/questions/2960056/…
  • 原来是 .NET 编程的特定问题。无论如何,第三方浏览器实现了自己的 HTTP 支持,因此不会受到 Windows 限制的影响。
  • 因此,Web 浏览器通常会为每个主机打开多个 TCP(约 6 个并行)连接以使用 HTTP 1.1 更快地加载不同的资源,因此 HTTP/2 不再是这种情况,因为多路复用通过一个 TCP 连接获得相同的速度?
【解决方案4】:

我的理解是连接限制在客户端是不可更改的。必须在服务器上更改连接限制才能生效。默认情况下,许多服务器只允许每个唯一客户端 2 个连接。

客户端不是浏览器,它是发出 TCP/IP 请求的客户端机器。

要非常清楚地看到效果,请使用 JMeter 之类的工具向您的服务器主机发出一堆 Web 服务调用 - 它会接受前两个调用,并且在两个完成之前不会接受另一个调用。令人惊奇的是,对于 SOA 商店来说,这是至关重要的,但几乎没有人真正意识到这一点。

【讨论】:

    【解决方案5】:

    在 GNU/Linux (Ubuntu) 上的 Firefox 33 上查看 about:config,并搜索 connections 我发现:

    network.http.max-connections: 256

    这很可能回答了 所有域中每个浏览器的活动连接数是否有任何限制

    network.http.max-persistent-connections-per-proxy:32

    network.http.max-persistent-connections-per-server: 6

    跳过了两个属性...

    network.websocket.max-connections: 200

    (有趣,似乎它们不受每个服务器的限制,但默认值低于全局 http 连接)

    【讨论】:

      【解决方案6】:

      各种浏览器对每个主机名的最大连接数有不同的限制;你可以在http://www.browserscope.org/?category=network找到确切的数字 这是一篇来自网络性能专家 Steve Souders http://www.stevesouders.com/blog/2008/03/20/roundup-on-parallel-connections/ 的关于连接限制的有趣文章

      【讨论】:

      • 任何人都有浏览器范围的替代品来测试这个,看起来工具不再托管。
      【解决方案7】:

      请注意,将浏览器的每台服务器的最大连接数增加到过多(如某些网站所建议的那样)可以并且确实将其他用户锁定在具有限制服务器上同时连接总数的托管计划的小型网站之外。

      【讨论】:

        【解决方案8】:

        Firefox 将该号码存储在此设置中(您可以在 about:config 中找到它):network.http.max-connections-per-server

        对于最大连接数,Firefox 将其存储在此设置中:network.http.max-connections

        【讨论】:

        • network.http.max-connections默认为900,与最大并行连接数无关,52版本测试仍为17。
        • 其实是network.http.max-persistent-connections-per-server
        【解决方案9】:

        2 个并发请求是许多浏览器设计的有意部分。有一个标准是“好的 http 客户端”故意遵守的。查看this RFC 了解原因。

        【讨论】:

        【解决方案10】:
        1. 是的,通配符域适合您。
        2. 不知道任何连接限制。限制(如果有)将是特定于浏览器的。

        【讨论】:

          【解决方案11】:

          对此没有明确的答案,因为每个浏览器都有自己的配置,并且此配置可能会更改。如果您在 Internet 上搜索,您可以找到更改此限制的方法(通常它们被称为“性能增强方法”)。如果您的网站需要,建议您的用户这样做。

          【讨论】:

          • 我再说一遍,这在浏览器上是不可配置的——或者它可能是,但仍然没有任何效果。执行每个客户端 2 个连接的是服务器,而不是客户端或客户端上的浏览器。增加浏览器上的连接将允许您有 2 个连接到更多不同的服务器(即您可以一次从多个服务器下载,没问题)。但是,您不能同时从任何一台服务器下载超过 2 个文件。为此,必须修改服务器。
          • 虽然这个答案已经过时了,但它在编写时是准确的。首先,服务器很少显着限制每个 IP 的连接,所以我认为你错了。其次,在 2009 年,IE 7 仍然存在,每个主机名最多有两个连接。这可以通过系统注册表进行配置。即使在今天,浏览器也有限制,而且它们通常是可配置的,但这些限制比当时要高得多。无论如何,随着 SPDY/HTTP2 的出现,随着服务器和浏览器实现新协议,这已成为一个小得多的问题。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多