浏览器http请求引发的思考

  1. 起因

我们都知道http请求基于tcp协议,那么浏览器处理页面上的 图片,ajax请求时,是同时建立多个tcp协议还是一个tcp协议重复使用

  1. 问题

  2. 问题1 :

浏览器是否有线程池的概念,维护针对一个服务器的tcp协议线程池,当页面请求多的时候并发调用。维护tcp线程池是双向的服务器同样也需要维护,那服务器不同意怎么办?

  1. 问题2 :

一个tcp链接处理http请求时,可以并发处理么,比如同时传5个请求,等待五个请求返回 。

  1. 说说结论

问题1 :

  1. 常用浏览器都有tcp协议线程池的概念,他们不会无限制增加tcp线程池,不同浏览器设置了不同的上限,针对一个服务器建立的tcp链接的数量。
  2. http/1.0 协议中没有对 建立连接tcp保持连接进行设定,所以每次发完http请求后断开链接,下一个请求重新建立,中间开销极大。 所以http/1.1 协议header中支持Connection ,默认支持将tcp协议维护一段时间,除非有请求头中写明 Connection: close

证明:

image
image

这是通过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 来解决问题,简单来说协议内容就是 客户端按照顺序写入请求,服务器按照顺序返回

那浏览器一般不支持的原因是什么呢:

  1. 并不是所有的请求都是通过浏览器直达服务器,一部分代理服务器对Pipelining支持不友好

  2. 你同一个tcp 并发 多个请求,在服务端也会挨个处理,假设一个请求被阻塞时,同期发送的tcp请求就会被阻塞。

那就没办法了?

其实 使用http/1.1 协议不行的话,我们可以使用http2 协议

当然http2 协议是建立在https 协议的基础上,如果你的http协议访问,就没办法了。

相对于http/1.1协议 使用文本格式, http2 协议引入了数据流和帧的概念, 简单来说就是压缩了请求体,对每个请求体进行了编号也就是(帧) ,返回的数据可以根据(帧)来判断是哪个请求 (Multiplexing 多路传输特性)

可以想象 并发对页面加载速度的提升是很显著的:

做个简单的计算,

....算了不计算了 大体就是并发效率高

浏览器发现有大量的https的图片请求时,发起tcp链接前会先询问一下是否支持http2,如果不支持,就走http/1.1协议。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容