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