1. 二进制分帧层
HTTP/2 新增了二进制分帧层, 在不修改 HTTP/1.x 的语义(包括各种动词, 方法, 首部都不受影响)的前提下, 将编码方式改变了
- Connection 连接: 一个 TCP 连接, 包含 1 个或多个双向数据流
- Stream 流: 双向通信的数据流, 包含 1 个或多个消息(Message). 每个数据流都有一个唯一的标识符和可选的优先级
- Message 消息: 对应 HTTP/1.x 的逻辑消息(Request/Response), 包含完整的一系列的帧 (一个或多个)
- Frame 帧: HTTP/2 中的最小通信单位, 以二进制压缩格式存放内容. 每个帧都有相应的数据流标识符, 这使得 HTTP/2 可以将不同数据流的帧交错发送, 到达客户端或服务器端后再将一个流中的所有帧组合起来即可
2. 多路复用技术
在 HTTP/2 传输数据的时候, 由二进制分帧层将 HTTP 消息切分成多个互不依赖的帧, 而后将不同数据流的帧交错发送(同一数据流中的帧必须保持有序). 在客户端或服务器端再根据每个帧上的数据流标识符将相应的帧组合成完整的数据流, 这使得
- 客户端的应用层可以交错并行地发送请求, 互不影响
- 服务器端的应用层可以交错并行地发送响应, 互不影响
- 只需使用一个连接即可并行发送多个请求和响应
- 不需要再为绕过 HTTP/1.x 的并行请求数量的限制做额外的工作(如雪碧图, base64等)
3. 流的请求优先级与依赖关系
HTTP/2 允许为数据流设置优先级与依赖关系, 当客户端并行地发送多个请求消息而网络状况不佳时, 优先级和依赖关系设定的重要性就体现出来了:
通过设置优先级和依赖关系, 可以提醒服务器优先响应急需的数据(如 CSS/JavaScript), 而暂缓响应相对来说无关紧要的数据(如 Img). 这样能够防止 HTML 解析阻塞的情况出现
HTTP/2 允许为数据流设置整数范围为 1~256 的权重, 以及依赖关系(在浏览器中, HTTP/2 的优先级是浏览器基于自身对资源重要性的判断设置的)
而接收数据的一方, 可以通过这些信息构建一个依赖树
- 在该依赖树中, 由于 Stream1 没有依赖其他的流, 故而所有的可用资源将会先分配给 Stream1(在 Stream1 没有完成之前, 依赖于 Stream1 的 Stream2 不会获得资源)
- 当 Stream1 完成后, 所有的可用资源将会分配给 Stream2, 依赖 Stream2 的 Stream3/4 不能获得资源
- 当 Stream2 完成后, 可用资源将按照 2:4 的比例分配给 Stream3 和 Stream4
- 当 Stream3 完成后, Stream3 所拥有的资源将会按照 6:6 的比例分配给 Stream5 和 Stream6
注意: 流的优先级和依赖关系只是期待接收方能够这么做, 而接收方也可以不按照优先级和依赖关系分配可用资源给对应的流
4. 服务器推送
服务器推送的优点
- 客户端可以拒绝服务器推送的资源
- 客户端可以缓存服务器推送的资源
- 服务器推送的资源可以由不同的页面共享
- 服务器可以按照优先级推送资源
5. 首部压缩
HTTP 的每一次通信都会携带一组首部,用于描述传输的资源及其属性。在 HTTP1.x 中,这些元数据都是以纯文本形式发送的,通常会给每个请求增加 500~800 字节的负荷。如果算上 HTTP cookie,增加的负荷通常会达到上千字节
HTTP/2 使用 HPACK 算法对 Headers 进行压缩, 有效减少了冗余数据的传输
标签:依赖,优先级,简介,数据流,HTTP,资源,客户端 From: https://www.cnblogs.com/suzukaze/p/HTTP2.html