Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用HTTP保持活动状态和WebSocket(socket.io)时的TCP连接数_Http_Tcp_Websocket_Socket.io_Keep Alive - Fatal编程技术网

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

使用HTTP保持活动状态和WebSocket(socket.io)时的TCP连接数,http,tcp,websocket,socket.io,keep-alive,Http,Tcp,Websocket,Socket.io,Keep Alive,我已经实现了一个功能完善的节点http服务器,具有数据库驱动的会话管理,并且能够在上面使用socket.io来实现文件上传进度条和聊天应用程序。 我还使用了节点http代理,并能够代理WebSocket。在这种背景下,我有以下几个问题,我认为要成为一名有效的socket.io开发人员,我需要知道这些问题。我并没有陷入任何特定的代码,但下面要求的信息是一个有效的套接字开发人员必须的,但似乎没有在任何地方解释 我的理解是: a。HTTP使用TCP套接字作为底层传输。 在较旧的HTTP实现中,每个请求

我已经实现了一个功能完善的节点http服务器,具有数据库驱动的会话管理,并且能够在上面使用socket.io来实现文件上传进度条和聊天应用程序。 我还使用了节点http代理,并能够代理WebSocket。在这种背景下,我有以下几个问题,我认为要成为一名有效的socket.io开发人员,我需要知道这些问题。我并没有陷入任何特定的代码,但下面要求的信息是一个有效的套接字开发人员必须的,但似乎没有在任何地方解释

我的理解是:

a。HTTP使用TCP套接字作为底层传输。 在较旧的HTTP实现中,每个请求使用一个套接字。 在较新版本中,“Keep-alive”报头用于使套接字保持活动状态,以便与多个请求-响应一起使用。 TCP在其信令和数据传输方面本质上是全双工的,但在不能同时在同一连接上加载多个HTTP请求/响应的意义上不是多路复用的。keep-alive标志有助于按顺序为http请求/响应事务使用相同的连接

b。“升级”HTTP头用于将常规HTTP连接升级到websocket连接。websocket连接实际上是基本TCP连接,现在抽象为http协议级别

问题:在WebSocket握手之后,现在是有两个TCP连接,还是只有一个由http用于全双工通信? 我的意思是,是否有一个TCP连接用于常规http请求,另一个用于socket.io之类的库使用的双向传输? 换句话说,标题“升级”真的意味着升级现有的TCP连接而不是打开新的TCP连接吗? 一个网页能否打开到同一服务器的多个基于ws的TCP连接?例如,由同一服务器管理的同一页面中的两个聊天会话? 在这种情况下,打开的TCP连接的总数和类型是什么

我试图通过netstat获得一些答案,但无法得出任何明确的结论。Wireshark可能会有帮助,但我不擅长使用它。 任何澄清都会有帮助

websocket连接实际上是基本TCP连接,现在抽象为http协议级别

HTTP是TCP之上的协议,WebSockets也是TCP之上的协议。虽然WebSocket从编程的角度来看与普通的套接字非常相似,但它不是纯TCP。取而代之的是,有一些框架来获取消息边界,而不是单个数据流,还有一些数据屏蔽,所以在使用WebSocket传输类似HTTP的内容时,愚蠢的代理不会被拒绝

HTTP升级将底层TCP连接的协议从HTTP切换到Websockets协议。一旦切换完成,就没有回头路了

一个网页能否打开到同一服务器的多个基于ws的TCP连接

一个网页可以打开到同一服务器的多个HTTP连接,并且每个连接都可以升级到WebSocket。Websockets RFC的唯一限制是浏览器不应同时创建多个Websockets到同一主机的连接,但不限制它们是在彼此之后创建并并行运行的

在这种情况下,打开的TCP连接的总数和类型是什么


这取决于您的应用程序。每个WebSockets连接都将有一个TCP连接。此外,还将有其他TCP连接来获取HTTP资源。它们的确切类型(HTTP与HTTP/2)以及它们的数量取决于浏览器和服务器,即如果使用keep alive,则使用HTTP/2等。

@Samir:浏览器可以有多个到同一主机的WebSocket连接,它不应该同时创建它们(但一旦创建,它们将继续运行)。此外,WebSocket实际上是以HTTP请求为前缀的传输层协议,不限于请求-响应方案。这类似于用于通过HTTP代理对HTTPS(和WebSocket)进行隧道传输的连接请求。@Samir:升级完成后,同一连接中没有常规HTTP请求。一旦升级到WebSocket,就没有回头路了。这也类似于连接请求。整个概念类似于多级火箭。您只能从第一个阶段(HTTP)到第二个(WebSoCukes),而不是返回。我考虑添加以下几点:1。使用
keep alive
不能保证一个HTTP连接(较新的浏览器将使用2-4个连接,以避免大型响应阻塞信息流,较旧的浏览器将使用更多)。2.升级后,连接是通过TCP/IP的Websocket协议,而不是HTTP(我认为您在第一段末尾错误地编写了HTTP)。3.除非打开新连接,否则无法返回HTTP。4.无法保证每个客户端将使用多少个连接,特别是在分解socket.io的行为时。@Myst:to 2)HTTP是通过TCP/IP的,WebSockets只是继续使用相同的底层TCP/IP连接。但是WebSocket并不是简单的TCP/IP。还有一个额外的帧来获取消息而不是字符串,还有一个XORing,这样愚蠢的代理就不会混淆。@SteffenUllrich-至于2)我知道这个额外的帧(我是Idio、websocket和HTTP server的作者)。。。但是不再有任何超文本传输协议(即请求->响应),因此我们将HTTP抛在脑后,通过TCP/IP使用websocket协议(即帧和屏蔽)进行通信。当从HTTP升级到HTTP/2(
htc
)或使用ALPN时,情况也是如此——我们抛弃了旧协议,转而使用新协议。因此,它不再是HTTP,尽管它是相同的