我正在创建一些与 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 作为示例。
每个服务器/代理的最大默认同时持久连接数:
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
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)
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可用)
各种浏览器对每个主机名的最大连接数有不同的限制;您可以在 http://www.browserscope.org/?category=network 找到确切的数字,这里有一篇来自网络性能专家 Steve Souders 的关于连接限制的有趣文章http://www.stevesouders.com/blog/2008/03/20/roundup-on-parallel-connections/
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
在 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 连接)
2 个并发请求是许多浏览器设计的有意部分。有一个标准是“好的 http 客户端”故意遵守的。查看 this RFC 了解原因。
请注意,将浏览器的每台服务器的最大连接数增加到过多(如某些站点所建议的那样)可以并且确实将其他用户锁定在具有限制服务器上同时连接总数的托管计划的小型站点之外。
对此没有明确的答案,因为每个浏览器都有自己的配置,并且此配置可能会更改。如果您在 Internet 上搜索,您可以找到更改此限制的方法(通常它们被称为“性能增强方法”。)如果您的网站需要,建议您的用户这样做可能是值得的。
是的,通配符域将为您工作。不知道对连接的任何限制。限制(如果有)将是特定于浏览器的。
我的理解是连接限制在客户端是不可更改的。必须在服务器上更改连接限制才能生效。默认情况下,许多服务器将只允许每个唯一客户端 2 个连接。
客户端不是浏览器,它是发出 TCP/IP 请求的客户端机器。
要非常清楚地看到效果,请使用 JMeter 之类的工具向您的服务器主机发出一堆 Web 服务调用 - 它会接受前两个,并且在两个完成之前不会接受另一个。令人惊奇的是,对于 SOA 商店来说,这是至关重要的,但几乎没有人真正意识到这一点。