【网络面试篇】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 里 包含 一条 或 者多个 FrameFrame 是 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://www.mzph.cn/pingmian/59127.shtml

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

相关文章

FastAPI 请求体解析:基础概念与综合应用

FastAPI 请求体解析:基础概念与综合应用 本文深入探讨了 FastAPI 中的请求体概念,强调使用 Pydantic 模型来声明请求体数据结构。通过具体示例,展示了如何定义请求体、可选参数及默认值,提升数据验证和类型提示的便利性。文章还说…

Python并发编程库:Asyncio的异步编程实战

Python并发编程库:Asyncio的异步编程实战 在现代应用中,并发和高效的I/O处理是影响系统性能的关键因素之一。Python的asyncio库是专为异步编程设计的模块,提供了一种更加高效、易读的并发编程方式,适用于处理大量的I/O密集型任务…

Golang--数组、切片、映射

1、数组 1.1 数组类型 var 数组名 [数组大小]数据类型 package main import "fmt"func main(){//1、定义一个数组var arr1 [5]intarr1[0] 100arr1[1] 200fmt.Println(arr1) //[100 200 0 0 0] } 1.2 数组的初始化方式 package main import "fmt" func …

在VS中安装chatGPT

2、在VSCode中打开插件窗口 3、输入ChatGPT 4、这里有个ChatGPT中文版,就它了 5、安装 6、这时候侧边栏多了一个chatGPT分页图标,点击它 7、打个招呼 8、好像不行 9、看一下细节描述 10、根据要求按下按下快捷键 Ctrl Shift P 11、切换成国内模式 12、…

Linux下的Debugfs

debugfs 1. 简介 类似sysfs、procfs,debugfs 也是一种内存文件系统。不过不同于sysfs一个kobject对应一个文件,procfs和进程相关的特性,debugfs的灵活度很大,可以根据需求对指定的变量进行导出并提供读写接口。debugfs又是一个Li…

Fooocus图像生成软件本地部署教程:在Windows上快速上手AI创作

文章目录 前言1. 本地部署Fooocus图像生成软件1.1 安装方式1.2 功能介绍 2. 公网远程访问Fooocus3. 固定Fooocus公网地址 前言 本篇文章将介绍如何在本地Windows11电脑部署开源AI生图软件Fooocus,并结合Cpolar内网穿透工具轻松实现公网环境远程访问与使用。 Foooc…

修改HarmonyOS鸿蒙图标和名字,打包后安装到真机,应用图标丢失变成透明,修改名字也不生效,还是默认的labeL解决方案教程

HarmonyOS鸿蒙打包hap 安装应用到桌面没有图标,用hdc安装到真机,打包后应用图标丢失变成透明,名字也还是默认的label的bug,以下是解决方案 以下是修改方案: 1、修改应用名字: 2、修改应用图标&#xff1a…

Python小游戏20——超级玛丽

首先,你需要确保你的Python环境中安装了pygame库。如果还没有安装,可以使用以下命令进行安装: bash pip install pygame 运行效果展示 代码展示 python import pygame import sys # 初始化pygame pygame.init() # 设置屏幕尺寸 screen_width …

从富文本窥探苹果的代码秘密

从富文本窥探苹果的代码秘密 背景 在我们的业务场景下,为突出诸如 “利益点”和“利率” 等特性以推动订单成交,引入了 “富文本” 这一概念。富文本具备丰富格式的文本展示与编辑功能。然而,恰是由于富文本具有 “多样式”“复杂排版” 等特…

openstack之guardian介绍与实例创建过程

运行特征 采集模块:扩展Ceilometer,采集存储网、业务网连通性、nova目录是否可读写; 收集模块:将采集到的数据存储到数据库中; 分析模块:根据采集的结果,分析各节点状态,并进行反向检…

AVLTree

1.AVL树的概念 二叉搜索树虽然可以提高查找的效率,但是如果数据有序或者接近有序,二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。为了解决该问题,于是就有了AVLTree。即当向二叉搜索树中插入…

【数据结构二叉树】C非递归算法实现二叉树的先序、中序、后序遍历

引言: 遍历二叉树:指按某条搜索路径巡访二叉树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。 除了层次遍历外,二叉树有三个重要的遍历方法:先序遍历、中序遍历、后序遍历。 1、递归算法实现先序、中序、后…

深入学习 Scrapy 框架:从入门到精通的全面指南

深入学习 Scrapy 框架:从入门到精通的全面指南 引言 在数据驱动的时代,网络爬虫成为了获取信息的重要工具。Scrapy 是一个强大的 Python 爬虫框架,专为快速高效地提取网页数据而设计。本文将深入探讨 Scrapy 的使用,从基础知识到…

蓝桥杯 区间移位--二分、枚举

题目 代码 #include <stdio.h> #include <string.h> #include <vector> #include <algorithm> #include <iostream> using namespace std; struct node{ int a,b; }; vector<node> q; bool cmp(node x,node y){ return x.b <…

SpringBoot+VUE2完成WebSocket聊天(数据入库)

下载依赖 <!-- websocket --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><!-- MybatisPlus --><dependency><groupId>com.ba…

图文深入介绍Oracle DB link(一)

1. 引言&#xff1a; 本文图文深入介绍Oracle DB link&#xff0c;先介绍基本概念。 2.DB link的定义 数据库链接&#xff08;Database Link&#xff0c;简称 DB Link&#xff09;是 Oracle 数据库中的一个重要功能。它是一种在一个 Oracle 数据库实例中访问另一个 Oracle 数…

MoonBit 双周报 Vol.59:新增编译器常量支持,改进未使用警告,支持跨包函数导入...多个关键技术持续优化中!

2024-11-04 MoonBit更新 增加了编译期常量的支持。常量的名字以大写字母开头&#xff0c;用语法 const C ... 声明。常量的类型必须是内建的数字类型或 String。常量可以当作普通的值使用&#xff0c;也可以用于模式匹配。常量的值目前只能是字面量&#xff1a; const MIN_…

HTB:Shocker[WriteUP]

目录 连接至HTB服务器并启动靶机 1.How many TCP ports are listening on Shocker? 使用nmap对靶机TCP端口进行开放扫描 2.What is the name of the directory available on the webserver that is a standard name known for running scripts via the Common Gateway Int…

力扣——另一个的子树(C语言)

1.题目&#xff1a; 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree …

【C++】对左值引用右值引用的深入理解(右值引用与移动语义)

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》 ⛰️ 天高地阔&#xff0c;欲往观之。 ​ 目录 前言&#xff1a;对引用的底层理解 一、左值与右值 提问&#xff1a;左值在左&#xff0c;右值在右&#xff1f;…