http2的新特性
5/7/2019 • ☕️ 2 min read
头部压缩
http2针对头部字段,使用HPACK压缩算法,对请求头进行压缩。
- 在服务器和客户端之间,建立哈希表,将用到的字段存放在这张表中,那么在传输的时候对于之前出现过的值,只需要把索引(比如0,1,2,...)传给对方即可,对方拿到索引查表就行了。这种传索引的方式,可以说让请求头字段得到极大程度的精简和复用
- 其次是对于整数和字符串进行哈夫曼编码,哈夫曼编码的原理就是先将所有出现的字符建立一张索引表,然后让出现次数多的字符对应的索引尽可能短,传输的时候也是传输这样的索引序列,可以达到非常高的压缩率。
http2废除了起始行的概念,将起始行中的请求方法、URI、状态码转换成了头字段,不过这些字段都有一个":"前缀,用来和其它请求头区分开。
二进制分帧
http2认为明文传输太麻烦了,不方便计算机去解析,干脆全部转换为二进制格式,01串,headers+body的报文格式被拆分为一个个二进制帧,headers帧存放头部字段,data帧存放请求体数据,这样服务器看到的不再是一个个完整的http请求报文,而是一堆乱序的二进制帧,这些二进制帧不存在先后关系,因此也就不会排队等待,也就没有了 HTTP 的队头阻塞问题。
多路复用
在 HTTP/2 中,有了二进制分帧之后,HTTP /2 不再依赖 TCP 链接去实现多流并行了,在 HTTP/2中,通信双方都可以给对方发送二进制帧,这种二进制帧的双向传输的序列,也叫做流(Stream)。HTTP/2 用流来在一个 TCP 连接上来进行多个数据帧的通信,这就是多路复用的概念。
比如请求html css js 三个文件,http1.x需要三个TCP连接,而http2只需要一个TCP连接,同个域名只需要占用一个 TCP 连接,使用一个连接并行发送多个请求和响应,这样整个页面资源的下载过程只需要一次慢启动,同时也避免了多个TCP连接竞争带宽所带来的问题
服务器推送
HTTP/2 的服务器推送(Server Push)。在HTTP/2当中,服务器已经不再是完全被动地接收请求,响应请求,它也能新建stream来给客户端发送消息,当TCP连接建立之后,比如浏览器请求一个HTML文件,服务器就可以在返回HTML的基础上,将HTML 中引用到的其他资源文件一起返回给客户端,减少客户端的等待。另外,服务端可以主动推送,客户端也有权利选择是否接收。如果服务端推送的资源已经被浏览器缓存过,浏览器可以通过发送RST_STREAM帧来拒收。主动推送也遵守同源策略,换句话说,服务器不能随便将第三方资源推送给客户端,而必须是经过双方确认才行。
可设置优先级
在HTTP/2中,每个请求都可以带一个31bit的优先值,0表示最高优先级, 数值越大优先级越低。有了这个优先值,客户端和服务器就可以在处理不同的流时采取不同的策略,以最优的方式发送流、消息和帧,优化用户体验。
流量控制
HTTP/2利用流来实现多路复用,这引入了对TCP连接的使用争夺,会造成流被阻塞。流量控制方案确保在同一连接上的多个流之间不会造成破坏性的干扰。流量控制会用于各个独立的流,也会用于整个连接。
HTTP/2通过使用WINDOW_UPDATE帧来进行流量控制。