ChatGPT解决这个技术问题 Extra ChatGPT

浏览器中的最大并行 HTTP 连接数?

我正在创建一些与 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 时代过时的策略
此处的解决方案是为所有选项卡更新仅暂停一个连接。当一个选项卡打开时,该选项卡的更新请求被发送到服务器,该选项卡在主挂起的连接上侦听任何更新,并且只选择它感兴趣的那些。我知道这不是你的'在问,但认为它可能对某人有用。 :-)

m
mojoaxel

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

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 连接是否有任何限制?
每个服务器 2 个连接的限制已从 HTTP 1.1 RFC 中删除:evertpot.com/http-11-updated
F
Fatih Hayrioğlu

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 上获得相同的速度联系?
f
fuweichin
 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 的回调中,+ requestAnimationFrame,然后...

[^note4]:其中后6个为后续(2、4、6分别在0.5s、1s、1.5s可用)


从 50+ 版本开始,Chrome 现在最多支持 17 个 Max Connections,使其与 Firefox 和 Safari 不相上下。
我认为这个答案有点误导。主机和域完全不同。 ConnectionsPerHostname 表示每个子域。因此,如果有 2 个子域,它会使用额外的连接。如果没有子域,则意味着每个域。
这是每个 chrome 标签的限制吗?还是单个 Chrome 实例中的所有选项卡?还是所有 Chrome 实例中的所有选项卡?
任何人都有浏览器范围的替代品来测试这个,看起来工具不再托管。
@Don Dilanga,“子域”只是在某些情况下用于描述域的词。 “子域”的具体含义只与cookies等少数老旧的Web技术有关。更合适的术语是“主机”,因为地址也很重要。但就本问答而言,域 = 子域 = 主机。当然,它们都是错误的,因为实际上它实际上与起源有关:方案、主机和端口。 (现已失效的)HTTP/1.1 规范本身没有使用这些术语,而是使用了“服务器或代理”这一短语。
S
Soroush

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


任何人都有浏览器范围的替代品来测试这个,看起来工具不再托管。
p
palswim

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
C
Community

在 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 连接)


J
Josh

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


我同意,最好遵循标准。
遵循标准是好的,但应用常识并参与修订这些标准也是如此:请参阅trac.tools.ietf.org/wg/httpbis/trac/ticket/131
好点@JulianReschke,但是对于 HTTP/2,不再需要每个主机有大量连接。请参阅:http2.github.io/faq/#why-just-one-tcp-connection
J
John A.

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


B
Blixt

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


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

是的,通配符域将为您工作。不知道对连接的任何限制。限制(如果有)将是特定于浏览器的。


R
Rodney P. Barbati

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

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

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