我了解 http2 使用一个 TCP 连接来服务于多个请求,例如,如果我请求包含 a.css 和 a.js 的 index.html,这三个请求将在一个 TCP 连接中完成。
如果用户点击 index2.html 会发生什么?这个请求仍然使用之前的同一个 TCP 连接吗?如果是,浏览器会一直保持连接直到用户关闭浏览器吗?在服务器端,服务器是否一直保持着很多连接处于打开状态呢?
当使用HTTP/2时,浏览器通常仅针对每个域名打开一个连接。
在您的示例中,index2.html
将通过用于index.html
、a.css
和a.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连接。
如果用户点击index2.html会发生什么?这个请求是否仍然使用相同的先前TCP连接?
是的。此外,多个浏览器选项卡/窗口也共享一个HTTP/2连接。
如果是这样,浏览器会一直保持连接直到用户关闭浏览器吗?
为了获得最佳性能,期望客户端不会关闭连接,直到确定不再需要与服务器进行通信(例如,当用户从特定网页导航到其他页面时),或者直到服务器关闭连接。客户端不应该向给定的主机和端口对打开多个HTTP/2连接。
在服务器端,服务器是否一直保持许多连接处于打开状态?
服务器鼓励尽可能保持开放连接,但如果必要,可以终止空闲连接。当任一端点选择关闭传输层TCP连接时,终止端点应首先发送GOAWAY(第6.8节)帧,以便两个端点可靠地确定之前发送的帧是否已被处理,并优雅地完成或终止任何必要的剩余任务。