头部压缩 HPACK
建立索引表,增大实时性,并发性。一般我们的消息主体会通过gzip进行压缩, 但是起始行和消息头部没有压缩的。随着请求的增多, 我们传输头部的开销是非常大的。所以http 2采用以下方法:
- 维护一张相同的静态表: 即共61页,每次利用索引号传输
- 维护一张相同的动态表:当header name 在静态表中没有使用Huffman coding , 缓存到动态列表,即往后发送索引传输。
分流
采用二进制分帧,消息分为更小的消息和帧。http 2对它们采用二进制格式的编码 ,其中HTTP 2.0把原本HTTP1.x的首部信息会被封装到Headers帧,而我们的request body则封装到Data帧里面。帧是数据传输的最小单位,以二进制传输代替原本的明文传输。因为在通信传输中,大部分HTTP连接处于突发,短时间的, 所有我们共享一个连接, 但是这个连接上承载了多个传输流, 它们是任意双向数据流, 以message的形式发送, 且每个message中可以有多个帧。而帧是可以乱序发送的, 以流标识进行组装。
多路复用
单个tcp链接,解决多个http请求。
http 1.1中,浏览器客户端在同一时间,针对同一域名下的请求有一定数量的限制,超过限制数目的请求会被阻塞。这也是为何一些站点会有多个静态资源CDN 域名的原因之一。
http 2.0 连接都是持久化的,而且客户端与服务器之间也用一个连接(每个域名一个连接)即可。http2连接可以承载数十或数百个流的复用,多路复用意味着来自很多流的数据包能够混合在一起通过同样连接传输。当到达终点时,再根据不同帧首部的流标识符重新连接将不同的数据流进行组装。