Http 1.0的致命缺点:
无法复用
TCP连接和并行发送请求,这样每次一个请求都需要三次握手,而且其实建立连接和释放连接的这个过程是最耗时的,传输数据相反却不那么耗时。不支持文件断点续传。
本地时间被修改导致响应头
expires的缓存机制失效的问题。
HTTP1.1继承了HTTP1.0的简单,克服了HTTP1.0性能上的问题。
HTTP1.1也是当前使用最为广泛的HTTP协议
Http 1.1的致命缺点:
我们也可以用
dns-prefetch和 preconnect tcp来优化~
<link rel="preconnect" href="//example.com" crossorigin>
<link rel="dns=prefetch" href="//example.com">
Tip: webpack可以做任何事情,这些都可以用插件实现相较于HTTP1.1,HTTP2.0的主要优点有:
- 采用二进制帧封装
- 传输变成多路复用
- 流量控制算法优化
- 服务器端推送
- 首部压缩
- 优先级
1、 二进制帧封装 / 二进制分帧
HTTP1.x的解析是基于文本的,基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多。
而HTTP2.0会将所有传输的信息分割为更小的消息和帧,然后采用二进制的格式进行编码,HTTP1.x的头部信息会被封装到HEADER frame(单独成帧,不再在后续数据传输中携带),而相应的RequestBody则封装到DATAframe里面。
不改动HTTP的语义,使用二进制编码,实现方便且健壮。
2、 多路复用 && 优先级
所有的请求都是通过一个 TCP 连接并发完成。
HTTP/1.x 虽然通过 pipeline 也能并发请求,但是多个请求之间的响应会被阻塞的,所以 pipeline 至今也没有被普及应用,而 HTTP/2 做到了真正的并发请求。
同时,流还支持优先级和流量控制。当流并发时,就会涉及到流的优先级和依赖。
即:HTTP2.0对于同一域名下所有请求都是基于流的,不管对于同一域名访问多少文件,也只建立一路连接。优先级高的流会被优先发送和响应。图片请求的优先级要低于 CSS 和 SCRIPT,这个设计可以确保重要的东西可以被优先加载完(相较HTTP1.1,响应不再死板的按照请求顺序返回,而是根据流中请求数据的优先级响应)。
3、 流量控制
TCP协议通过sliding window(滑动窗口)的算法来做流量控制。
发送方有个sending window,接收方有receive window。http2.0的flow control是类似receive window的做法,数据的接收方通过告知对方自己的flow window大小表明自己还能接收多少数据。
只有Data类型的frame才有flow control的功能。对于flow control,如果接收方在flow window为零的情况下依然更多的frame,则会返回block类型的frame,这种场景一般表明http2.0的部署出了问题。
4、 服务器端推送
服务端推送是一种在客户端请求之前发送数据的机制。可以做到(客户端的)缓存。
服务器端的推送,就是服务器可以对一个客户端请求发送多个响应。
除了对最初请求的响应外,服务器还可以额外向客户端推送资源,而无需客户端明确地请求。 当浏览器请求一个html,服务器其实大概知道你是接下来要请求资源了,而不需要等待浏览器得到html后解析页面再发送资源请求。
5、 首部压缩
HTTP 2.0 在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键-值对,对于相同的数据,不再通过每次请求和响应发送;
通信期间几乎不会改变的通用键-值对(用户代理、可接受的媒体类型,等等)只需发送一次。事实上,如果请求中不包含首部(例如对同一资源的轮询请求),那么 首部开销就是零字节。此时所有首部都自动使用之前请求发送的首部。
如果首部发生变化了,那么只需要发送变化了数据在Headers帧里面,新增或修改的首部帧会被追加到“首部表”。首部表在 HTTP 2.0 的连接存续期内始终存在,由客户端和服务器共同渐进地更新 。
本质上是为了减少请求,通过多个js或css合并成一个文件,多张小图片拼合成Sprite图,可以让多个HTTP请求减少为一个,减少额外的协议开销,而提升性能。
当然,一个HTTP的请求的body太大也是不合理的,有个度。文件的合并也会牺牲模块化和缓存粒度,可以把“稳定”的代码or 小图 合并为一个文件or一张Sprite,让其充分地缓存起来,从而区分开迭代快的文件。
HTTP/1.1并不支持 HTTP 首部压缩,为此 SPDY 和 HTTP/2 应运而生, SPDY 使用的是通用的DEFLATE 算法,而 HTTP/2 则使用了专门为首部压缩而设计的 HPACK 算法。