http2 TCP连接何时关闭?

23

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

如果用户点击 index2.html 会发生什么?这个请求仍然使用之前的同一个 TCP 连接吗?如果是,浏览器会一直保持连接直到用户关闭浏览器吗?在服务器端,服务器是否一直保持着很多连接处于打开状态呢?

2个回答

30

当使用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连接。


如果只需维护一个TCP连接,它与HTTP/1.1 keep-alive有何不同?如果只使用一个TCP连接,为什么不使用WebSockets呢?我认为在使用WebSockets时,服务器的要求和限制将是相等的。在两种情况下,服务器都必须维护每个客户端的单个连接。 - Konrad
对于MPA应用程序,HTTP的请求/响应模型可能足够。但是对于想要一些实时功能而且不需要轮询的SPA应用程序,我认为Websockets会是更好的选择。 - Konrad
5
HTTP/2通过维护一个多路复用连接,而HTTP/1.1则维护了多个双工连接。WebSocket只是一个封装协议,并没有像HTTP一样的语义层。例如,“PUT /contracts/1 HTTP/1.1” + “Content-Encoding: gzip”向服务器传递了很多关于请求的信息。如果要在WebSocket上重建相同的信息,您基本上需要在WebSocket之上重新发明HTTP协议。WebSocket可能在某些情况下可行,但对于许多其他情况来说,由于其高级语义(WebSocket完全缺失),HTTP是更好的选择。 - sbordet
对于SPA应用程序,我认为使用Web套接字比HTTP更好。但是HTTP仍然更适合浏览器需要显示和/或下载的任何内容,例如图像,因为它提供了诸如“content-type”等标题。 - Konrad
2
对于SPA应用程序,我认为使用Web套接字比HTTP更好。这是因为WebSocket上还可以构建另一种协议,并提供基准测试。鉴于当前REST类似的服务器端应用程序和JavaScript框架通过浏览器支持REST,对于SPA应用程序,HTTP可能是更好的选择。当您的应用程序需要将服务器端事件传递到客户端时,WebSocket会发挥作用,但这通常不是常见要求。 - sbordet
显示剩余3条评论

0

如果用户点击index2.html会发生什么?这个请求是否仍然使用相同的先前TCP连接?

是的。此外,多个浏览器选项卡/窗口也共享一个HTTP/2连接。

如果是这样,浏览器会一直保持连接直到用户关闭浏览器吗?

以下来自RFC-连接管理

为了获得最佳性能,期望客户端不会关闭连接,直到确定不再需要与服务器进行通信(例如,当用户从特定网页导航到其他页面时),或者直到服务器关闭连接。客户端不应该向给定的主机和端口对打开多个HTTP/2连接。

在服务器端,服务器是否一直保持许多连接处于打开状态?

服务器鼓励尽可能保持开放连接,但如果必要,可以终止空闲连接。当任一端点选择关闭传输层TCP连接时,终止端点应首先发送GOAWAY(第6.8节)帧,以便两个端点可靠地确定之前发送的帧是否已被处理,并优雅地完成或终止任何必要的剩余任务。
有关连接错误的更多信息,请参见以下链接: RFC connection-error-handling 连接错误是指防止帧层进一步处理或破坏任何连接状态的错误。遇到连接错误的端点应首先发送一个包含成功接收自其对等方的最后一个流的流标识符的GOAWAY帧。 GOAWAY帧包括指示连接终止原因的错误代码。在为错误条件发送GOAWAY帧之后,端点必须关闭TCP连接。GOAWAY可能无法被接收端点可靠地接收。如果发生连接错误,则GOAWAY只提供尽力与对等方沟通连接终止原因的机会。
端点可以随时结束连接。特别是,端点可以选择将流错误视为连接错误。当结束连接时,端点应在情况允许的情况下发送GOAWAY帧。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接