阅读本文大概需要 5 分钟。
现代浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开? 一个 TCP 连接可以对应几个 HTTP 请求? 一个 TCP 连接中 HTTP 请求发送可以一起发送么(比如一起发三个请求,再三个响应一起接收)? 为什么有的时候刷新页面不需要重新建立 SSL 连接? 浏览器对同一 Host 建立 TCP 连接到数量有没有限制?
第一个问题
第二个问题
第三个问题
A client that supports persistent connections MAY "pipeline" its requests (i.e., send multiple requests without waiting for each response). A server MUST send its responses to those requests in the same order that the requests were received. 一个支持持久连接的客户端可以在一个连接中发送多个请求(不需要等待任意请求的响应)。收到请求的服务器必须按照请求收到的顺序发送响应。
GET/query?q=A
和 GET/query?q=B
,服务器返回了两个结果,浏览器是没有办法根据响应结果来判断响应对应于哪一个请求的。一些代理服务器不能正确的处理 HTTP Pipelining。 正确的流水线实现是复杂的。 Head-of-line Blocking 连接头阻塞:在建立起一个 TCP 连接之后,假设客户端在这个连接连续向服务器发送了几个请求。按照标准,服务器应该按照收到请求的顺序返回结果,假设服务器在处理首个请求时花费了大量时间,那么后面所有的请求都需要等着首个请求结束才能响应。
维持和服务器已经建立的 TCP 连接,在同一连接上顺序处理多个请求。 和服务器建立多个 TCP 连接。