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.一、HTTP/2等
  • 与HTTP1.1更高级的兼容性-请求方式、状态码、URL、标头字段等
  • 页面加载速度的改善
  • 压缩请求头
  • 二进制协议
  • 服务器推送
  • 经过单个TCP链接请求多路复用
  • 请求管道
  • 头部阻塞

请求多路复用

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

11.png

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

压缩请求头

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

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

HTTP1.1服务器推送

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

对于HTTP/2

HTTP2服务器推送

请求数:102
加载时间:11.19秒
协议:“h2” (HTTP/2)
发起器栏:第一个发起者是用户/客户端,其他请求则由对客户端的响应发起,客户端意识到本身须要其余资源(在这种状况下为图像)
瀑布图:咱们能够看到如何经过2个批次(TCP链接)发出请求

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

对于HTTP2服务器推送

HTTP2

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

浏览器兼容性

浏览器兼容

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

写在后面

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

相关文章
相关标签/搜索