http2最大的特点, 在于没有改动http的语义,等核心概念下, 致力于突破上一代的性能限制,改进传输性能, 实现低延迟高吞吐。 在于新增了二进制分帧层。
一. 二进制帧
把以往的明文传输, 增强为二进制帧的形式, 首部放在headers帧, body部分放在Data帧, 帧为传输的最小单位。我们所有的请求都可以在一个连接上完成。 因为在通信传输中,大部分HTTP连接处于突发,短时间的, 所有我们共享一个连接, 但是这个连接上承载了多个传输流(stream), 它们是任意双向数据流, 以message的形式发送, 且每个message中可以有多个帧。而帧是可以乱序发送的, 以流标识进行组装。
单连接多资源的好处:
1. 减少了服务器连接压力,连接的吞吐量变大了,内存占用少了。
2. 解决了由TCP连接导致的网络阻塞问题
3. 慢启动时间减少, 拥塞和丢包恢复速度块
注意: 1. 流标识符, 服务端为偶数, 客服端为奇数。 2. stream ID , 实现多路复用的关键, 接收端根据这个ID 并发,组装。 同一个Stream的frame必须是有序的。
二. 头部压缩 HPACK
一般我们的消息主体会通过gzip进行压缩, 但是起始行和消息头部没有压缩的。随着请求的增多, 我们传输头部的开销是非常大的。
如何进行头部压缩?
维护一张相同的静态表: 即共61页,每次利用索引号传输
维护一张相同的动态表:当header name 在静态表中没有使用Huffman coding , 缓存到动态列表,即往后发送索引传输。
三. 多路复用
指一个连接可以由很多的流进行复用, 即同一个流之间的frame必须有序, 没有ID编号。