# HTTP/2协议

HTTP/2标准于2015年5月以RFC 7540正式发表

# 二进制分帧

HTTP/2不再采用明文协议,转而使用二进制协议,相对HTTP/1.x,二进制协议在解析的时候更加高效。

HTTP/1 的请求和响应报文,都是由起始行,首部和实体正文(可选)组成,各部分之间以文本换行符分隔。 HTTP/2 将请求和响应数据分割为更小的帧,并且它们采用二进制编码。

概念解析

帧:HTTP/2 数据通信的最小单位消息,指 HTTP/2 中逻辑上的 HTTP 消息。例如请求和响应等,消息由一个或多个帧组成。

流:存在于连接中的一个虚拟通道。流可以承载双向消息,每个流都有一个唯一的整数ID。

# 多路复用

HTTP/2 中,同域名下所有通信都在单个连接上完成,该连接可以承载任意数量的双向数据流。

每个数据流都以消息的形式发送,而消息又由一个或多个帧组成。多个帧之间可以乱序发送,根据帧首部的流标识可以重新组装。

优点提升

同个域名只需要占用一个 TCP 连接,消除了因多个 TCP 连接而带来的延时和内存消耗

单个连接上可以并行交错的请求和响应,之间互不干扰

每个请求都可以带一个31bit的优先值,0表示最高优先级, 数值越大优先级越低。有了这个优先值,客户端和服务器就可以在处理不同的流时采取不同的策略,以最优的方式发送流、消息和帧

# 服务器推送

在HTTP 1.1里,在同一个 TCP 连接里面,上一个回应(response)发送完了,服务器才能发送下一个,但在HTTP/2里,可以将多个回应一起发送。

服务端可以在发送页面HTML时主动推送其它资源,而不用等到浏览器解析到相应位置,发起请求再响应。

# 头部压缩

HPack是HTTP/2 里HTTP头压缩的算法。

压缩策略

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

首部表在HTTP/2的连接存续期内始终存在,由客户端和服务器共同渐进地更新

每个新的首部键-值对要么被追加到当前表的末尾,要么替换表中之前的值

在HTTP头里,有些key: value是固定的,例如:

 :method: GET
 :scheme: http
1
2

在编码时,它们直接用一个index编号代替,例如 :method:GET 是2,这些在一个静态表定义。通过一个索引,极大提升压缩效果。

静态表