HTTP/2 比 HTTP/1 快在哪里?
编者按:
HTTP/2 比 HTTP/1 快在哪里?其底层的技术原理是什么?本文和你简单聊聊 HTTP/2 在一些技术细节上,是如何使其比 HTTP/1 更快。
1.
HTTP/2 的来头
HTTP/2 是 HTTP 协议第二个版本,其目标是为了改进HTTP/1存在的不足,让应用访问网络更快。
HTTP/2是如何使网络访问「更快」的呢?
我们先来看看 HTTP/2 的“野心”:
-
从基于文本的 HTTP/1.1 转换为二进制协议,数据传输效率更高
-
支持请求多路复用,提高数据的访问速度
-
更高效的HTTP 头部压缩,提升数据传输速度
-
兼容 HTTP/1.1 标准定义的方法、状态代码、URI 和标头字段。客户端无需进行任何更改就可以像请求 HTTP/1 那样请求服务端
-
支持设置请求优先级,确保更重要的资源得到更快的加载,以获得最佳用户体验
-
支持服务器端推送资源给客户端,不需要客户端再次发送请求
也就是说,HTTP/2 比 HTTP/1 更牛x。同时客户端可以使用从 HTTP/1 迁移到 HTTP/2,无需做什么修改即可享受 HTTP/2 带来的高效。
2.
HTTP/2 如何实现其“野心”?
2.1 多路复用:允许同时发送多个请求和响应
HTTP/1 对每一个域名最多维护6个TCP连接,也就是说最多有六个TCP连接并发请求数据。但是TCP第一次启动有一个慢启动过程(这是我们无法避免的,为了减少TCP网络拥塞)。虽然启动了六个TCP连接请求数据,但每一个TCP都有一个慢启动过程,导致数据有一部分时间浪费在了慢启过程。
特别在带宽资源不足的时候(比如请求很多资源,占用带宽),TCP为了避免网络拥塞会自动降低网络请求速度,导致整体的数据请求速度都比较慢。
这些问题在 HTTP/2 中就不存在了。HTTP/2 使用多路复用技术,每一个域名只开启一个TCP连接,这样浪费在TCP慢启动的事件就变少了,也避免了下载大量数据导带宽资源不足从而降低TCP访问速度。
还有,HTTP/2还只是并发发起多条网络请求。在 HTTP/1 中,TCP连接虽然可以复用,但下一个请求需要排队等待上一个请求结束,网络请求速度必然造成拥堵。
下图描绘HTTP/2多路复用流程:HTTP/2同一个TCP中可以不用等待上一个请求结束,直接发起请求,每一个请求都有一个ID唯一标识。这样服务端,就可以随意处理而不用根据其请求的顺序。比如图中请求的顺序是3->2->1,响应顺序是2->1->3。
图2.1.1 HTTP/2 网络多路复用流程图
2.2 压缩:压缩请求/响应头,以提高工作效率
这点没什么好说,就是运用一些算法压缩请求/响应头,这样数据在网络中传输速度会更快。在HTTP/2中用的是 HPACK 压缩算法。
2.3 设置请求优先级
客户端请求可以设置优先级。优先级更高的请求会优先得到服务端的处理。浏览器可以运用这一特性,在渲染网页时让更核心的资源请求的优先级更高。这样网页的渲染速度自然也得到提升,毕竟一些低优先级的资源可以在网页展示之后再加载也没有关系。
2.4 服务器推送:服务器可以在请求之前发送请求所需的其他信息
比如客户端访问A资源,服务端也知道客户端随后也会访问B资源,这样服务端就可以把B资源和A资源一起返回给客户端,客户端就不用再发起请求了。这样就提高了客户端访问的速度,比如网页的渲染。
2.5 更安全
HTTP/2 使用二进制传输数据,这样就减少攻击的可能。比如在 HTTP/1 中响应是文本格式,可能会被恶意插入一行文本来篡改响应头。
3.
HTTP/2 的优缺点
通过上面介绍,我们知道 HTTP/2 相比 HTTP/1:
-
支持设置请求优先级:留给客户端优化请求的空间更多。
-
数据传输效率更高:HTTP/2 传输二进制流,HTTP/1是传输文本。
-
多路复用:降低网络资源的占用,提高带宽使用率。
-
更好的安全性。
. .... .
诚然,没有任何技术是银弹,HTTP/2 也有它的缺点。
HTTP/2 使用一个TCP连接处理所有请求,如果某一个请求丢包重试,会导致后面的请求被阻塞。如图,请求A重传,阻塞了请求D。
图3.1 HTTP/2 重传导致包阻塞
当然 HTTP/2 还有其他优缺点点,这里不继续探讨。读者可以从其技术实现细节去思考。
参考资料:
1、李兵:HTTP/2:如何提升网络速度?
2、https://www.upwork.com/resources/what-is-http2