让面试官颤抖的 HTTP 2.0 协议面试题

做者:今日头条
https://www.toutiao.com/a6491...

Http协议,对于拥有丰富开发经验的程序员来讲简直是信手拈来,屡见不鲜。虽然每天见,可是对于http协议的问题,可能不少人在没有积极准备的状况下,不必定能很好的回答出来。css

今天,咱们就来说讲http 2.0和以前版本的区别。html

1、HTTP定义java

HTTP协议(HyperTextTransferProtocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议。程序员

2、HTTP发展史web

3、HTTP 2.0 vs 1.0 性能能面试

HTTP 2.0 的出现,相比于 HTTP 1.x ,大幅度的提高了 web 性能。后端

这是 Akamai 公司创建的一个官方的演示,用以说明 HTTP/2 相比于以前的 HTTP/1.1 在性能上的大幅度提高。 同时请求 379 张图片,从Load time 的对比能够看出 HTTP/2 在速度上的优点。浏览器

4、HTTP 2.0 和 1.1 区别别性能优化

后面咱们将经过几个方面来讲说HTTP 2.0 和 HTTP1.1 区别,而且和你解释下其中的原理。服务器

区别一:多路复用

多路复用容许单一的 HTTP/2 链接同时发起多重的请求-响应消息。看个例子:

整个访问流程第一次请求index.html页面,以后浏览器会去请求style.css和scripts.js的文件。左边的图是顺序加载两个个文件的,右边则是并行加载两个文件。

咱们知道HTTP底层其实依赖的是TCP协议,那问题是在同一个链接里面同时发生两个请求响应着是怎么作到的?

首先你要知道,TCP链接至关于两根管道(一个用于服务器到客户端,一个用于客户端到服务器),管道里面数据传输是经过字节码传输,传输是有序的,每一个字节都是一个一个来传输。

例如客户端要向服务器发送Hello、World两个单词,只能是先发送Hello再发送World,没办法同时发送这两个单词。否则服务器收到的可能就是HWeolrllod(注意是穿插着发过去了,可是顺序仍是不会乱)。这样服务器就懵b了。

接上面的问题,可否同时发送Hello和World两个单词能,固然也是能够的,能够将数据拆成包,给每一个包打上标签。发的时候是这样的①H ②W ①e ②o ①l ②r ①l ②l ①o ②d。这样到了服务器,服务器根据标签把两个单词区分开来。实际的发送效果以下图:

要实现上面的效果咱们引入一个新的概念就是:二进制分帧。

二进制分帧层 在 应用层(HTTP/2)和传输层(TCP or UDP)之间。HTTP/2并无去修改TCP协议而是尽量的利用TCP的特性。

在二进制分帧层中, HTTP/2 会将全部传输的信息分割为帧(frame),并对它们采用二进制格式的编码 ,其中 首部信息会被封装到 HEADER frame,而相应的 Request Body 则封装到 DATA frame 里面。掌握这 11 个方法论,搞定一场完美技术面试!

HTTP 性能优化的关键并不在于高带宽,而是低延迟。TCP 链接会随着时间进行自我「调谐」,起初会限制链接的最大速度,若是数据成功传输,会随着时间的推移提升传输的速度。这种调谐则被称为 TCP 慢启动。因为这种缘由,让本来就具备突发性和短时性的 HTTP 链接变的十分低效。

HTTP/2 经过让全部数据流共用同一个链接,能够更有效地使用 TCP 链接,让高带宽也能真正的服务于 HTTP 的性能提高。

经过下面两张图,咱们能够更加深刻的认识多路复用:

HTTP/1

HTTP/2

总结下:多路复用技术:单链接多资源的方式,减小服务端的连接压力,内存占用更少,链接吞吐量更大;因为减小TCP 慢启动时间,提升传输的速度

区别二:首部压缩

===========

为何要压缩?在 HTTP/1 中,HTTP 请求和响应都是由「状态行、请求 / 响应头部、消息主体」三部分组成。通常而言,消息主体都会通过 gzip 压缩,或者自己传输的就是压缩事后的二进制文件(例如图片、音频),但状态行和头部却没有通过任何压缩,直接以纯文本传输。

随着 Web 功能愈来愈复杂,每一个页面产生的请求数也愈来愈多,致使消耗在头部的流量愈来愈多,尤为是每次都要传输 UserAgent、Cookie 这类不会频繁变更的内容,彻底是一种浪费。掌握这 11 个方法论,搞定一场完美技术面试!

咱们再用通俗的语言解释下,压缩的原理。头部压缩须要在支持 HTTP/2 的浏览器和服务端之间。

  • 维护一份相同的静态字典(Static Table),包含常见的头部名称,以及特别常见的头部名称与值的组合;
  • 维护一份相同的动态字典(Dynamic Table),能够动态的添加内容;
  • 支持基于静态哈夫曼码表的哈夫曼编码(Huffman Coding);

静态字典的做用有两个:

1)对于彻底匹配的头部键值对,例如 “:method :GET”,能够直接使用一个字符表示;

2)对于头部名称能够匹配的键值对,例如 “cookie :xxxxxxx”,能够将名称使用一个字符表示。

HTTP/2 中的静态字典以下(如下只截取了部分,完整表格在这里):

同时,浏览器和服务端均可以向动态字典中添加键值对,以后这个键值对就可使用一个字符表示了。须要注意的是,动态字典上下文有关,须要为每一个 HTTP/2 链接维护不一样的字典。在传输过程当中使用,使用字符代替键值对大大减小传输的数据量。

区别三:HTTP2支持服务器推送

服务端推送是一种在客户端请求以前发送数据的机制。当代网页使用了许多资源:HTML、样式表、脚本、图片等等。在HTTP/1.x中这些资源每个都必须明确地请求。这多是一个很慢的过程。浏览器从获取HTML开始,而后在它解析和评估页面的时候,增量地获取更多的资源。由于服务器必须等待浏览器作每个请求,网络常常是空闲的和未充分使用的。

为了改善延迟,HTTP/2引入了server push,它容许服务端推送资源给浏览器,在浏览器明确地请求以前。一个服务器常常知道一个页面须要不少附加资源,在它响应浏览器第一个请求的时候,能够开始推送这些资源。这容许服务端去彻底充分地利用一个可能空闲的网络,改善页面加载时间。

推荐去个人博客阅读更多:

1.Java JVM、集合、多线程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、后端、架构、阿里巴巴等大厂最新面试题

以为不错,别忘了点赞+转发哦!

相关文章
相关标签/搜索