http2的出现主要是为了解决http1中存在的问题,http1中存在的问题如下:
- 线头阻塞:http1在当初设计的时候,单个TCP连接上只能发送一个请求,在前面的请求未完成之前,后序的请求只能排队等待
- 多个TCP连接:虽然HTTP1.1中出现了管线化可以支持请求的并发,但是建立TCP连接的成本还是很高的,每次TCP的连接都需要经过3次握手,每次TCP的连接断开都需要经过4次挥手。
- 头部字段冗余:HTTP1.X版本采用文本格式,首部未压缩,而且每个请求都会带上cookie, user-agent等完全相同的首部字段
- 客户端需要主动请求,服务器端才会将相关的资源返回给客户端
http2的新技术
- 二进制分帧层
http2性能提升的核心就在于二进制分帧层。HTTP2采用的是二进制协议,它采用二进制格式传输数据而不是文本格式。2.0把响应划分为两个帧,HEADERS
和DATA
,也就是说一条HTTP响应划分成两个帧来传输,并且采用二进制编码。
三个基本概念
- 流:已建立的TCP连接上的双向字节流,可以承载一个或者多个消息
- 消息:一个完整的HTTP请求或者响应,由一个或者多个帧组成。特定消息的帧在同一个流内发送。这意味着一个HTTP请求或者响应只能在一个流内发送
- 帧:通信的基本单位
多路复用
上面提到HTTP1.1的线头阻塞和多个TCP连接的问题,多路复用可以完美解决。HTTP2让所有的通信都在一个TCP连接上完成,真正的实现了请求的并发。
头部压缩
头部压缩在浏览器和服务器之间:
- 维护一份相同的静态字典,包含常见的头部名称,以及常见的头部名称和值的组合
- 维护一份相同的动态字典,可以动态添加内容
- 通过静态
Huffman
编码对传输的首部字段进行编码
使用HTTP2第一次请求是,头部字段的内容会HPACK之后,被传给服务器端。第二次就不会传递这一部分实体内容,只会传递相应的头部字段
服务器端推送
客户端请求一个文件,服务器端会对这个文件进行分析,主动推送到客户端的缓存,当客户端收到原始网页的请求时,它需要的资源已经位于缓存中