HTTP/2那些事儿

HTTP协议是所有协议簇中非常重要的一块,随着互联网的不断发展,HTTP协议也在进行不断的改进完善。大概经过这样的演变:http0.9--->http1.0--->http1.1--->http2.0。同时,作为IT行业里的一员,理解它是非常有必要的。

什么是HTTP协议

对于此部分,如果你不熟悉,那请继续阅读,如果较为熟悉,可直接跳过该部分进入下一段。

超文本传输协议(HTTP)是一种应用层协议,目前是万维网数据通信的基础。
HTTP协议基于客户端/服务器模型。客户端/服务器可以解释为两台电脑,客户端(服务接收者)与服务器(服务的提供者)之间通过请求和响应进行通信。

一个简单的例子是饭店的客人与服务员。客人(客户端)向服务员(服务器)点了(发送请求)一顿饭,然后服务员从餐厅厨师那里获取饭菜(应用程序逻辑)并将饭菜带给客人。
这是个很简单的生活中的例子,但对于理解这个概念是很有用的。

什么是HTTP/2

在2015年,Internet Engineering Task Force (IETF)发布了HTTP/2,对于网络协议HTTP来说,是最为有用的第二个主要版本。它源自较早的实验SPDY协议。

开发HTTP/2的主要目的有:

  • 协商机制(协议选择),列如HTTP1.1、HTTP/2等
  • 与HTTP1.1更高级的兼容性-请求方式、状态码、URL、标头字段等
  • 页面加载速度的改善
  • 压缩请求头
  • 二进制协议
  • 服务器推送
  • 通过单个TCP连接请求多路复用
  • 请求管道
  • 头部阻塞

请求多路复用

HTTP/2可以通过单个TCP连接并行发送多个数据请求。这是HTTP/2协议的最高级功能,因为它允许你从一台服务器异步下载Web文件。大多数现代浏览器将TCP连接限制为一台服务器。

这样可以减少额外的往返时间(RTT),使网站加载速度更快,而无需进行任何优化,并且无需进行域的分片。

压缩请求头

HTTP/2压缩大量冗余标头帧,它使用HPACK规范作为标头压缩的简单安全方法。客户端和服务器均维护先前客户端-服务器请求中使用的标头列表。

HPACK在将每个标头传输到服务器之前先压缩每个标头的单独值,然后服务器在先前传输的标头值列表中查找编码信息,以重建完整的标头信息。

二进制协议

最新的HTTP版本在功能和属性(例如从文本协议转换为二进制协议)方面已经有了重大发展。HTTP1.x用文本命令来处理以完成请求-响应周期HTTP/2将使用二进制命令(分别为1和0)执行相同的任务。此属性减轻了框架的复杂性,并简化了由于包含文本和可选空格的命令而导致混淆的命令的实现。

浏览器使用HTTP/2实现其通过网络传输之前,会将相同的文本命令转换为二进制命令

这样做的好处有:

  • 解析数据的开销低
  • 容错性强
  • 网络足迹更轻
  • 有效利用网络资源
  • 消除了与HTTP1.x的文本性质相关的安全问题,例如响应拆分攻击
  • 启用HTTP/2的其他功能,包括压缩,复用,优先级划分,流控制和TLS的有效处理
  • 命令的紧凑呈现,更易于处理和实现
  • 在客户端和服务器之间的数据处理方面高效而强大
  • 减少网络延迟并提高吞吐量

HTTP/2服务器推送

此功能使服务器可以向客户端发送未请求但在将来的请求中可以预期的其他可缓存信息。如果客户端请求资源X,并且可以理解请求的文件引用了资源Y,则服务器可以选择将Y与X一起推送,而不是等待适当的客户端请求。

那么服务器推送都有哪些好处呢?

  • 客户端将推送的资源保存在缓存中
  • 客户端可以跨不同页面重用这些缓存的资源
  • 服务器可以在同一TCP连接中将推送的资源与原始请求的信息进行多路复用
  • 服务器可以确定推送资源的优先级-HTTP/2与HTTP1的关键性能差异
  • 客户端可以拒绝推送资源以维护有效的缓存资源存储库,或者完全禁用服务器推送
  • 客户端还可以限制并发多路复用的推送流的数量

对于HTTP/1.1和HTTP/2协议,略有不同。继续以上面客人到餐厅吃饭的例子为例。想象一下,服务员是TCP连接,你想点餐和一瓶水。对于HTTP/1.1来说,你想服务员请求了餐点和一瓶水,因此你将分配到两个TCP连接。对于HTTP/2,这意味着你只要求两个服务,同一个服务员。但服务员将它们分开携带。你仅分配一个TCP连接,这已经导致较低的服务器负载,另外,服务器还将为下一个客户端(客人)准备一个额外的空闲连接(服务员)。

作为这些机制的简单展示,我做了一个简单的页面示例。

我们这里是一个简单的页面,其中包含100张勾选图像,我将用它们来演示HTTP/1.1,HTTP/2和HTTP/2服务器推送。

上图中需要注意的重要一点是请求数,加载时间,协议列,发起器栏和瀑布图本身(很遗憾,我们可以看到如何通过批处理发出请求,但是很难从中看到其他数据和内容下载时间;例如资源调度和连接开始时间)。

对于HTTP/1.1

请求数:102
加载时间:12.97秒
协议:"HTTP/1.1"
发起器栏:第一个发起者是用户/客户端,其余请求由对客户端的响应发起,客户端意识到客户端需要其他资源(在这种情况下为图像)
瀑布图:我们可以看到如何通过多个批次(TCP连接)发出请求

对于HTTP/2

请求数:102
加载时间:11.19秒
协议:“h2” (HTTP/2)
发起器栏:第一个发起者是用户/客户端,其余请求则由对客户端的响应发起,客户端意识到自己需要其他资源(在这种情况下为图像)
瀑布图:我们可以看到如何通过2个批次(TCP连接)发出请求

注意加载时间。在这种情况下,它比HTTP/1.1示例的加载时间要短一些,但不必总是如此。此示例显示了客户端请求的多路复用。

对于HTTP2服务器推送

请求数:102
加载时间:3.17秒
协议:“h2” (HTTP/2)
发起器栏:第一个发起者是用户/客户端,其余请求通过服务器的推送来发起(实际上是一个请求/响应周期)
瀑布图:我们可以看到如何通过1个批处理(1个TCP连接)发出请求。

浏览器兼容性

大多数现代浏览器完全支持HTTP/2协议,但Opera mini(所有版本)和Android的UC浏览器除外(红色)。也有部分支持的产品(浅绿色),例如IE11。

写在后面

ps:各位在深圳工作的同行朋友们,如果你们所在的公司缺产品经理岗,尤其是南山或者福田区的,还请麻烦各位小伙伴私信我下,一位好友最近在找产品岗的工作,谢谢。

你可能感兴趣的