为了改进 HTTP/1 的性能问题,复用 HTTP 方法、状态代码、URI 和标头字段等核心概念,主要做了以下修改 :

  • 二进制分帧
  • 多路复用
  • 服务器推送
  • 头部压缩

    二进制分帧

    微信截图_20210313160842.png

    在应用层与传输层之间增加一个二进制分帧层,以此达到“在不改动 HTTP 的语义,HTTP 方法、状态码、URI 及首部字段的情况下,突破 HTTP1.1 的性能限制,改进传输性能,实现低延迟和高吞吐量。”

  • “HEADERS”帧:存放 HTTP1 的头数据

  • “DATA”帧:存放原本的实体数据

微信截图_20210313164328.png

  • 流:流是连接中的一个虚拟信道,可以承载双向的消息;每个流都有一个唯一的整数标识符(1、2…N);
  • 消息:是指逻辑上的 HTTP 消息,比如请求、响应等,由一或多个帧组成。
  • 帧:HTTP 2.0 通信的最小单位,每个帧包含帧首部,至少也会标识出当前帧所属的流,承载着特定类型的数据,如 HTTP 首部、负荷,等等

    压缩头部

    微信截图_20210313175627.png

  • HTTP/2 在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键-值对,对于相同的数据,不再通过每次请求和响应发送;

  • 首部表在 HTTP/2 的连接存续期内始终存在,由客户端和服务器共同渐进地更新;
  • 每个新的首部键-值对要么被追加到当前表的末尾,要么替换表中之前的值

    多路复用(Multiplexing)

    2019-03-06-4.png

  • 同个域名只需要占用一个 TCP 连接,使用一个连接并行发送多个请求和响应,消除了因多个 TCP 连接而带来的延时和内存消耗。

  • 并行交错地发送多个请求(或响应),请求(或响应)之间互不影响。
  • 在 HTTP/2 中,每个请求都可以带一个 31bit 的优先值,0 表示最高优先级, 数值越大优先级越低。有了这个优先值,客户端和服务器就可以在处理不同的流时采取不同的策略,以最优的方式发送流、消息和帧。

    服务器推送(Server Push)

    2019-03-06-6.png

    Server Push 即服务端能通过 push 的方式将客户端需要的内容预先推送过去,也叫“cache push”

参考资料

  1. 30 | 时代之风(上):HTTP/2特性概览
  2. HTTP2.0 的总结
  3. 一文读懂 HTTP/2 及 HTTP/3 特性