一个页面发出多个请求
【 如果维持链接,那么一个TCP连接是可以发送多个HTTP请求的】
HTTP/1.0:一个服务器在发送完一个HTTP响应后,会断开TCP链接,但是这样每次请求都会重新建立和断开TCP链接,代价较大。 某些服务器对Connection:keep-alive的Header进行了支持,也即连接可以被重新使用,之后发送HTTP请求的时候不需要重新建立TCP链接,SSL的开销也可以避免。
HTTP/1.1:把Connection头写进标准,并且默认开启持久连接,除非请求写明Connection:close。那么浏览器和服务器之间是会维持一段时间的TCP链接,不会请求结束就断掉连接。
但是单个TCP连接在 同一个时刻 只能 处理一个请求,两个请求的生命周期不能重叠,任意两个HTTP请求从开始到结束的时间在同一个TCP里不能重叠。 HTTP/1.1 规范中规定了Pipelining 来解决这个问题,但是这个功能在浏览器里默认关闭。
【Pipelining: 一个支持持久连接的客户端可以在一个连接中发送多个请求(不需要等待任意请求的响应)。收到请求的服务器必须按照请求收到的顺序发送响应 】 因为如果多个请求,服务器返回多个结果,浏览器没办法根据相应结果来判断响应对应哪个请求。
并且pipelining也有许多问题,所以很多浏览器默认不开启HTTP Pipelining : 1、一些代理服务器不能正确处理HTTP Pipelining 2、连接头阻塞,在建立起一个TCP连接之后,如果服务器在处理首个连接请求花费了大量时间,那么后面所有的请求都需要等着首个请求结束后才能响应
在 HTTP/1.1 时代,浏览器是如何提高页面加载效率的呢?主要有下面两点:
- 维持和服务器已经建立的 TCP 连接,在同一连接上顺序处理多个请求。
- 和服务器建立多个 TCP 连接。
(如果只开一个TCP连接,顺序下载,用户等待时间会太长; 如果建立过多TCP连接发送HTTP请求,那么电脑或服务器都可能承受不了【服务器也有TCP最大连接数设置】) 所以浏览器对于同一Host 可以建立多个TCP连接(比如Chrome最多允许对同一个Host建立6个TCP连接),这些连接会在空闲的时候被浏览器用来发送新的请求,如果所有的连接都正在发送请求呢?那其他的请求就只能等待。
HTTP/2.0:HTTP2是在HTTPS上实现的,提供了Multiplexing多路传输特性,可以在一个TCP连接中同时完成多个HTTP请求,也即多个HTTP请求可以在同一个TCP连接中并行进行。不过未必所有挂在这个域名的资源都会用同一个TCP连接去获取。
转自:https://zhuanlan.zhihu.com/p/61423830
所以有的时候刷新页面不需要重新建立SSL连接:
因为TCP连接有的时候会被浏览器和服务端维持一段时间,TCP不需要重新连接,那么SSL自然也会用之前的。
收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建立了多少连接、使用什么协议被下载下来的呢
如果图片都是HTTPS连接并且在同一个域名下,那么浏览器在SSL握手之后会和服务器商量能不能用HTTP2,如果能的话就使用Multiplexing功能在这个连接上进行多路传输,不过也未必所有挂在这个域名的资源都会使用同一个TCP连接去获取,但是Multiplexing很可能会被用到。
如果发现用不了HTTP2,或者连HTTPS都用不上,那么浏览器就会在一个Host上建立多个TCP连接,连接数量最大限制取决于浏览器设置,这些连接会在空闲的时候被浏览器用来发送新的请求,如果所有连接都正在发送请求呢?那其他的请求就只能等等了

浙公网安备 33010602011771号