### HTTP1.1 协议不足
- 同一时间，一个连接只能对应一个请求
- 只允许客户端主动发起连接
- 同一个会话的多次请求中，头信息会被重复传输

### SPDY
- 基于TCP的应用层协议，强制使用TLS/SSL
- 修改了HTTP请求与响应的传输方式
- SPDY是HTTP2的前身

### HTTP2
- 底层传输做了优化和改进，在语意上完全兼容HTTP1.1
- HTTP2采用了二进制传输，而HTTP1.1采用了文本传输

### HTTP2常用概念
#### 数据流
- 已建立的连接的双向字节流，可以承载一条或多条消息
- 所有通信都在一个TCP连接上完成，此连接可以承载任意数量的双向数据流

#### 消息
- 与逻辑HTTP请求或响应消息对应，由一系列帧组成

#### 帧
- HTTP2通信的最小单位，每个帧都包含帧头，标识出当前帧所属的数据流
- 来自不同数据流的帧可以交错发送，然后再根据每个帧头的数据流标识符重新组装

#### 多路复用 Multiplexing
- 客户端和服务端可以将消息分解成互不依赖的帧，交错发送，然后收到后重新组装起来
- 并行交错发送多个请求，请求之间互不影响
- 并行交错发送多个响应，响应之间互不影响
- 使用一个连接发送请求和响应

![](https://blog-heysq-1255479807.cos.ap-beijing.myqcloud.com/blog/wiki/http/http1_2.png)

#### 优先级
- HTTP2允许每个数据流有一个权重和优先级
- 客户端可以设置每个优先级
- 服务端根据优先级进行响应，高优先级的优先传输给客户端

#### 头部压缩
- 使用HPACK压缩请求头和响应头
- 减少开销，提高性能

#### 服务器推送 Server Push
- 服务器除了响应客户端的需求外，还可以主动推送内容给客户端

### HTTP2问题
- 队头阻塞
- 握手延迟