各版本特性
1. HTTP 1.0
- 支持 GET,POST,DELETE,PUT,HEADER 等方式
- 有请求头和响应头的概念,在通信中指定了 HTTP 协议版本号,以及其他的一些元信息(比如: 状态码、权限、缓存、内容编码)
- 传输内容格式,图片、音视频资源、二进制等都可以进行传输
问题
- 无法复用连接。每次发送请求,都需要进行一次 tcp 连接(即 3 次握手 4 次挥手),使得网络的利用率非常低
- 队头阻塞。HTTP 1.0 规定在前一个请求响应到达之后下一个请求才能发送,如果前一个阻塞,后面的请求也给阻塞的
2. HTTP 1.1
- 长连接。新增 Connection 字段,可以设置 keep-alive 值保持连接不断开
- 管道化。基于上面长连接的基础,管道化可以不等第一个请求响应继续发送后面的请求,但响应的顺序还是按照请求的顺序返回
- 缓存处理。新增字段 cache-control
问题
- 虽然管道化,可以一次发送多个请求,但是响应仍是顺序返回,仍然无法解决队头阻塞的问题
3. HTTP 2
- 头部压缩
- 二进制分帧
- 多路复用。在共享 TCP 链接的基础上同时发送请求和响应
- 服务器推送。服务器可以额外的向客户端推送资源,而无需客户端明确的请求
头部压缩
由于 HTTP 是无状态的,每一个请求都需要头部信息标识这次请求相关信息,所以会造成传输很多重复的信息,当请求数量增大的时候,消耗的资源就会慢慢积累上去。所以 HTTP 2 可以维护一个头部信息字典,差量进行更新头信息,减少头部信息传输占用的资源。
二进制分帧
HTTP 1.x 的解析是基于文本,HTTP 2 之后将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,提高传输效率
多路复用
在共享 TCP 链接的基础上同时发送请求和响应,基于二进制分帧,在同一域名下所有访问都是从同一个 tcp 连接中走,http 消息被分解为独立的帧,乱序发送,服务端根据标识符和首部将消息重新组装起来。