现代浏览器与服务器建立了tcp连接后是否会在一个HTTP请求完成后断开?什么情况下会断开?
在http/1.0中,一个服务器发送完一个http响应之后,会断开tcp连接。但是每次请求都会重新建立和断开tcp连接。代价很大。所以虽然标准中没有设定,某些服务器对connection:keep-alive的header进行了支持,意思是说,完成http请求之后不要断开http请求使用的tcp连接。好处是连接可以被重新使用,不需要建立tcp连接,如果维持连接,SSL的开销也可以避免。
既然维持tcp连接这么好,http/1.1就把connection头写进了标准,并且默认开启持久连接。除非请求中写明Connection:close.否则浏览器和服务器之间会维持一段时间的tcp连接,不会一个请求结束就断开。
一个tcp连接可以对应几个http请求?
如果维持连接,一个tcp连接可以发送多个http请求。
一个tcp连接中的http请求发送可以一起发送吗?一起发送三个请求,然后一起接受三个请求?
http/1.1存在一个问题,单个tcp连接同一时刻只能处理一个请求,两个请求的生命周期不能重叠,任意两个http请求从开始到结束的时间在同一个tcp连接里面不能有重叠。虽然有http pipelining, 但是这个功能浏览器里面默认是关闭的。
为什么刷新网页不需要重新建立ssl连接?
因为tcp连接会被维持一段时间,tcp不需要重新建立,ssl就会使用之前的。
浏览器对于同一host建立的tcp连接到数量有没有限制。
是有的,开太多电脑受不了,而且服务器也受不了。chrome最多允许对同一host建立6个tcp连接。
如果收到的html包含十几个图片标签,这些图片是以什么方式,什么顺序,建立多少连接,使用什么协议被下载下来的?
如果图片是https连接并且在同一个域名下,浏览器ssl握手之后就会和服务器商量能不能用http2. 如果能,就会使用multiplexing功能在这个连接上进行多路传输。不一定所有挂在这个域名的资源都会通过tcp连接去获取,但是multiplexing是可能被用到的。
如果用不了http2, 或者用不了https.浏览器就会在一个host上建立多个tcp连接,连接数量的最大限制取决于浏览器设置,这些连接在空闲的时候就会被浏览器用来发送新的请求,如果所有的连接都在发送请求,那就只能等着了。
参考:
https://mp.weixin.qq.com/s/FADmUspxZdbIvUbWLVnRSw
怎么用起来?
首先得安装nginx(version>=1.10.0) openssl(version>=1.0.2)
具体可以参考 https://zhuanlan.zhihu.com/p/29609078
因为http2.0基于https, 可以参考 https://blog.csdn.net/funnyPython/article/details/94437232 完成对https的配置
最后是配置http2.0
推荐一个chrome工具
HTTP/2 and SPDY indicator
可以用于检测当前的网站是否支持http2.0 如果支持,会显示蓝色