什么是HTTP?
如果你对HTTP这个概念还不熟悉,请继续阅读本节的内容,如果你对HTTP这个概念熟悉,请跳过本节直接阅读下一节。
HTTP(超文本传输协议)是一个应用层协议,是目前万维网数据通信的基础。
HTTP基于C/S(客户端/服务器)模型。C/S模型可以解释为两台电脑,客户端电脑(接受服务)和服务端电脑(提供服务),它们通过请求和响应进行通信。
以酒店顾客和服务员来举一个简单又抽象的案例:顾客(客户端)向服务员(服务器)要了一份早餐(发送请求),然后服务员从酒店厨师那里(你的应用逻辑)获取到早餐并把它带给顾客。
这是一个非常简单的例子,但可以帮助你理解HTTP这个概念。
还有很多有趣的HTTP概念和实用工具就不过多讨论了,因为本文的重点是著名的HTTP/2。
什么是HTTP/2?
在2015年,国际互联网工程任务组(IETF)发布了HTTP/2,最有用的互联网协议HTTP的第二个版本,它是从早期具有实验性质的协议SPDY协议中衍生出来的。
开发HTTP/2的主要目标是:
完全兼容HTTP/1.1——包括方法、状态码、URI和请求头字段;
提高页面加载速度;
请求头压缩;
二进制协议;
服务端推送;
TCP连接的多路复用;
请求的多路复用(TCP连接的多路复用)
HTTP/2在一个TCP连接上可以并行的发送多个请求。这是HTTP/2协议最重要的特性,因为这允许你可以异步的从服务器上下载网络资源。许多主流的浏览器都会限制一个服务器的TCP连接数量。
这减少了额外的往返时间,使得你的网站不需做任何优化就可以加载的更快,并使得域名分片变得不再重要。
请求头压缩
HTTP/2压缩了大量冗余的请求头帧。它使用HPACK规范作为一个简单又安全的方法来实现请求头压缩,客户端和服务端维护一个请求头列表。
HPACK会在每个请求头发给服务器之前对其单独的值进行压缩,具体实现方法就是:在之前发送过的请求头列表中查找已编码的请求头信息,来重新组成整个请求头信息。
二进制协议
HTTP/2在功能和属性方面有了显著的发展,比如从文本协议转换为了二进制协议。HTTP1.x通过处理文本命令来完成请求-响应循环。HTTP/2则是使用二进制命令来执行相同的任务。二进制协议减轻了构造的复杂性,并简化了由于命令包含文本和可选空格而易被混淆的命令的实现。
浏览器如果使用了HTTP/2的实现,会将命令转化为二进制再进行传输。
二进制协议的好处:
低开销的解析数据——HTTP/2相较于HTTP1的重要改进;
不易出错;
轻量级的网络封装;
高效的网络资源利用率;
压缩了命令的表示方法,使之更容易处理和实现;
使得服务器和客户端的数据处理更加的高效、健壮;
减少网络延迟并提高吞吐量。
服务端推送
这个能力允许服务器发送额外的信息给客户端,这些额外的信息客户端并没有请求但接下来很可能会用到。例如,如果客户端请求了资源X,而Y资源接下来很明显也会请求,服务器就可以选择把Y资源和X资源一起发给客户端,而不需等到客户端请求在发送。
服务端推送的好处:
客户端将推送的资源保存在缓存中;
客户端可以在不同的页面中重用这些缓存资源;
服务器可以将最初请求的资源和要推送的资源重用一个TCP连接;
服务器可以对推送的资源进行优先级排序——HTTP/2相对于HTTP1的关键性能区别;
客户端可以拒绝推送的资源以维护一个高效的缓存资源库,或者完全金庸服务端推送;
客户端也可以限制并发推送的流的数量。
如果你还记得上面关于酒店服务员和顾客的故事,那就是一个很好的例子。
对于HTTP/1.1和HTTP/2协议的一点区别。想象一下,服务员是一个TCP连接,而你想要点一份早餐和一瓶水。对于HTTP/1.1,就意味着你需要向一个服务员点一份早餐,再向另一个服务员点一瓶水,所以你需要分配两个TCP连接。对于HTTP/2,意味着你仅向一个服务员点餐,他会分两次将它们带给你。你仅仅需要分配一个TCP连接,同时也降低了服务器负载,并且服务器也空出一个连接(服务员)来服务下一个客户端(顾客)。
HTTP/2相对于HTTP/1.1的服务端推送的真正区别如下:
想象一下,顾客(客户端)向服务员(服务器)要了一份早餐(发送请求),然后服务员从酒店厨师那里(你的应用逻辑)获取到早餐,但是,服务员想到你也需要一瓶水,因此他将早餐和水头带给你了。最后的结果就是仅仅使用了一个连接,而且还是一个请求,这就大大降低了服务器的负载。
服务端推送实践案例
下面我们用一个简单的例子来探究HTTP/1.1,HTTP/2和HTTP/2服务端推送的区别,我们用一个拥有100张图片的网页来测试。
这个例子中我们需要注意的是请求的数量、加载时间、协议列、启动程序列和瀑布图本身(我们可以看到如何通过多个批次发送请求,不幸的是,除了首字节响应时间和内容下载时间,很难看到其他数据)。
对于HTTP/1.1:
请求数量:102
加载时间:12.97秒
协议:http/1.1
启动程序列:第一个请求由用户(客户端)发起,其余的请求由意识到需要一些其他资源的客户端请求发起(在这里就是那100张图片)。
瀑布图:我们可以看到如何通过多个批次发送请求(即发送TCP连接)。
对于HTTP/2:
请求数量:102
加载时间:11.19秒
协议:HTTP/2
启动程序列:第一个请求由用户(客户端)发起,其余的请求由意识到需要一些其他资源的客户端请求发起(在这里就是那100张图片)。
瀑布图:我们可以看到如果通过两个批次(即两个TCP连接)发送请求。
注意加载时间。在这个案例中,它仅仅比HTTP/1.1小一点点,但实际中不会总是这样。这个案例展示了客户端请求的多路复用。
对于HTTP/2服务端推送:
请求数量:102
加载时间:3.17秒
协议:HTTP/2
启动程序列:第一个请求由用户(客户端)发起,其余请求由服务器推送发起(实际上就是一个请求响应循环)。
瀑布图:我们可以看到如何通过一个批次(一个TCP连接)发送请求。
使用HTTP/2来加速你的站点
HTTP/2给我们提供了许多新的技术来减少HTTP/1.1中的问题,这使得我们的web网页性能得到提高。目前,HTTP/2已被广大的web客户端支持,因此我们是不需要担心它的浏览器兼容性问题。虽然HTTP/2的实现很简单,你仍然需要记住,你可能必须更改技术实现(例如向客户端提供资源)来充分发挥HTTP/2的潜力!