The number of TCP connections when using HTTP keep-alive and websockets (socket.io)
我已经实现了具有数据库驱动的会话管理功能的成熟节点http服务器,并且能够在顶部使用socket.io来实现文件上传进度栏和聊天应用程序。我还使用了node-http-proxy并能够代理websockets。在这种背景下,我有以下问题,我相信我需要成为一个有效的socket.io开发人员。我没有任何特定的代码,但是下面要求的信息是成为有效的套接字开发人员所必须的,但似乎没有在任何地方进行解释。
我的理解:
a。 HTTP使用TCP套接字作为基础传输。在较旧的HTTP实现中,每个请求使用一个套接字。在较新的版本中," Keep-alive "标头用于使套接字保持活动状态,以便与多个请求-响应一起使用。 TCP本质上是全双工的,无论是在其信令还是在数据传输方面,但是在无法将多个HTTP请求/响应无法同时加载到同一连接的意义上,它并不是多路复用的。 keep-alive标志有助于按顺序对HTTP请求/响应事务使用相同的连接。
b。 " upgrade " HTTP标头用于将常规的http连接升级到websocket。 Websocket连接实际上是基本的TCP连接,现在已经在http协议级别抽象了。
问题:在websockets握手之后,现在有两个TCP连接,或者只是一个HTTP用于全双工连接通讯?我的意思是,是否有一个用于常规http请求的TCP连接,现在又有一个用于套接字(如socket.io)使用的双向传输的TCP连接?换句话说,标头"升级"是否真的意味着升级了现有的TCP连接,而不是打开了一个新的TCP连接?一个网页能否打开到同一服务器的多个基于ws的TCP连接?例如,同一页面中由同一服务器管理的两个聊天会话?在这种情况下,打开的TCP连接的总数将是多少?它们的类型是什么?
我试图用netstat获得一些答案,但是我无法得出任何明确的结论。 Wireshark可能会有所帮助,但我并不擅长使用它。任何澄清都将有所帮助。
A websocket connection is effectively the basic TCP connection which is now abstracted at the http protocol level.
HTTP是TCP之上的协议,而WebSockets也是TCP之上的协议。虽然WebSockets从编程角度看通常像普通套接字一样,但它并不是纯TCP。取而代之的是有一些框架来获取消息边界,而不是单个数据流,并且对数据进行一些掩蔽,因此在使用WebSockets传输HTTP之类的东西的情况下,愚蠢的代理不会被拒绝。从HTTP到Websockets协议的基础TCP连接。一旦切换完成,就无法退回。
Can one webpage open multiple ws-based TCP connections to the same server?
一个网页可以打开到同一服务器的多个HTTP连接,并且每个连接都可以升级到WebSockets。 Websockets RFC的唯一限制是浏览器不应同时创建到同一主机的多个Websockets连接,但没有限制,它们是彼此创建并并行运行的。
In this case, what will be the total number of open TCP connections and of what type will they be?
这取决于您的应用程序。每个WebSockets连接都将有一个TCP连接。此外,还将有其他TCP连接来获取HTTP资源。它们的确切类型(HTTP vs.HTTP / 2)以及它们的数量取决于浏览器和服务器,即如果使用keep-alive,则使用HTTP / 2等。
- 已投票。由于HTTP是有效的请求驱动的,因此websockets如何使用它来实现服务器发起的通信?另外,如果浏览器无法启动与同一主机的两个ws连接,这是否意味着,例如,在同一应用程序中在同一浏览器中同时运行的同一主机中不能存在两个基于ws的聊天?升级后,常规的http请求是否使用升级后的协议,还是仍然可以使用底层的普通http?这种澄清将完成答案,对其他人也将有用。
- @Samir:浏览器可以有多个Websockets连接到同一主机,它不应只同时创建它们(一旦创建,它们就可以继续运行)。而且,Websocket实际上是以HTTP请求为前缀的传输层协议,并且不限于请求-响应方案。这类似于CONNECT请求,该请求用于通过HTTP代理隧道HTTPS(和Websocket)。
- 我已经接受了答案,但是如果您可以抽出一些时间,这是一些最终的疑问。 \\\\"此外,Websockets实际上是一个以HTTP请求为前缀的传输层协议,并且不仅限于请求-响应方案。\\\\"因此,HTTP仅用于初始握手,然后不起作用在websockets中?升级后为常规HTTP请求提供服务的方式是否与升级前相同?
- @Samir:升级完成后,同一连接中没有常规的HTTP请求。一旦升级到Websockets,就没有回头路了。这也类似于CONNECT请求。整个概念类似于多级火箭。您只能从第一阶段(HTTP)到达第二阶段(Websockets),而不能返回。
- 我考虑添加以下几点:1.使用keep-alive不能保证单个HTTP连接(较新的浏览器将使用2-4个连接,以避免大的响应阻塞信息流,较旧的浏览器将使用更多)。 2.在upgrade之后,连接是基于TCP / IP的Websocket协议,而不是HTTP(我认为您在第一段末尾错误地编写了HTTP)。 3.除非打开新连接,否则无法返回HTTP。 4.没有办法保证每个客户端将使用多少连接,尤其是在考虑socket.io的行为时。
- @Myst:到2)HTTP通过TCP / IP,WebSockets继续使用相同的基础TCP / IP连接。但是WebSockets不是普通的TCP / IP。还有一个额外的框架来获取消息而不是字符串,并且还进行异或操作,以使愚蠢的代理不会混淆。
- @Myst:至于1)和4)-尽管这些都是正确的,但我不认为它们是OP所面临问题的一??部分。至于2)和3)-我重新设计了答案,以使这些观点更加清楚。
- @SteffenUllrich-至于2)我知道额外的框架(我是Iodine,Plezi的websocket和HTTP服务器的作者)...但是不再有任何超文本传输??协议(即request-> response),所以我们将HTTP抛在后面,使用websocket协议进行通信(即框架
- @Myst:我同意你的看法,我认为编辑后我应该做得更清楚。我也做了我的websockets协议实现。
- @SteffenUllrich-是的,更清晰。一个非常简洁的答案。至于(1)
- @Myst "新的浏览器将使用2-4个连接以避免... "和"的要点,因此我们将HTTP留在后面,使用websocket协议进行通讯...通过TCP / IP ... "的确添加接受的答案的价值。
- @Samir:但是具体细节取决于浏览器和服务器。服务器可能不使用保持活动状态,可能会提供HTTP / 2,并且并行连接的数量取决于浏览器,当然还取决于需要多少资源等等。可能会有很大的变化。
- 这是一个有价值的问题,其答案和评论也很棒!我来到这里是一个类似的例子:如果出现Keep-alive并且只有一个TCP连接正在使用,并且有几个文件(例如,css文件和js文件)正在传输,并且一个js文件启动了WebSocket,而还有一些文件要被传输,剩下的传输又如何呢?如果TCP连接立即升级到WS,那么其余要通过HTTP传输的文件呢?我猜浏览器的实现不会将TCP连接重新用于Keep-alive HTTP通道。但是我还没有证明。
- @Robert:评论部分不是提出新问题,甚至是相关问题的正确位置。只有很少的人会注意到那里的问题,没有人会在评论中寻找答案。
- @SteffenUllrich感谢您的提示。我会考虑一下,稍后再询问。