1. 减少连接无法复用的问题
HTTP协议是建立在TCP连接上的,例如TCP每次均要通过三次握手建立连接,在TCP连接建立初期有慢启动(slow start)的特性。所以连接重用要比新建连接性能要好。
1.1 HTTP/1.x使用keep-alive保持长连接
在Http1.x中在请求头中可以设置Connection:Keep-Alive
来保持长连接。可以在一定时间内复用连接。但是在http1.x协议中,浏览器在同一时间,针对同一域名下的请求由一定数量的限制,超过限制数目的请求就会被阻塞。
1.2 HTTP/2多路复用的单一长连接
在HTTP/2中,浏览器请求同一个域名,只会建立一条TCP连接,虽然只有一条TCP连接,但是在逻辑上分成了很多Stream。HTTP/2把要传输的信息分割成一个个二进制帧。多个帧可以乱序发送,根据帧首部的流标识可以重新组装。同时流还支持优先级和流量控制。以确保重要的东西可以优先被加载完。
多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。
2. 头部压缩与二进制格式
HTTP/1.x是传输的文本格式,而HTTP/2采用的是二进制格式传输数据。
HTTP/2对消息头会采用HPACK进行压缩传输,能够节省消息头占用的网络流量,而HTTP/1,x每次请求,都会携带大量冗余头信息,浪费了很多带宽资源。
3. 服务端推送 Server Push
HTTP/2支持“缓存推送”。主要的思想是:当一个客户端请求资源X,而服务器知道它很可能也需要资源Z的情况下,服务器可以在客户端发送请求前,主动将资源Z推送给客户端。不需要客户端解析HTML在发送这些请求。当客户端需要的时候,它已经在客户端了。