-
起因
我们都知道http请求基于tcp协议,那么浏览器处理页面上的 图片,ajax请求时,是同时建立多个tcp协议还是一个tcp协议重复使用
-
问题
问题1 :
浏览器是否有线程池的概念,维护针对一个服务器的tcp协议线程池,当页面请求多的时候并发调用。维护tcp线程池是双向的服务器同样也需要维护,那服务器不同意怎么办?
- 问题2 :
一个tcp链接处理http请求时,可以并发处理么,比如同时传5个请求,等待五个请求返回 。
-
说说结论
问题1 :
- 常用浏览器都有tcp协议线程池的概念,他们不会无限制增加tcp线程池,不同浏览器设置了不同的上限,针对一个服务器建立的tcp链接的数量。
- http/1.0 协议中没有对 建立连接tcp保持连接进行设定,所以每次发完http请求后断开链接,下一个请求重新建立,中间开销极大。 所以http/1.1 协议header中支持Connection ,默认支持将tcp协议维护一段时间,除非有请求头中写明 Connection: close
证明:
这是通过chrome两次 打开 (https://www.baidu.com/) 百度所使用的时间。可以看到第一次打开时,进行了dns解析,ssl 协议验证,以及有一个初始链接的情况,但是第二次没有,也就是说第二次访问的时候使用了建立好的tcp链接。
服务器如果不支持是什么样子的呢:
懒得实验了,有空再说
nginx不像apache,直接有指令keep-alive off/on;它使用的是keepalive_timeout [time],默认的时长为75,可以在http、server、location使用此指令。
问题2 :
浏览器一般是不支持请求周期重叠的,一个tcp链接只能处理一个请求,只能一个发送成功返回之后在发送另外一个。
但是1.1协议中也做了相应的努力 通过规定 Pipelining 来解决问题,简单来说协议内容就是 客户端按照顺序写入请求,服务器按照顺序返回
那浏览器一般不支持的原因是什么呢:
并不是所有的请求都是通过浏览器直达服务器,一部分代理服务器对Pipelining支持不友好
你同一个tcp 并发 多个请求,在服务端也会挨个处理,假设一个请求被阻塞时,同期发送的tcp请求就会被阻塞。
那就没办法了?
其实 使用http/1.1 协议不行的话,我们可以使用http2 协议
当然http2 协议是建立在https 协议的基础上,如果你的http协议访问,就没办法了。
相对于http/1.1协议 使用文本格式, http2 协议引入了数据流和帧的概念, 简单来说就是压缩了请求体,对每个请求体进行了编号也就是(帧) ,返回的数据可以根据(帧)来判断是哪个请求 (Multiplexing 多路传输特性)
可以想象 并发对页面加载速度的提升是很显著的:
做个简单的计算,
....算了不计算了 大体就是并发效率高
浏览器发现有大量的https的图片请求时,发起tcp链接前会先询问一下是否支持http2,如果不支持,就走http/1.1协议。