HTML5 WebSockets: 最大开放连接数是多少?

54
HTML5 websockets是(并且已经有一段时间了)一个热门话题,因为它们优雅地实现了服务器端推送的实时功能。
我目前有一个使用Tomcat 7.0.30提供websocket支持的工作应用程序。但将其移植到生产环境中引发了问题。
主要是我想知道每个浏览会话可以同时操作(保持打开状态)的可能最大连接数;一个浏览会话意味着单个浏览器选项卡或窗口。
打开的websocket连接是否累加到Web服务器可以同时处理的最大连接数?例如Apache中的MaxClients
相反,单个浏览会话的最大网络套接字数量是否受到浏览器本身的限制?正如这篇博客文章所示,截至2012年4月,不同的浏览器支持不同数量的打开网络套接字连接。(我个人会在每个浏览会话中使用1个打开的网络套接字;但这些信息仍然很有用)。 TL/DR:
  1. 是客户端?服务器?还是两者的组合限制了每个浏览会话中可能的网络套接字数量?
  2. 相同的限制是否适用于ws:wss:连接?

1
我强烈建议在每个浏览会话中保持单一连接,因为你最不想担心的是跨浏览器限制。服务器是真正重要的地方。服务器和防火墙只能处理有限数量的并发连接。我曾经看到过基于套接字的托管提供商根据并发连接数量来制定价格,如果这给了你任何关于它的重要性以及你应该如何构建应用程序的想法(例如:每个用户仅使用一个连接)。 - Ryan Wheale
值得一读。http://drewww.github.io/socket.io-benchmarking/ - user1741851
2个回答

37

浏览器中的max-connections默认值没有标准规范,它取决于实现方式[0]。此外,在同一应用程序的浏览会话中使用多个Web套接字似乎是过度的,因为你可以使用发布/订阅通道。

连接的瓶颈通常在服务器端。Web套接字是HTTP的升级版本,因此连接只是升级后的HTTP(TCP)连接[1]。HTTPS和WSS仅向普通连接添加了安全层。它们不是不同的连接[2]。在您的情况下,请检查maxConnections(和maxThreads)[3]以及您的操作系统最大限制[4][5]。如果并发连接达到数万个,也许您应该开始考虑负载均衡或集群[6]。

[0]https://code.google.com/p/chromium/issues/detail?id=85323

[1]http://en.wikipedia.org/wiki/WebSocket

[2]http://en.wikipedia.org/wiki/HTTP_Secure

[3]http://tomcat.apache.org/tomcat-7.0-doc/config/http.html

[4]https://serverfault.com/questions/10852/what-limits-the-maximum-number-of-connections-on-a-linux-server

[5]https://superuser.com/questions/251596/is-there-a-hard-limit-of-65536-open-tcp-connections-per-ip-address-on-linux

[6]http://tomcat.apache.org/tomcat-7.0-doc/config/cluster.html

更多有关高并发的信息:http://www.kegel.com/c10k.html


11
从技术上讲,WebSocket不是HTTP的“升级版”。它是一种在TCP之上传输的不同协议。在握手和发送升级标头字段以启动协议切换时,它确实使用HTTP。 - hacklikecrack
@hacklikecrack 但是,您通过HTTP进行协商,将其发送到HTTP服务器,它将继续作为HTTP请求通过所述HTTP服务器流动,并且特别是使用“Connection:Upgrade”作为HTTP标头进行协商。在这一点上,我必须支持@Mardie ;) - trevorj
1
你所指的“发布/订阅通道”功能是什么? - Glyph
虽然HTTP和Websocket的协议有很大的区别,但Websocket实际上是HTTP连接的升级版本。当调用UPGRADE命令时,使用同一TCP连接,同时包括HTTP特定上下文的大部分内容。虽然握手期间可以重新协商很多上下文,但不被重新协商的元素将从现有的HTTP连接中继承过来。 - JSON

7
在Gecko 7中,他们引入了参数network.websocket.max-connections,您可以在about:config中进行设置。根据https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API,它设置了“每次”最大websocket连接数。
我不知道您是否可以从代码中确定此数字,以及是否有任何方法确定其他会话中打开了多少(因此还剩下多少个)。

嗯,似乎没有一种跨浏览器的方法来设置这个。仍然很有帮助;点赞。 - Joseph Victor Zammit
在Chrome中找不到类似的选项,但这对Firefox很有帮助,谢谢! - Brade
根据Mardie所提供的最受欢迎的答案中的第一个参考文献,Chrome在运行时不提供这样的设置,@Brade。您需要编译自己的自定义Chromium来更改限制。 - Palec
我的问题是从用户的角度出发的:当我打开太多带有TFS Web界面的选项卡时,它们都开始表现异常。在FF的about:config中设置更大的network.http.max-persistent-connections-per-server可以解决这个问题。 - Palec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接