- 多路复用
- 修改了http的数据格式(分帧), 二进制格式
- 服务端主动推送
- header压缩
- 请求优先级的指定
新的二进制格式
在应用层和传输层之间增加了一个二进制分帧层。
在分帧层中,会将传输的信息分割成更小的消息和帧,并采用二进制格式进行编码。在http1.x中的头部信息会被封装到HEADER frame,而相应的Request Body则封装到DATA frame 中。
关于http2.0中的三个概念如下:
- 数据流:已建立的连接内的双向字节流,可以承载一条或多条消息。
- 消息:与逻辑请求或响应消息对应的完整的一系列帧。
- 帧:HTTP/2 通信的最小单位,每个帧都包含帧头,至少也会标识出当前帧所属的数据流。
这些概念总结如下:
- 所有通信都在一个 TCP 连接上完成,此连接可以承载任意数量的双向数据流。
- 每个数据流都有一个唯一的标识符和可选的优先级信息,用于承载双向消息。
- 每条消息都是一条逻辑 HTTP 消息(例如请求或响应),包含一个或多个帧。
- 帧是最小的通信单位,承载着特定类型的数据,例如 HTTP 标头、消息负载,等等。 来自不同数据流的帧可以交错发送,然后再根据每个帧头的数据流标识符重新组装。
HTTP1.x 中,是基于文本协议的格式的。文本的表现形式有很多种,但是很难做到健壮
HTTP的性能优化主要是因为低延迟,HTTP/2可以让通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。
HTTP/2 中的新二进制分帧层解决了 HTTP/1.x 中存在的队首阻塞问题,也消除了并行处理和发送请求及响应时对多个连接的依赖。结果,应用速度更快、开发更简单、部署成本更低。
多路复用
影响一个网络请求的因素主要有两个,带宽和延迟。今天的网络基础建设已经使得带宽得到极大的提升,大部分时候都是延迟在影响响应速度。http1.0被抱怨最多的就是连接无法复用,和head of line blocking这两个问题。理解这两个问题有一个十分重要的前提:客户端是依据域名来向服务器建立连接,一般PC端浏览器会针对单个域名的server同时建立6~8个连接,手机端的连接数则一般控制在4~6个。显然连接数并不是越多越好,资源开销和整体延迟都会随之增大。
连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大。
多路复用即每一个request都是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个request可以随机的混杂在一起,接收方可以根据request的id将request再归属到各自不同的服务端请求里面。
多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。
总结:
- 但连接多资源的方式,减少服务端的链接压力,内存占用更少,连接吞吐量更大
- 由于TCP连接的减少而是网络拥塞状况得到改善
表现如下:
- 并行交错地发送多个请求,请求之间互不影响。
- 并行交错地发送多个响应,响应之间互不干扰。
- 使用一个连接并行发送多个请求和响应
- 消除不必要的延迟和提高现有网络容量的利用率,从而减少页面加载时间。
header压缩
因为http中头部信息带有大量信息,而且每次都是重复发送的,所以使用encoder来减少需要传送的header的大小,并且通讯双方都会保存一份header fields,这样就避免了header的传输,也减少了需要传输的大小。
服务端推送
服务端推送是一种在客户端请求之前发送数据的机制。在 HTTP/2 中,服务器可以对客户端的一个请求发送多个响应。
原文连接: github.com/RachelRen/b…
参考文献: