比起像Http/1.x这样的文本协议,二进制协议解析起来更高效,更重要的是错误更少。
Http/1.x有个问题叫线端阻塞,它是指一个连接一次只提交一个请求的效率比较高,多了就会变慢。而多路传输可以很好的解决这个问题,因为它能同时处理多个消息的请求和响应,甚至可以在传输过程中将一个消息跟另一个参杂在一起。所以客户端只需要一个连接就能加载一个页面。即只需建立一次连接,即一轮三次握手,实现多路复用。
Http/2使用报头压缩,降低了开销。假定一个页面有80个资源要加载,而每一次请求都有1400字节的消息头,至少要7到8个来回去“在线”获得这些消息头。由于Tcp的慢启动机制,他会基于对已知有多少个包,来确定还要来回去获取哪些包。相比之下,即使是头部轻微的压缩也可以让那些请求只需一个来回就能搞定,有时候甚至一个包就可以了。这种开销是可以被节省下来的。
Http/2让服务器可以将响应主动“推送”到客户端缓存中。这个功能通常被称作“缓存推送”。服务器推送服务通过“推送”那些它认为客户端将会需要的内容,避免客户端花过多时间逐个请求,降低响应时间。例如把js和css文件主动推送给客户端而不用客户端解析HTML后请求再响应。主要的思想是:当一个客户端请求资源X,而服务器知道它很可能也需要资源Z的情况下,服务器可以在客户端发送请求前,主动将资源Z推送给客户端。这个功能帮助客户端将Z放进缓存以备将来之需。