根据HTTP规范(w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1.4),HTTP客户端应该限制其连接:
不同的使用持久连接的客户端应限制它们与给定服务器同时维护的连接数。单用户客户机不应与任何服务器或代理保持超过 2 个连接。
供应商以不同的方式实现此限制:http://www.stevesouders.com/blog/2008/03/20/roundup-on-parallel-connections/
但是。此限制是适用于每个选项卡、每个浏览器实例还是全局适用于浏览器的所有实例?弹出窗口(对话框)是被视为选项卡的一部分还是独立选项卡的一部分?
与 websocket 相同,每个源的连接限制是否适用于每个选项卡、浏览器实例或全局?
浏览器
对于不同的浏览器、浏览器版本或互联网连接速度,实现细节必然会有所不同(IE8 在拨号上使用 2 个连接,否则最多使用 6 个连接)。
此外,这些限制通常是用户可配置的(即 Mozilla 中的 network.http.max-connections-per-server),并且不应根据浏览器版本假设特定值。但是,脚本可以访问实际值,例如IE中的window.maxConnectionsPerServer。
但是。此限制是适用于每个选项卡、每个浏览器实例还是全局适用于浏览器的所有实例?
我发现的唯一相关信息是关于IE(http://social.msdn.microsoft.com/Forums/ie/en-US/a46bb0ba-419d-43ec-ad1b-f9596d508ca3/simultaneous-http-connection-limit):
连接限制是每个进程,浏览器将确定进程创建作为网站所有者,您无法真正更改它。该过程可以在多个选项卡/窗口之间共享,也可能不共享,这取决于您无法控制的许多因素
有关浏览器的更多最新数据,请访问 www.browserscope.org/?category=network
RFC
有一个更新的草案,RFC2616过时(如果获得批准)。引用相关部分(来自 https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-p1-messaging-21#section-6.2.3):
6.2.3. 并发
客户端应限制它们同时连接的数量维护到给定服务器。
HTTP的先前修订版提供了特定数量的连接作为天花板,但发现这对于许多应用来说是不切实际的。因此,此规范不强制要求特定的最大值连接数,但相反鼓励客户打开多个连接时保守。
通常使用多个连接来避免"线头"阻塞"问题,其中请求需要大量服务器端处理和/或具有较大的有效负载阻止后续请求在同一连接上。 但是,每个连接都会消耗服务器资源。 此外,使用多个连接可能会导致拥塞网络中的不良副作用。
请注意,服务器可能会拒绝它们认为滥用的流量,包括来自客户端的连接数量过多。
我没有详尽地研究过这个...... 我发现 1 台计算机可以打开大量浏览器或浏览器选项卡,并且每个选项卡将保持活动的 websocket 连接。
但是,对于服务器端事件(SSE 或 eventsource() ),情况并不相同。http://www.html5rocks.com/en/tutorials/eventsource/basics/
我在各种论坛上读到,当打开多个选项卡时,人们会遇到 SSE 问题(我认为 chrome 中有 6 个),这是因为浏览器限制了同时连接到单个 IP 地址的数量。
就好像 SSE 在页面的生命周期内保持连接一样。 然而,对于 websockets,情况并非如此。
想分享我最近与 chrome 的观察:
我使用 EVENTSOURCE API 打开一个持久的 http 连接。
超文本传输协议 -- HTTP/1.1:我可以在一个浏览器中打开 6 个连接(通过循环 EVENTSOURCE 6 次)或者使用一个事件源打开 6 个选项卡我可以在同一台机器上使用隐身铬打开 6 个新连接。超文本传输协议 -- HTTP/2:超过 20 个 [理论上他们说是 100] 我没有尝试。
感觉就像Chrome有一个http(TCP)连接池,可以一次保持打开状态。这个数字目前是 6 [在协议 http 1.1 的情况下]和 100 与 http2 无关标签/相同标签。