【发布时间】:2018-06-14 21:18:27
【问题描述】:
我了解http2使用一个tcp连接来服务多个请求,例如,如果我请求包含a.css和a.js的index.html,这三个请求将在一个tcp连接中完成。
如果用户点击 index2.html 会发生什么?此请求是否仍使用相同的先前 tcp 连接?如果是这样,浏览器是否会保持连接打开,直到用户关闭浏览器?而在服务器端,服务器是否一直保持许多连接打开?
【问题讨论】:
我了解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 连接。
【讨论】:
PUT /contracts/1 HTTP/1.1 + Content-Encoding: gzip 告诉服务器很多关于请求的信息。要在 WebSocket 之上重建相同的信息,您基本上必须在 WebSocket 之上重新发明 HTTP 协议。 WebSocket 可能在某些情况下工作,但对于许多其他情况,HTTP 是更好的选择,因为它具有更高级别的语义(在 WebSocket 中完全没有)。