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

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

Http协议,对于拥有丰富开发经验的程序员来说简直是信手拈来,家常便饭。虽然天天见,但是对于http协议的问题,可能很多人在没有积极准备的情况下,不一定能很好的回答出来。

今天,我们就来讲讲http 2.0和之前版本的区别。

一、HTTP定义

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

二、HTTP发展史

三、HTTP 2.0 vs 1.0 性能能

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

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

 

四、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,它允许服务端推送资源给浏览器,在浏览器明确地请求之前。一个服务器经常知道一个页面需要很多附加资源,在它响应浏览器第一个请求的时候,可以开始推送这些资源。这允许服务端去完全充分地利用一个可能空闲的网络,改善页面加载时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325465.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一步步学习EF Core(3.EF Core2.0路线图)

前言 这几天一直在研究EF Core的官方文档,暂时没有发现什么比较新的和EF6.x差距比较大的东西.不过我倒是发现了EF Core的路线图更新了,下面我们就来看看 今天我们来看看最新的EF Core 2.0路线图 E文好的移步:https://github.com/aspnet/EntityFramework/wiki/Roadmap#ef-core…

Docker 核心概念、安装、端口映射及常用操作命令,详细到令人发指。

转载自 Docker 核心概念、安装、端口映射及常用操作命令,详细到令人发指。 Docker简介 Docker是开源应用容器引擎,轻量级容器技术。 基于Go语言,并遵循Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移…

Build Tour 2017 中国站北京、上海报名了

微软于 5 月 10 日在总部西雅图举办的 Build 2017 大会上,发布了针对云计算、人工智能、Windows 以及混合现实平台等技术的一系列重要更新,这令众多来自企业、ISV、初创企业的开发者,学生开发者,以及技术爱好者兴奋不已。 为了帮助…

getOrDefault()和subList()

返回 key 相映射的的 value,如果给定的 key 在映射关系中找不到,则返回指定的默认值。

.NET Core类库项目中如何读取appsettings.json中的配置

这是一位朋友问我的问题,写篇随笔回答一下。有2种方法,一种叫丑陋的方法 —— IConfiguration ,一种叫优雅的方法 —— IOptions 。 1)先看丑陋的方法 比如在 RedisClient 中需要读取 appsettings.json 中的 redis 连接字符串&a…

js引擎执行代码的基本流程

js引擎执行代码的基本流程 先执行初始化代码: 包含一些特别的代码设置定时器绑定监听发送ajax请求后面在某个时刻才会执行回调代码

微服务框架下的思维变化-OSS.Core基础思路

如今框架两字已经烂大街了,xx公司架构设计随处可见,不过大多看个热闹,这些框架如何来的,细节又是如何思考的,相互之间的隔离依据又是什么...相信很多朋友应该依然存在自己的疑惑,特别是越来越火热的微服务以…

Spring Boot 2.x 启动全过程源码分析(全)

转载自 Spring Boot 2.x 启动全过程源码分析(全) 上篇《Spring Boot 2.x 启动全过程源码分析(一)入口类剖析》我们分析了 Spring Boot 入口类 SpringApplication 的源码,并知道了其构造原理,这篇我们继…

Vue 2017 现状与展望 | 视频+PPT+速记快速回顾

微软Typescript团队和VS Code团队亲自给Vue开发插件,下一个版本的Vue 2.4将由微软提供支持Vue使用Typescript,之前为VS Code写vue扩展插件的人已入职微软VS Code团队 讲师 | 尤雨溪 速记 | kalasoo 5 月 20 日,在全球首届 VueConf 上&#xf…

6 道 BATJ 必考的 Java 面试题

转载自 6 道 BATJ 必考的 Java 面试题 题目一 请对比 Exception 和 Error,另外,运行时异常与一般异常有什么区别? 考点分析: 分析 Exception 和 Error 的区别,是从概念角度考察了 Java 处理机制。总的来说&#…

终于知道什么情况下需要实现.NET Core中的IOptions接口

自从接触 IOptions 之后&#xff0c;一直纠结这样的问题&#xff1a;自己定义的 Options 要不要实现 IOptions 接口。 微软有的项目中实现了&#xff0c;比如 Caching 中的 MemoryCacheOptions &#xff1a; public class MemoryCacheOptions : IOptions<MemoryCacheOptio…

Amazing ASP.NET Core 2.0

前言 ASP.NET Core 的变化和发展速度是飞快的&#xff0c;当你发现你还没有掌握 ASP.NET Core 1.0 的时候&#xff0c; 2.0 已经快要发布了&#xff0c;目前 2.0 处于 Preview 1 版本&#xff0c;意味着功能已经基本确定&#xff0c;还没有学习过 ASP.NET Core 的同学可以直接…

Java面试常问计算机网络问题

转载自 Java面试常问计算机网络问题 一、GET 和 POST 的区别 GET请注意&#xff0c;查询字符串&#xff08;名称/值对&#xff09;是在 GET 请求的 URL 中发送的&#xff1a;/test/demo_form.asp?name1value1&name2value2 GET 请求可被缓存 GET 请求保留在浏览器历史…

使用DocFX生成文档

文档生成工具DocFX&#xff0c; 类似JSDoc或Sphinx&#xff0c;可以从源代码中提取注释生成文档之外&#xff0c;而且还有语法支持你加入其他的文件链接到API添加额外的说明&#xff0c;DocFX会扫描你的源代码和附加的文件为你生成一个完整的HTML模版网站&#xff0c;你可以自己…

如何在一分钟内搞定面试官

转载自 如何在一分钟内搞定面试官 很多人的求职面试的过程中都会遇到这个问题&#xff1a; “请做个自我介绍。” 有的人&#xff0c;可以口若悬河、妙语连珠讲3分钟&#xff0c;有的人&#xff0c;可能磕磕巴巴&#xff0c;讲了30秒&#xff0c;前者一定能胜过后者&#x…

基于ZKWeb + Angular 4.0的开源管理后台Demo

这是一套基于ZKWeb网页框架和Angular 4.0编写的开源管理后台Demo&#xff0c;实现了前后端分离和模块化开发&#xff0c; 地址是: https://github.com/zkweb-framework/ZKWeb.MVVMDemo &#xff0c;开源协议是MIT&#xff0c;你可以随意的修改并用于个人或商业用途 我之前已经…

祝我们的所有女孩子,女生节快乐~

公历3月7日是女生节。起源于20世纪90年代初&#xff0c;由山东大学发起&#xff0c;后发展于中国各高校&#xff0c;是一个关爱女生、展现高校女生风采的节日。女神节快乐祝我们18级青鸟1班的女孩儿们&#xff0c;女生节快乐&#xff01;愿快乐与你作陪&#xff0c;美丽将你跟随…

从 0 开始手写一个 Spring MVC 框架,向高手进阶

转载自 从 0 开始手写一个 Spring MVC 框架&#xff0c;向高手进阶 Spring框架对于Java后端程序员来说再熟悉不过了&#xff0c;以前只知道它用的反射实现的&#xff0c;但了解之后才知道有很多巧妙的设计在里面。如果不看Spring的源码&#xff0c;你将会失去一次和大师学习…

把Springboot项目部署到服务器上和结束运行

部署 nohup java -jar onlile-1.0.0-SNAPSHOT.jar &关闭 kill -9 22899 杀死 进程的pid &#xff0c;关闭程序。cat info.log 查看文件ps -ef | grep java 查看java 运行的几个进程 pid