【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0
目录
一、相关面试题
1. HTTP 与 HTTPS 有哪些区别?
2. HTTPS 的工作原理?(https 是怎么建立连接的)
(1)ClientHello
(2)SeverHello
(3)客户端回应
(4)服务器的最后回应
综述
3. HTTP1.0 和 HTTP1.1的区别?
(1)长连接
(2)缓存
(3)管道化
(4)增加 Host 字段
(5)状态码
(6)带宽优化
4. HTTP2.0 与 HTTP1.1 的区别?
(1)二进制分帧
(2)多路复用 (MultiPlexing)
(3)首部压缩
(4)服务端推送(server push)
补充:详述 HTTP2.0 改进点
① 头部压缩
② 二进制格式
③ 并发传输
④ 服务器推送
一、相关面试题
1. HTTP 与 HTTPS 有哪些区别?
- HTTP 是 超文本传输协议,信息是 明文传输,存在 安全风险的 问题。HTTPS 则解决 HTTP 不安全的 缺陷,在 TCP 和 HTTP 网络层之间 加入了 SSL/TLS 安全协议,使得 报文 能够 加密传输。
- HTTP 连接建立 相对简单,TCP 三次握手 之后便可 进行 HTTP 的 报文传输。而 HTTPS 在TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入 加密报文 传输。
- 两者的 默认端口 不一样,HTTP 默认端口号是 80,HTTPS 默认端口号是 443。
- HTTPS 协议需要 向 CA(证书权威机构)申请数 字证书,来 保证服务器的 身份是 可信的。
2. HTTPS 的工作原理?(https 是怎么建立连接的)
SSL/TLS 协议基本流程:
- 客户端 向服务器 索要并 验证服务器的 公钥。
- 双方协商生产「会话秘钥」。
- 双方采用「会话秘钥」进行加密通信。
前两步也就是 SSL/TLS 的建立过程,也就是 TLS 握手阶段。TLS的「握手阶段」涉及 四次通信,使用 不同的 密钥交换算法,TLS 握手流程也会不一样的,现在常用的 密钥交换算法 有两种:RSA 算法 和 ECDHE 算法。下图为 TLS 握手过程:
TLS 协议建立的详细流程:
(1)ClientHello
首先,由 客户端 向服务器 发起加密通信 请求,也就是 ClientHello 请求。在这一步,客户端 主要向 服务器发送 以下信息:
- 客户端 支持的 TLS 协议版本,如 TLS 1.2 版本。
- 客户端 生产的 随机数(Client Random ),后面 用于生成「会话秘钥」条件之一。
- 客户端 支持的 密码套件列表,如 RSA 加密算法。
(2)SeverHello
服务器 收到客户端 请求后,向 客户端 发出响应,也就是 SeverHello。服务器 回应的内容 有如下内容:
- 确认 TLS 协议版本,如果 浏览器 不支持,则 关闭 加密通信。
- 服务器生产的 随机数(Server Random ),也是 后面 用于 生产「会话秘钥」条件之一。
- 确认的 密码套件列表,如 RSA 加密算法。
- 服务器的 数字证书。
(3)客户端回应
客户端 收到 服务器的 回应之后,首先 通过 浏览器 或者 操作系统中的 CA 公钥,确认 服务器的数字证书的 真实性。如果 证书 没有问题,客户端会 从数字证书中 取出 服务器的 公钥,然后 使用它 加密报文,向 服务器发送如下信息:
- 一个随机数( pre-master key )。该 随机数会 被服务器 公钥加密。
- 加密通信算法 改变通知,表示 随后的信息 都将用「会话秘钥」加密通信。
- 客户端 握手结束 通知,表示 客户端的 握手阶段 已经结束。这一项 同时把 之前 所有内容的 发生的数据 做个摘要,用来 供服务端 校验。
上面 第一项的 随机数是 整个握手阶段的 第三个随机数,会发给 服务端,所以 这个随机数 客户端 和 服务端 都是一样的。服务器和客户端 有了这 三个随机数(Client Random、Server Random、pre-master key),接着就用 双方协商的 加密算法,各自生成 本次 通信的「会话秘钥」。
(4)服务器的最后回应
服务器收到 客户端的 第三个随机数(pre-master key)之后,通过 协商的 加密算法,计算出 本次通信的「会话秘钥」。然后,向客户端发送最后的信息:
- 加密通信算法 改变通知,表示 随后的 信息都 将用「会话秘钥」加密通信。
- 服务器 握手结束 通知,表示 服务器的 握手阶段 已经结束。这一项 同时 把之前 所有内容的 发生的数据 做个摘要,用来 供客户端 校验。
至此,整个 TLS 的握手阶段 全部结束。接下来,客户端 与 服务器 进入加密通信,就 完全是 使用普通的 HTTP 协议,只不过用「会话秘钥」加密内容。
综述
- 客户端发送连接请求:当 客户端 想要与 服务器 建立 HTTPS 连接时,它会 发送一个 连接请求 到 服务器 的 443 端口,表明 它想要 使用 HTTPS 进行 通信。
- 服务器响应:服务器 收到连接请求 后,会 发送一个 CA 数字证书 给客户端。这个 证书 包含了 服务器的 公钥、证书的 颁发者信息 以及 其他相关信息。
- 客户端验证证书:客户端 接收到 服务器 发送的 数字证书 后,会 验证证书的 合法性。这个过程 包括 验证证书的 签名、证书 是否过期、是否 与 预期域名匹配 等。
- 生成会话密钥:如果 证书验证 成功,客户端 会 生成一个 用于该 连接的 随机 会话密钥(对称 密钥)。这个 密钥将用于 加密 通信数据。
- 用公钥加密会话密钥:客户端 使用 服务器的 公钥,将 生成的 会话密钥 进行加密,并将 加密后的 会话密钥 发送给 服务器。
- 服务器解密会话密钥:服务器 使用 自己的 私钥 对 客户端 发送的 加密 会话密钥 进行解密,获得 会话密钥。
- 建立安全通信:从 此时开始,客户端 和 服务器 都有了 相同的 会话密钥,他们 使用 对称加密算法(如 AES)来 加密 和 解密 通信数据,保证了 通信的 隐私性 和 完整性。
3. HTTP1.0 和 HTTP1.1的区别?
(1)长连接
- HTTP1.1 支持 长连接,每一个 TCP 连接上可以 传送 多个 HTTP 请求和响应,默认 开启 Connection:Keep-ALive。
- HTTP1.0 默认为 短连接,每次 请求 都需要 建立一个 TCP 连接。
(2)缓存
- HTTP1.0 主要使用 If-Modified-Since/Expires 来做为 缓存 判断的 标准。
- HTTP1.1 则 引入了 更多的 缓存控制 策略 例如 Entity tag / If-None-Match 等 更多 可供选择的 缓存头来 控制 缓存策略。
(3)管道化
- 基于 HTTP1.1 的 长连接,使得 请求 管线化 成为可能。管线化 使得 请求能够 “并行” 传输,但是响应 必须按照 请求 发出的顺序 依次返回,性能 在一定 程度上 得到了改善。(管道网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间)
(4)增加 Host 字段
- 使得 一个服务器 能够 用来 创建 多个 web 站点。
(5)状态码
- 新增了 24 个 错误状态 响应码。
(6)带宽优化
- HTTP1.0 中,存在 一些 浪费带宽的 现象,例如 客户端 只是 需要 某个对象的 一部分,而 服务器却 将整个 对象 送过来了,并且 不支持 断点 续传功能。
- HTTP1.1 则在 请求头 引入了 range 头域,它 允许 只请求 资源的 某个部分,即 返回码 是 206(Partial Content)。
4. HTTP2.0 与 HTTP1.1 的区别?
(1)二进制分帧
- 在 应用层(HTTP/2.0) 和 传输层(TCP or UDP) 之间增加一个二进制分帧层,从而 突破 HTTP1.1 的 性能限制,改进 传输性能,实现 低延迟 和 高吞吐量。
(2)多路复用 (MultiPlexing)
- 允许 同时 通过 单一的 HTTP/2 连接 发起 多重的请求-响应消息,这个 强大的 功能则是 基于 “二进制分帧” 的特性。
(3)首部压缩
- HTTP1.1 不支持 header 数据的压缩, HTTP/2.0 使用 HPACK 算法对 header 的数据 进行压缩,这样 数据体积 小了,在 网络上 传输就会 更快。高效的 压缩算法 可以 很大的压缩 header,减少发送包的 数量从而 降低延迟。
(4)服务端推送(server push)
- 在 HTTP/2 中,服务器 可以 对 客户端的 一个请求 发送 多个响应,即 服务器 可以 额外的 向客户端 推送资源,而 无需 客户端 明确的 请求。
补充:详述 HTTP2.0 改进点
① 头部压缩
HTTP/2 会 压缩 头(Header)如果你 同时 发出多个请求,他们的 头 是一样的 或是 相似的,那么,协议 会 帮你 消除 重复的 部分。
这就是 所谓的 HPACK 算法:在 客户端 和 服务器 同时 维护一张 头信息表,所有字段 都会 存入 这个表,生成 一个 索引号,以后就 不发送 同样字段了,只发送 索引号,这样就 提高速度了。
② 二进制格式
HTTP/2 不再像 HTTP/1.1 里的 纯文本形式的 报文,而是 全面 采用了 二进制 格式,头信息 和 数据体 都是 二进制,并且 统称为 帧 (frame):头信息帧(Headers Frame) 和 数据帧 (Data Frame)。
因为 计算机 只懂二进制,那么 收到报文后,无需 再将 明文的报文 转成 二进制,而是 直接 解析二进制报文,这 增加了 数据传输的 效率。
③ 并发传输
HTTP/1.1 的实现是 基于 请求-响应模型 的。同一个连接中,HTTP 完成一个 事务(请求 与 响应),才能 处理 下一个事务,也就是说 在 发出 请求等待响应 的过程中,是 没办法 做其他 事情的,如果 响应 迟迟不来,那么 后续的 请求是 无法发送的,也 造成了 队头阻塞的 问题。
HTTP/2 引出了 Stream 概念,多个 Stream 复用在一条 TCP 连接。
从上图可以看到,1 个 TCP 连接包含多个 Stream,Stream 里可以包含 1 个 或 多个 Message,Message 对应 HTTP/1 中的 请求或响应,由 HTTP 头部 和 包体构成。Message 里 包含 一条 或 者多个 Frame,Frame 是 HTTP/2 最小单位,以 二进制 压缩格式 存放 HTTP/1 中的内容(头部和包体)。
针对 不同的 HTTP 请求 用 独一无二 的 Stream ID 来区分,接收端 可以 通过 Stream ID 有序 组装成 HTTP 消息,不同 Stream 的帧是 可以 乱序 发送的,因此 可以 并发 不同的 Stream,也就是HTTP/2 可以 并行交错地 发送请求 和 响应。
如下图,服务端 并行交错 地 发送了 两个响应:Stream 1 和 Stream 3,这两个 Stream 都是 跑在一个 TCP 连接上,客户端 收到后,会 根据 相同的 Stream ID 有序 组装成 HTTP 消息。
④ 服务器推送
HTTP/2 还 在一定程度上 改善了 传统的「请求- 应答」工作模式,服务端 不再是 被动地 响应,可以 主动 向客户端 发送消息。
客户端 和 服务器 双方 都可以 建立 Stream, Stream ID 也是 有区别的,客户端 建立的 Stream 必须是 奇数号,而 服务器 建立的 Stream 必须是 偶数号。
如下图,Stream 1 是 客户端 向 服务端 请求的资源,属于 客户端 建立的 Stream,所以该 Stream 的 ID 是奇数(数字 1);Stream 2 和 4 都是 服务端 主动向 客户端 推送的 资源,属于 服务端 建立的 Stream,所以 这两个 Stream 的 ID 是 偶数(数字 2 和 4)。
再比如,客户端 通过 HTTP/1.1 请求 从 服务器 那获 取到了 HTML 文件,而 HTML 可能 还需要 依赖 CSS 来 渲染页面,这时 客户端 还要 再发起 获取 CSS 文件的 请求,需要 两次 消息往返,如下图 左边部分:
如 上图 右边部分,在 HTTP/2 中,客户端在 访问 HTML 时,服务器 可以 直接主动推送 CSS 文件,減少了 消息传递的 次数。
相关文章:

【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0
目录 一、相关面试题 1. HTTP 与 HTTPS 有哪些区别? 2. HTTPS 的工作原理?(https 是怎么建立连接的) (1)ClientHello (2)SeverHello (3)客户端回应 &a…...
python-23-一篇文章帮你理解Python推导式
python-23-一篇文章帮你理解Python推导式 一.简介 在 Python 中,推导式(Comprehensions)是一个简洁的语法,用于通过某种可迭代对象快速生成新的对象(如列表、字典、集合等!来开始我们今天的日拱一卒&…...

WPF中如何简单的使用CommunityToolkit.Mvvm创建一个项目并进行 增删改查
目录 开始前准备的数据库dbblog如下: 第一步:创建项目后下载四个NuGet程序包 第二步:删除原本的MainWindow.XAML文件 并创建如下的目录结构 然后在View文件夹下面创建Login.XAML和Main.XAML 并且在App.XAML中将启动项改为Login.X…...
CesiumJS 案例 P15:检测标记、鼠标点击移动标记、鼠标拖动标记
CesiumJS CesiumJS API:https://cesium.com/learn/cesiumjs/ref-doc/index.html CesiumJS 是一个开源的 JavaScript 库,它用于在网页中创建和控制 3D 地球仪(地图) 一、检测标记 <!DOCTYPE html> <html lang"en&…...

Webserver(4.9)本地套接字的通信
目录 本地套接字 本地套接字 TCP\UDP实现不同主机、网络通信 本地套接字实现本地的进程间的通信,类似的,一般采用TCP的通信流程 生成套接字文件 #include<arpa/inet.h> #include<stdio.h> #include<stdlib.h> #include<unistd.h&…...

[IAA系列] Image Aesthetic Assessment
Preface 本文旨在记录个人结合AI工具对IAA这个领域的一些了解,主要是通过论文阅读的方式加深对领域的了解。有什么问题,欢迎在评论区提出并讨论。 什么是IAA Image Aesthetic Assessment(图像美学评估)是一种评估图像在视觉上的…...

基于springboot的高校科研管理系统(源码+调试+LW)
项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据你想解决的问题,今天给…...

Flutter环境配置
配置环境变量 PUB_HOSTED_URLhttps://pub.flutter-io.cn FLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cn 这个命令是用来配置 Flutter 的镜像源地址,主要是为了解决在中国大陆地区访问 Flutter 官方资源较慢的问题 具体的操作做如下: 右键点击"此…...

Rip动态路由及Rip动态路由优化
动态路由Rip Tip:Rip动态路由实现多个路由间不同网段通信。 本次实验目的,通过给ar1,ar2,ar3配置rip动态路由,实现pc1 ping通 pc2。 AR1配置如下: <Huawei>sy Enter system view, return user view with CtrlZ. [Huawei]…...
双路快速排序和三路排序算法
双路快速排序 一、概念及其介绍 双路快速排序算法是随机化快速排序的改进版本,partition 过程使用两个索引值(i、j)用来遍历数组,将 <v 的元素放在索引i所指向位置的左边,而将 >v 的元素放在索引j所指向位置的…...
SQL server增删改查语句和实例
在 SQL Server 中,增删改查操作分别对应 INSERT、DELETE、UPDATE 和 SELECT 语句。以下是具体介绍及实例: 一、插入数据(INSERT) 语法: INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, val…...

强化学习_06_pytorch-PPO2实践(ALE/Breakout-v5)
一、环境适当调整 数据收集:RecordEpisodeStatistics进行起始跳过n帧:baseSkipFrame一条生命结束记录为done:EpisodicLifeEnv得分处理成0或1:ClipRewardEnv叠帧: FrameStack 图像环境的基本操作,方便CNN捕捉智能体的行动 向量空间reset处理修…...

《JVM第8课》垃圾回收算法
文章目录 1.标记算法1.1 引用计数法1.2 可达性分析法 2.回收算法2.1 标记-清除算法(Mark-Sweep)2.2 复制算法(Coping)2.3 标记-整理算法(Mark-Compact) 3.三种垃圾回收算法的对比 为什么要进行垃圾回收&…...
SpringBoot整合Freemarker(二)
if分支 语法: <#if condition>... <#elseif condition2>... <#elseif condition3>... <#else>... </#if> 例子: <#if x 1>x is 1 </#if> --------------------------------- <#if x 1>x is 1 <…...

element plus el-form自定义验证输入框为纯数字函数
element plus 的el-form 使用自定义验证器,验证纯数字,禁止输入小数、中文、字母、特殊符号。input的maxlength为最大输入多少位长度 效果图 <el-form ref"dataFormRef" :model"dataForm" :rules"dataRules" label-w…...

Android笔记(三十一):Deeplink失效问题
背景 通过deeplink启动应用之后,没关闭应用的情况下,再次使用deeplink会失效的问题,是系统bug导致的。此bug仅在某些设备(Nexus 5X)上重现,launchMode并且仅当应用程序最初通过深层链接启动并再次通过深层…...

图神经网络初步实验
实验复现来源 https://zhuanlan.zhihu.com/p/603486955 该文章主要解决问题: 1.加深对图神经网络数据集的理解 2.加深对图神经网络模型中喂数据中维度变化的理解 原理问题在另一篇文章分析: 介绍数据集:cora数据集 其中的主要内容表示为…...

创建线程时传递参数给线程
在C中,可以使用 std::thread 来创建和管理线程,同时可以通过几种方式将参数传递给线程函数。这些方法包括使用值传递、引用传递和指针传递。下面将对这些方法进行详细讲解并给出相应的代码示例。 1. 值传递参数 当你创建线程并希望传递参数时ÿ…...

兴业严选|美国总统都是不良资产出身 法拍市场是否将大众化
北京时间11月6日,特朗普赢得美国大选。 说起特朗普那就不得不提他的发家史,那可真是一笔笔不良资产投资堆出来的。 没错,特朗普就是处理不良资产的高手,战果丰硕。 改造斯威夫特小镇、 康莫德酒店、打造特朗普(TRUM…...
C#-拓展方法
概念:为现有的非静态变量类型,添加方法 语法: 访问修饰符 static 返回值 函数名(this 拓展类名 参数名, 参数类型 参数名,参数类型 参数名....){} 而public static void F(this Console()){ }是错的。Console是静态类不可以为静态类添加方…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...