http2 TCP 连接何时关闭?

Posted

技术标签:

【中文标题】http2 TCP 连接何时关闭?【英文标题】:When does a http2 TCP connection close? 【发布时间】:2018-06-14 21:18:27 【问题描述】:

我了解http2使用一个tcp连接来服务多个请求,例如,如果我请求包含a.css和a.js的index.html,这三个请求将在一个tcp连接中完成。

如果用户点击 index2.html 会发生什么?此请求是否仍使用相同的先前 tcp 连接?如果是这样,浏览器是否会保持连接打开,直到用户关闭浏览器?而在服务器端,服务器是否一直保持许多连接打开?

【问题讨论】:

【参考方案1】:

使用 HTTP/2 时,浏览器通常只为每个域打开一个连接。

在您的示例中,index2.html 将在用于index.htmla.cssa.js 的同一 TCP 连接上发送。

在 HTTP/2 中,请求被多路复用在同一个 TCP 连接上,因此浏览器可以同时发送它们,而无需等待之前的请求得到响应。

浏览器和服务器都有 TCP 连接的空闲超时。 如果连接空闲足够长的时间,它将被任何一方关闭 - 空闲超时较短的一方,以节省资源。 例如,您可以打开到wikipedia.org 的连接,执行一些请求,然后离开该选项卡并处理其他事情。 一段时间后(通常为 30 秒),浏览器将关闭与wikipedia.org 的 TCP 连接。

在服务器端,服务器将保持来自各个客户端的连接打开,直到它们被客户端关闭或服务器端空闲超时触发,此时是服务器发起关闭 TCP连接。

使用 HTTP/2,服务器必须维护的连接数大大少于使用 HTTP/1.1。 使用 HTTP/2,服务器必须为每个客户端维护 1 个 TCP 连接;对于 HTTP/1.1,服务器通常必须为每个客户端维护 2-8 个 TCP 连接。

【讨论】:

如果它只需要维护 1 个 TCP 连接,它与 HTTP/1.1 keep-alive 有何不同?如果它只使用 1 个 TCP 连接,为什么不使用 web-sockets 呢?我认为使用 web-sockets 时服务器的要求和限制是相同的。在这两种情况下,服务器都必须为每个客户端维护 1 个连接。 对于 MPA 应用程序,HTTP 的请求/响应模型可能就足够了。但对于需要一些实时功能且无需轮询的 SPA 应用程序,我认为 web-sockets 会是更好的选择吗? HTTP/2 维护 一个 多路连接,而 HTTP/1.1 维护 许多 个双路连接。 WebSocket 只是一个框架协议,并没有像 HTTP 那样的任何语义。例如,PUT /contracts/1 HTTP/1.1 + Content-Encoding: gzip 告诉服务器很多关于请求的信息。要在 WebSocket 之上重建相同的信息,您基本上必须在 WebSocket 之上重新发明 HTTP 协议。 WebSocket 可能在某些情况下工作,但对于许多其他情况,HTTP 是更好的选择,因为它具有更高级别的语义(在 WebSocket 中完全没有)。 忽略语义,只谈论服务器上的传输和负载(更昂贵)。 “对于 SPA 应用程序,我认为使用 Web 套接字比 HTTP 更好。”您必须解释原因(您仍然需要在 WebSocket 之上构建另一个协议)并提供基准。鉴于当前类似 REST 的服务器端应用程序以及通过 javascript 框架在浏览器上支持 REST,对于 SPA 应用程序,HTTP 可能是更好的选择。当您的应用程序需要将服务器端事件传递给客户端时,WebSocket 会大放异彩,但这通常不是常见的要求。

以上是关于http2 TCP 连接何时关闭?的主要内容,如果未能解决你的问题,请参考以下文章

Go: HTTP何时才会复用TCP 连接

HTTP 2.0 - 1 个 TCP/IP 连接与 6 个并行

http2多路复用

Linux中TCP通信中 send函数 如何判断 何时断开连接了

揭秘http2

http2.0和http1.1的区别