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 的优先级是浏览器基于自身对资源重要性的判断设置的)

而接收数据的一方, 可以通过这些信息构建一个依赖树

  1. 在该依赖树中, 由于 Stream1 没有依赖其他的流, 故而所有的可用资源将会先分配给 Stream1(在 Stream1 没有完成之前, 依赖于 Stream1 的 Stream2 不会获得资源)
  2. 当 Stream1 完成后, 所有的可用资源将会分配给 Stream2, 依赖 Stream2 的 Stream3/4 不能获得资源
  3. 当 Stream2 完成后, 可用资源将按照 2:4 的比例分配给 Stream3 和 Stream4
  4. 当 Stream3 完成后, Stream3 所拥有的资源将会按照 6:6 的比例分配给 Stream5 和 Stream6

注意: 流的优先级和依赖关系只是期待接收方能够这么做, 而接收方也可以不按照优先级和依赖关系分配可用资源给对应的流

4. 服务器推送


服务器推送的优点

  • 客户端可以拒绝服务器推送的资源
  • 客户端可以缓存服务器推送的资源
  • 服务器推送的资源可以由不同的页面共享
  • 服务器可以按照优先级推送资源

5. 首部压缩

HTTP 的每一次通信都会携带一组首部,用于描述传输的资源及其属性。在 HTTP1.x 中,这些元数据都是以纯文本形式发送的,通常会给每个请求增加 500~800 字节的负荷。如果算上 HTTP cookie,增加的负荷通常会达到上千字节

HTTP/2 使用 HPACK 算法对 Headers 进行压缩, 有效减少了冗余数据的传输

原文地址:http://www.cnblogs.com/suzukaze/p/HTTP2.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性