http1和2的区别
http1.1 之前有什么问题
没有 keep-alive 只能创建多个 Tcp 连接来做多次请求。一次请求完成就会关闭本次的 Tcp 连接,下个请求又要从新建立 Tcp 连接传输完成数据再关闭,造成很大的性能损耗。

http1.1 解决了什么问题
加入了 KeepAlive
解决的核心问题是: 一定时间内,同一域名多次请求数据,只建立一次 HTTP 请求,其他请求可复用每一次建立的连接通道,以达到提高请求效率的问题。

Keep-Alive 还是存在如下问题:
- 串行的文件传输。
- 同域并行请求限制带来的阻塞(6~8)个
管线化
HTTP 管线化可以克服同域并行请求限制带来的阻塞,它是建立在持久连接之上,是把所有请求一并发给服务器,但是服务器需要按照顺序一个一个响应,而不是等到一个响应回来才能发下一个请求,这样就节省了很多请求到服务器的时间。不过,HTTP 管线化仍旧有阻塞的问题,若上一响应迟迟不回,后面的响应都会被阻塞到。

http2 解决了什么问题
通过多路复用代替原来的序列和阻塞机制。就是所有请求的都是通过一个 TCP 连接并发完成。因为在多路复用之前所有的传输是基于基础文本的,在多路复用中是基于二进制数据帧的传输、消息、流,所以可以做到乱序的传输。多路复用对同一域名下所有请求都是基于流,所以不存在同域并行的阻塞。多次请求如下图:

总结
在 HTTP/2 中,有两个非常重要的概念,分别是帧(frame)和流(stream)。
帧代表着最小的数据单位,每个帧会标识出该帧属于哪个流,流也就是多个帧组成的数据流。
HTTP2 采用二进制数据帧传输,取代了 HTTP1.x 的文本格式,二进制格式解析更高效。
多路复用代替了 HTTP1.x 的序列和阻塞机制,所有的相同域名请求都通过同一个 TCP 连接并发完成。同一 Tcp 中可以发送多个请求,对端可以通过帧中的标识知道属于哪个请求。通过这个技术,可以避免 HTTP 旧版本中的队头阻塞问题,极大的提高传输性能。
HTTP/1.x 只能在一个 TCP 连接上发送一个 HTTP 请求(HTTP/1.1 支持 pipeline,可以发送多个 HTTP 请求,但是这些请求的生命期不能重叠,即只能串行执行,需要区别客户端和服务器角色的本质,且一般服务器会限制 pipeline 的 HTTP 请求个数),HTTP/2.0 理论上可以在一个 TCP 连接上发送无数个 HTTP 请求,而这些 HTTP 请求在浏览器看来,只是一个连接,所以避免了同源并发个数限制的问题。