使用 HTTP keep-alive 和 websockets (socket.io) 时的 TCP 连接数

     2023-04-18     132

关键词:

【中文标题】使用 HTTP keep-alive 和 websockets (socket.io) 时的 TCP 连接数【英文标题】:The number of TCP connections when using HTTP keep-alive and websockets (socket.io) 【发布时间】:2016-03-20 00:03:27 【问题描述】:

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

我的理解:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

HTTP 是 TCP 之上的协议,WebSockets 也是 TCP 之上的协议。虽然 WebSockets 从编程方面看大多像普通套接字,但它不是纯 TCP。相反,有一些框架来获取消息边界而不是单个数据流,并且对数据进行了一些屏蔽,因此在使用 WebSockets 传输类似于 HTTP 的内容时不会拒绝愚蠢的代理。

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

一个网页可以打开多个基于ws的TCP连接到同一个服务器吗?

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

在这种情况下,打开的 TCP 连接的总数是多少?它们是什么类型的?

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

【讨论】:

@Samir:浏览器可以有多个 Websockets 连接到同一个主机,它不应该同时创建它们(但一旦创建它们就会继续运行)。此外,Websockets 实际上是一个以 HTTP 请求为前缀的传输层协议,并且不限于请求-响应方案。这类似于 CONNECT 请求,该请求用于通过 HTTP 代理隧道传输 HTTPS(和 Websocket)。 @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: to 2) HTTP 是基于 TCP/IP 的,而 WebSockets 只是继续使用相同的底层 TCP/IP 连接。但是 WebSockets 不是普通的 TCP/IP。有一个额外的框架来获取消息而不是字符串,还有一个 XORing,这样愚蠢的代理就不会被混淆。 @SteffenUllrich - 至于 2)我知道额外的框架(我是 Iodine、Plezi's websocket 和 HTTP 服务器的作者)......但是不再有任何超文本传输协议(即请求->响应),因此我们将 HTTP 抛在脑后,使用 TCP/IP 上的 websocket 协议(即框架和掩码)进行通信。从 HTTP 升级到 HTTP/2 (htc) 或使用 ALPN 时也是如此——我们将旧协议抛在脑后,转而使用新协议。因此,它不再是 HTTP,尽管它是相同的 TCP/IP 连接。

http的keep-alive和tcp的keepalive区别

...:http://blog.csdn.net/oceanperfect/article/details/51064574 1、HTTPKeep-Alive在http早期,每个http请求都要求打开一个tpcsocket连接,并且使用一次之后就断开这个tcp连接。使用keep-alive可以改善这种状态,即在一次TCP连接中可以持续发送多份... 查看详情

使用 HTTP keep-alive 和 websockets (socket.io) 时的 TCP 连接数

】使用HTTPkeep-alive和websockets(socket.io)时的TCP连接数【英文标题】:ThenumberofTCPconnectionswhenusingHTTPkeep-aliveandwebsockets(socket.io)【发布时间】:2016-03-2000:03:27【问题描述】:我已经实现了一个具有数据库驱动会话管理的成熟节点http服务... 查看详情

http协议keep-alive

Keep-Alive是什么?概观默认情况下,HTTP链接通常在请求完成之后关闭。这意味着服务端在完成响应的交付之后便关闭了TCP链接。为了让链接保持打开,来满足多请求,可以使用keep-alive头信息。没有Keep-Alive的情况下,HTTP是怎么工... 查看详情

有关http可不可以在服务器端设置是不是支持keep-alive

参考技术A一、什么是keep-alive模式我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-A... 查看详情

http协议的keep-alive模式

...看到里面的请求头部和响应头部都有一个key-valueConnection:Keep-Alive,这个键值对的作用是让HTTP保持连接状态,因为HTTP协议采用“请求-应答”模式,当使用普通模式,即非Keep-Alive模式时,每个请求/应答客户和服务器都要新建一个... 查看详情

解决keep-alive和close不能使用此属性设置

http://www.hejingzong.cn/blog/viewblog_86.aspx Keep-Alive和Close不能使用此属性设置 public static void SetHeaderValue(WebHeaderCollection header, string name, string& 查看详情

http------connection为close和keep-alive的区别

keep-alive和close这个要从TCP握手讲起HTTP请求是基于TCP连接的,TCP的请求会包含(三次握手,中间请求,四次挥手)在HTTP/1.0时代,一个HTTP请求就要三次握手和四次挥手,当一个网页中包含大量的图片或者其它外部资源时,加载一... 查看详情

http长连接和短连接及应用情景(代码片段)

...连接性.使用长连接的HTTP协议,会在请求头部加入connection:keep-alive.在使用长连接时,当完成一次任务后,客户端和服务器之间的连接不会关闭,当客户端再次访问该服务器时,会继续使用这条已建立的连接.但是长连接不是永久地保持连... 查看详情

http协议

...长连接的HTTP协议,会在响应头有加入这行代码:Connection:keep-alive在使 查看详情

长连接和短连接

...长连接的HTTP协议,会在响应头有加入这行代码:Connection:keep-alive在使用长连接的情况下,当一 查看详情

http长连接

...1.1中默认开启长连接的,会在Requsethead中设置Connection值为Keep-Alive,同时,返回的RequestHead中也会设置Connection值为Keep-Alive。如果要在HTTP1.1之前的HTTP版本中使用长连接,需要手动设置RequestHead和ResponseHead的Connection为Keep-Alive。如果... 查看详情

短连接长连接与keep-alive

短连接与长连接通俗来讲,浏览器和服务器每进行一次通信,就建立一次连接,任务结束就中断连接,即短连接。相反地,假如通信结束(如完成了某个HTML文件的信息获取)后保持连接则为长连接。在HTTP/1.0中,默认使用短连接... 查看详情

Tomcat、HTTP Keep-Alive 和 Java 的 HttpsUrlConnection

】Tomcat、HTTPKeep-Alive和Java的HttpsUrlConnection【英文标题】:Tomcat,HTTPKeep-AliveandJava\'sHttpsUrlConnection【发布时间】:2012-01-2607:41:18【问题描述】:我有两台Tomcat服务器,它们需要保持持久连接以减少SSL握手。一台服务器(代理)位于DM... 查看详情

http长连接短连接使用及测试

...。设置HTTP长连接,有过期时间在首部字段中设置Connection:keep-alive 和Keep-Alive:timeout=60 查看详情

http长连接短连接使用及测试

...。设置HTTP长连接,有过期时间在首部字段中设置Connection:keep-alive 和Keep-Alive:timeout=60,表明连接建立之后,空闲时间超过60秒之后,就会失效。如果在空闲第58秒时,再次使用此连接,则连 查看详情

图解http(代码片段)

...个请求。为了复用连接,使用一个非标准字段:Connection:keep-alive,但这样并不保险。HTTP/1.0为每一次HTTP的请求/响应建立一条新的TCP链接,因此一个包含HTML内容和图片的页面将需要建立多次的短期的TCP链接。一次TCP链接的建立将... 查看详情

HTTP 保持活动状态和 TCP 保持活动状态

...端是死的还是活的?【问题讨论】:【参考方案1】:HTTPKeep-Alive是HTTP协议的一个特性。实现Keep-Alive功能的Web服务器必须定期检 查看详情

httpkeep-alive模式

 1、什么是Keep-Alive模式?我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive... 查看详情