使用HTTP保持活动和websockets(socket.io)时的TCP连接数

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等。