Introduction to HTTP/2

https://web.dev/performance-http2/

http2相比http1.x目标就是减少浏览器上的延迟,雏形是google在2009年发起的spdy协议,在2015年正式变更为http2协议。相比http1.x语义层不发生任何变化,原来处理http1.x的应用层逻辑还是可以使用,主要改进是在传输层上。

我这里总结了一下http2的几个重大改进点:

  1. One connection per origin. 和origin只会创建一个TCP连接,每个逻辑连接变为stream. stream上面传输message, message可以被拆分成为多个frames,包括header frame和data frames.
  2. Request and response multiplexing. 因为和origin只有一个tcp连接,所以res/resp必须支持复用,每个stream上面都会产生一个uuid来表示逻辑连接。
  3. Binary framing layer. 传输层变为二进制格式而不是text格式,减少压缩体积。
  4. Stream prioritization 每个流上可以指定优先级别,然后还可以指定层级关系:parent优先级别更高,sibling之间按照weight进行划分。不过parent message并不一定保证比children message先到达。
  5. Flow control 这个东西不能关闭并且是hop-to-hop而不是end-to-end,粒度可以是stream-level也可以是connection-level. 初始化的时候使用settings指令交换window size, 然后使用window update命令来更新窗口大小。
  6. Server push. 服务器可以主动推送资源metadata信息包装在promise中,promise里面可能包含资源地址以及ETAG这样的东西。可以想象获取页面加载css场景,服务器先发送css promise信息然后发送页面数据,client拿到页面数据之后,可以就知道哪些css已经加载过了就不用申请。通常一个页面请求所有资源都是在一个promise里面。
  7. Header compression. 许多请求header字段是完全一样的,通过交换hashtable可以减少公共header的传输:可以分为static table(general common header)和dynamic table(application common header).

单个连接上的多个streams

Sorry, your browser does not support SVG.

binary framing

Sorry, your browser does not support SVG.

push promise

Sorry, your browser does not support SVG.

header compression

Sorry, your browser does not support SVG.