# 特性

三大特性:头部压缩、Server Push、多路复用

# 二进制分帧

二进制分帧就是将一条连接上所有传输的信息,分割为更小的信息和帧,并对他们采用二进制格式编码,首部信息放在Headers帧中,主体信息被封装在Data帧中。

  1. 为什么Http2.0可以对所有的内容进行二进制转换? 因为二进制分帧层在应用层和传输层之间的中间层,所有信息都会经过,进而可以转换。

  2. 为什么要用二进制? 因为效率更高,计算机更青睐二进制数

# 多路复用

多路复用技术就是可以并发发送请求,而且无需等待相应返回的一种技术,消除了不必要的延迟,减少了页面加载时间。

多路复用为了解决http1.1的两个问题:串行的文件传输连接数过多

  • 解决第一个问题:在http1.1的协议中,我们传输的requestresponse都是基于文本的,这样就会引发一个问题:所有的数据必须按顺序传输,比如传输:hello world,只能从hd一个一个的传输,不能并行传输,因为接收端并不知道这些字符的顺序,所以并行传输在Http1.1中无法实现

Http2引入的二进制数据帧和流的概念后,其中对数据进行顺序标识,如下图所示,这样浏览器收到数据后,就可以按照序列对数据进行合并,而不会出现合并后数据错乱的情况。同样是因为有了序列,服务器就可以并行的传输数据,这就是所做的事情。

  • 解决第二个问题:http2对同一域名下所有的请求都是基于,也就是说统一域名不管访问多少文件,也只建立一路连接。同样Apache的最大连接数为300,因为有了这个特性,最大的并发就可以提升到300,比原来50提升了6倍(浏览器最大请求连接数为6)。

# 首部压缩

在第一次请求之后,大部分的字段可以复用的。而且随着页面越来越复杂,同一个页面发出的请求会越来越多,如果首部不压缩的话,会造成很大的流量开销。

  1. 首部压缩原理: 浏览器和服务器会维护相同的静态表和动态表,以及内置一个霍夫曼编码表。静态表存储的是常见的一些头部,和一些常见的头部键值对。动态表开始是空的,如果头部命中静态表中的名称,那么就会将这份键值对存入动态表中,之后的请求首部命中了该键值对,则只需要一个字节就能表示。

# 服务器推送 Server Push

当推送资源时,我们能获得与内联相同的性能提升,同时保持资源的外链形式,从而有独立的缓存策略。