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

我想我可以做一些通配符域的事情,在那里我有我的HTTP服务器解析任何地址到我的网站,如:

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

so:

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

所有仍然指向(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作为例子。


当前回答

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

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

为了更清楚地看到效果,可以使用JMeter之类的工具向服务器主机发起一系列web服务调用——它将接受前两个,直到其中一个完成才接受另一个。令人惊讶的是,对于SOA商店来说,这是至关重要的,但几乎没有人真正意识到这一点。

其他回答

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

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

为了更清楚地看到效果,可以使用JMeter之类的工具向服务器主机发起一系列web服务调用——它将接受前两个,直到其中一个完成才接受另一个。令人惊讶的是,对于SOA商店来说,这是至关重要的,但几乎没有人真正意识到这一点。

 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请求数。 为了增加并发连接的数量,可以将资源(例如映像)托管在不同的域中。然而,你不能超越 最大连接数,一个浏览器将在所有域中打开的最大连接数。

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个为随访(分别在0.5s、1s、1.5s可获得2、4、6个)

2个并发请求是许多浏览器设计的一部分。有一个标准是“好的http客户端”有意遵守的。看看这个RFC,看看为什么。

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)

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

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