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

Pasted-Image-20231225105542.svg

binary framing

Pasted-Image-20231225105538.svg

push promise

Pasted-Image-20231225105543.svg

header compression

Pasted-Image-20231225105547.svg