秋招面经9.11

news2024/9/24 23:21:22

1. JWT的过程解析

JWT(JSON Web Token)是一种基于 JSON 的开放标准(RFC 7519)实现的用于在各方之间传递信息的紧凑且自包含的方式。JWT 是一种 token,可以对信息进行数字签名(例如使用 HMAC 算法或 RSA 加密),因此可以保证信息的真实性和完整性。
JWT 的结构由三部分组成:Header(头部)Payload(负载)Signature(签名),这三部分通过点(.)进行分隔。JWT 的过程可以分为生成和验证两个主要步骤。

1.1 JWT生成过程

1.Header(头部):
类型:声明这是一个JWT.
签名算法: 指定用于签名的算法,如 HMAC SHA256 或 RSA。

{
  "alg": "HS256",
  "typ": "JWT"
}

2. Payload(负载)
包含要传输的数据(声明),这些声明可以是标准化的字段,也可以是自定义字段,常见的标准字段包括:
iss (issuer):签发者
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
例如:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

3.Signature(签名):
将编码后的 Header、编码后的 Payload 和一个密钥进行签名。签名过程如下:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret
)

生成的签名用于验证消息的发送者,以及保证消息在传输过程中未被篡改。
4. 完整的 JWT:
最终,JWT 生成的格式为:header.payload.signature。
例如,生成的 JWT 可能是:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

1.2 JWT验证过程

1.分离 JWT:
接收方获取 JWT 后,将其按 . 分割为三部分:Header、Payload 和 Signature。
2.验证签名:
使用接收方保存的密钥与 Header 中指定的算法,重新计算签名部分。如果计算结果与 JWT 中的 Signature 一致,则表明数据未被篡改,且来源可信。
3.验证 Payload:
验证 Payload 中的声明,特别是时间相关的字段(如 exp 和 iat),以确定 JWT 是否仍然有效。
其他验证如 iss 和 aud 也可以根据需求进行。
4.使用 Payload 中的数据:
如果验证通过,接收方可以使用 Payload 中的数据来执行进一步的业务逻辑。

JWT 通过将认证信息和其他声明封装在一个自包含的令牌中,使得服务器端无需保存会话状态。这种机制使得 JWT 特别适合分布式系统中的身份认证和信息传递。不过,在使用 JWT 时要特别注意令牌的存储安全性以及令牌的过期时间设置,防止重放攻击等安全问题。

2.Http建立连接的过程

HTTP(Hypertext Transfer Protocol)是应用层协议,通常运行在 TCP/IP 协议之上。HTTP 的工作原理基于请求-响应模型,即客户端向服务器发送请求,服务器返回响应。为了理解 HTTP 建立连接的过程,我们需要了解其底层的 TCP 三次握手过程。以下是 HTTP 建立连接的过程概述:
1.DNS 解析
在建立 HTTP 连接之前,首先需要将域名解析为 IP 地址。这是通过 DNS(Domain Name System)完成的。
步骤:
客户端向 DNS 服务器发送请求,询问某个域名对应的 IP 地址。
DNS 服务器返回相应的 IP 地址。
客户端获得 IP 地址后,才能与对应的服务器建立连接。
2. TCP三次握手
HTTP 运行在 TCP 协议之上,连接的建立依赖于 TCP 的三次握手过程。三次握手的目的是在客户端和服务器之间建立可靠的传输通道。
步骤:

  1. SYN(Synchronize): 客户端向服务器发送一个 SYN 报文,表示请求建立连接,并且客户端进入 SYN_SENT 状态。

  2. SYN-ACK(Synchronize-Acknowledgment): 服务器收到 SYN 报文后,回应一个 SYN-ACK 报文,表示同意建立连接,并且服务器进入 SYN_RECEIVED 状态。

  3. ACK(Acknowledgment): 客户端收到服务器的 SYN-ACK 报文后,发送一个 ACK 报文以确认连接建立。此时,客户端和服务器都进入 ESTABLISHED 状态,TCP 连接建立完成。

3. HTTP 请求与响应
TCP 连接建立后,客户端可以发送 HTTP 请求,服务器接收到请求后会进行处理并返回响应。
步骤:
1.客户端发送请求:
客户端向服务器发送一个 HTTP 请求报文,包含请求行(方法、URL、协议版本)、请求头部(Host、User-Agent 等)、以及可选的请求体(如 POST 数据)。
例如:

GET /index.html HTTP/1.1
Host: www.example.com

2. 服务器处理请求:
服务器收到请求后,根据请求的资源路径(URL)和方法(GET、POST 等)进行处理。
服务器处理完请求后,生成一个 HTTP 响应报文。

3. 服务器返回响应:
服务器将响应报文返回给客户端,包含响应行(协议版本、状态码、状态描述)、响应头部(Content-Type、Content-Length 等)、以及可选的响应体(如 HTML 内容)。
例如:

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 137

<html>
<head><title>Example</title></head>
<body>Hello, World!</body>
</html>

4. 客户端处理响应
客户端收到响应后,根据状态码和响应头部进行处理,并将响应体中的数据呈现给用户(如浏览器显示 HTML 页面)。

4.连接关闭
在 HTTP/1.0 中,每个请求响应对之间都需要建立和关闭一次 TCP 连接。而在 HTTP/1.1 中,默认启用 Keep-Alive 机制,允许在同一 TCP 连接上传递多个请求和响应,从而减少连接建立和关闭的开销。
TCP 四次挥手:
连接关闭时,TCP 使用四次挥手来确保连接的关闭是可靠的:
1.FIN(Finish): 客户端发送 FIN 报文,表示不再发送数据,进入 FIN_WAIT_1 状态。
2.ACK: 服务器收到 FIN 后,回应 ACK 报文,进入 CLOSE_WAIT 状态。
3.FIN: 服务器发送 FIN 报文,表示不再发送数据,进入 LAST_ACK 状态。
4.ACK: 客户端收到 FIN 后,回应 ACK 报文,进入 TIME_WAIT 状态。等待一段时间后,关闭连接。

HTTP 建立连接的过程依赖于底层的 TCP 三次握手,而整个过程包括 DNS 解析、TCP 建立连接、HTTP 请求与响应,以及最终的连接关闭。在 HTTP/1.1 中,为了提高性能,可以使用连接复用(Keep-Alive)机制在同一个 TCP 连接上进行多次请求和响应。

3. 什么是网络编程?

网络编程是指编写能够在计算机网络上进行通信的应用程序的过程。它涉及创建软件,使计算机、设备或应用程序能够通过网络(如互联网、局域网)互相交换数据或资源。网络编程的核心是处理各种网络协议,使用不同的编程语言和技术栈来实现网络通信的功能。

3.1 基本概念

1.通信协议:
通信协议是网络编程的基础,定义了数据传输的规则、格式和顺序。常见的协议包括:
HTTP/HTTPS: 用于浏览器和服务器之间的数据传输。
TCP/IP: 提供可靠的、面向连接的数据传输。
UDP: 提供无连接的、不保证可靠性的快速数据传输。
FTP: 文件传输协议。
SMTP/POP3/IMAP: 电子邮件传输协议。
2.客户端-服务器模型:
网络编程通常采用客户端-服务器模型,其中客户端发起请求,服务器处理请求并返回响应。客户端可以是浏览器、移动应用、命令行工具等,服务器则是运行在远程计算机上的应用程序。
3.Socket(套接字):
Socket 是网络编程中用于建立连接和通信的编程接口。它提供了与网络协议的接口,使开发者可以通过 Socket API 创建、管理和关闭网络连接。
TCP Socket: 通过 TCP 协议进行通信,保证数据传输的可靠性和顺序。
UDP Socket: 通过 UDP 协议进行通信,适用于需要快速传输而不要求可靠性的场景。

4.网络编程中的编程语言:
网络编程可以使用多种编程语言实现,常见的包括:
C/C++: 提供底层的 Socket 编程接口,用于高性能的网络服务开发。
Java: 提供丰富的网络编程库,如 java.net 包,便于开发跨平台的网络应用。
Python: 提供了简单易用的 socket 模块和高级的网络框架(如 Flask、Django),适合快速开发网络应用。
JavaScript: 用于开发前端的网络交互功能(如 AJAX)、Node.js 服务器端开发等。

5.并发和多线程:
网络编程通常涉及并发处理,因为网络应用可能需要同时处理多个客户端的请求。这可以通过多线程、异步编程、事件驱动等方式实现。

6.安全性:
网络编程需要考虑数据传输的安全性,包括数据加密、认证、授权、防御攻击(如 SQL 注入、XSS、CSRF)等。

3.2 网络编程的应用场景

1.Web开发: 通过 HTTP/HTTPS 协议与服务器通信,实现动态网页、API 服务等功能。
2.实时通信: 使用 TCP、UDP、WebSocket 等技术开发即时通讯应用、在线游戏、视频会议等。
3.文件传输: 实现基于 FTP 或定制协议的文件上传、下载、共享服务。
4.物联网(IoT): 开发能够通过网络控制或监测硬件设备的应用程序。
5.分布式系统: 开发分布式计算系统,多个节点通过网络协同完成计算任务。

3.3 网络编程的挑战

网络延迟和带宽: 网络条件不稳定可能导致数据传输的延迟或丢失,需要合理处理重传和超时机制。
跨平台兼容性: 不同平台的网络编程接口可能有所不同,开发者需要考虑代码的可移植性。
安全问题: 开发者必须确保数据的传输和存储安全,防止被恶意攻击。

4. 生产环境下项目爆异常,怎么排查项目错误?

在生产环境中,当项目发生异常时,快速有效地排查问题非常重要。以下是排查生产环境项目错误的常见步骤和策略:

4.1 日志分析

查看日志: 首先,查看应用程序的日志文件。生产环境通常会有详细的日志记录,包括错误日志、警告日志和信息日志。这些日志可以提供关于异常发生的详细信息,如错误堆栈、发生时间、请求参数等。
日志级别: 确保生产环境的日志级别设置得当,一般应为 ERROR 或 WARN,但在排查问题时可以临时调整为 DEBUG 以获取更多细节。
集中式日志管理: 如果使用了集中式日志管理工具(如 ELK Stack、Splunk),可以通过关键字搜索、过滤和可视化的方式快速定位问题。

4.2 监控工具

应用性能监控(APM): 使用 APM 工具(如 New Relic、Prometheus、Datadog、SkyWalking)来监控应用的性能指标(如响应时间、CPU、内存、数据库查询时间)和错误率。这些工具通常可以帮助你快速定位性能瓶颈和异常代码段。
报警系统: 检查是否收到了监控系统的报警通知,报警可能会包含具体的异常信息和可能的根因分析。

4.3 查看系统资源

检查服务器资源: 通过监控或命令行工具(如 top、htop、free)检查服务器的 CPU、内存、磁盘 I/O、网络流量等资源使用情况,查看是否存在资源瓶颈或泄漏。
数据库性能: 检查数据库的运行状态和性能指标,如慢查询日志、连接池状态、死锁等问题。

4.4 重现问题

测试环境重现:如果可能,将生产环境的问题在测试环境或开发环境中重现,以便详细调试和分析。
特定请求分析:根据日志或监控,找到导致异常的特定请求或操作,然后在测试环境中模拟该请求或操作。

4.5 代码审查

错误栈追踪:通过日志中的错误堆栈信息,回溯问题发生的代码路径,找到异常发生的代码行。
最近的代码更改:检查最近是否有代码更新,尤其是异常发生之前的代码提交。新功能或变更往往是引发问题的原因。

4.6 第三方依赖

检查依赖版本: 如果使用了第三方库或服务,确认它们是否有兼容性问题或已知的 bug。
外部服务问题: 检查外部 API 或服务是否正常工作,是否有超时、网络问题或返回了错误的数据。

4.7 安全问题

安全漏洞检查: 排查是否由于安全问题导致的异常,如 SQL 注入、XSS、CSRF 等。检查系统的安全配置和日志中的可疑活动。
权限问题: 确认应用程序的各类操作权限设置是否正确,某些权限问题可能导致部分请求失败或异常。

4.8 回滚和恢复

快速回滚:如果异常导致了严重的问题且无法快速修复,考虑将代码或配置回滚到上一个稳定版本。
自动化恢复:确保有自动化的恢复机制,比如 Kubernetes 的健康检查与自动重启功能,可以帮助系统快速恢复。

4.9 与团队沟通

协作解决问题:与开发团队、运维团队和其他相关人员沟通,共同分析和解决问题。集体讨论可以提供更多的思路和解决方案。

4.10 总结与预防

问题总结: 问题解决后,进行总结,分析根本原因并记录下来,确保在未来的项目中避免类似问题。
增加监控与测试: 根据此次问题改进监控策略和自动化测试用例,尽量在开发和测试阶段发现问题。

5. Mysql三范式

MySQL中的数据库设计通常遵循三种范式(Normal Forms),即第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。这些范式旨在规范化数据库表的结构,减少数据冗余,提高数据的一致性和完整性。

5.1 第一范式(1NF)

定义: 第一范式要求数据库表中的每一列都必须是原子的,不可再分的数据项。也就是说,表中的每个字段都只能包含单一值,不能包含多个值或重复的组。
要点:
列中的值是不可分割的基本数据项。
表中没有重复的列。
例子:
在这里插入图片描述

5.2 第二范式(2NF)

定义: 第二范式在满足第一范式的基础上,要求表中的每个非主属性(非主键字段)都完全依赖于候选键的全部,而不是仅依赖于其中的一部分。第二范式消除了部分依赖。
要点:
表必须符合1NF。
非主键字段必须完全依赖于主键,而不是部分依赖。
例子:
在这里插入图片描述
在这个表中,学生姓名 依赖于 学生ID,而 课程名称 依赖于 课程ID,这是部分依赖,不符合2NF。
在这里插入图片描述

5.3 第三范式(3NF)

定义: 第三范式在满足第二范式的基础上,要求表中非主键字段不依赖于其他非主键字段,即消除传递依赖。3NF 消除了非主属性之间的依赖关系,确保每个非主键字段直接依赖于主键。
要点:
表必须符合2NF。
非主键字段之间不能有传递依赖。
例子:
在这里插入图片描述
在这个表中,系名称 依赖于 系ID,而 系ID 又依赖于 学生ID,这是传递依赖,不符合3NF。

符合3NF的表应该拆分为两个表:
在这里插入图片描述

总结
1.1NF 保证了列的原子性,即每个字段只能包含一个值。
2.2NF 消除了表中的部分依赖,使得每个非主键字段都完全依赖于主键。
3.3NF 消除了表中的传递依赖,确保每个非主键字段直接依赖于主键。

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

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

相关文章

[leetcode-python]杨辉三角2

给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0 输出: [1]示例 3: 输入: rowIndex 1 输出: [1,1]提示…

Mycat2原理介绍

Mycat介绍 Mycat原理 Mycat 核心配置 Scheam.xml 逻辑数据库和节点对应关系配置Server.xml mycat的连接配置Rule.xml. 分片规则 自动分片auto-sharding-long&#xff0c;比如0-10000节点1 &#xff0c;10001-20000节点2枚举分片sahrding-bt-intfile ,比如beijing节点1…

【828华为云征文|如何使用华为云Flexus X实例搭建私人博客:从配置到发布全指南】

文章目录 华为云Flexus X实例介绍搭建专属私人博客准备工作具体操作指南服务器环境确认宝塔软件商店操作一键部署WordPress私人博客域名解析WordPress安装初始页数据库信息配置运行安装程序配置博客信息博客管理后台&#xff08;默认为wp-login.php页面&#xff09;博客前台页面…

c语言位运算符速成

本篇文章对c语言速成系列的补充&#xff0c;其中的内容会涉及原反补以及& 、| 、 ~ 、^、位运算等等。那么&#xff0c;闲话少叙&#xff0c;我们直接进入正题 首先我们先来讲讲原反补 进制转换&#xff08;前置知识&#xff09; 在学原反补之前我们先来学几个机制转换的…

网络高级(学习)2024.9.10

目录 一、Modbus简介 1.起源 2.特点 3.应用场景 二、Modbus TCP协议 1.特点 2.协议格式 3.MBAP报文头 4.功能码 5.寄存器 &#xff08;1&#xff09;线圈寄存器&#xff0c;类比为开关量&#xff0c;每一个bit都对应一个信号的开关状态。 &#xff08;2&#xff09…

C++——STL——栈(stack)

栈的定义 栈 &#xff08; stack &#xff09;是限定仅在表的一端进行插入和删除操作的线性表&#xff0c;允许插入和删除的一端称 为栈顶&#xff0c;另一端称为栈底&#xff0c;不含任何数据元素的栈称为空栈。 栈的示意图 因为栈只能够在一端进行插入和删除&#xff0c;所以…

【Lua学习】Lua入门

上一篇帖子【Lua学习】Lua最最基础的 – 经云的清净小站 (skycreator.top)讲了Lua是什么&#xff0c;Lua如何安装在Linux和Windows上。那么安装好之后&#xff0c;我们就要使用Lua实现我们的各种功能了。 首先&#xff0c;我们要先了解Lua一些最基本的内容&#xff0c;比如怎么…

杀毒软件 | Malware Hunter v1.189.0.816 绿色版

软件简介 Malware Hunter是由Glarysoft开发的一款专业安全防护软件。该软件的主要目的是保护用户的计算机免受恶意软件、病毒和其他网络威胁的侵害。它通过采用高效的云引擎和小红伞引擎&#xff0c;能够快速且全面地扫描电脑中的恶意软件&#xff0c;并进行强力清除&#xff…

5--SpringBoot、Mybatis

目录 Mybatis Mybatis入门操作步骤 1.准备工作 创建springboot工程 创建数据库表和实体类 连接数据库 创建接口XxxMapper 2.数据库连接池 Lombok 使用 Mybatis 准备工作 删除 日志输入 参数占位符 新增 更新 查询 驼峰命名 条件查询 XML 创建XML文件 编…

关于前端知识中框架概念部分的详细介绍

1、为什么要学习流行框架&#xff1f; 企业&#xff1a;为了提高效率&#xff0c;因为时间就是金钱。开发人员&#xff1a;提高了开发效率发展进程&#xff1a; JS>JQuery>模板引擎>框架时代&#xff08;Angular(2)、React、Vue&#xff09;好处&#xff1a;不用直接…

2.安卓逆向-初识java语言

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 上一个内容&#xff1a;1.安卓逆向-说明 关于java语言的介绍就不写了没啥用直接开始 首先java语言写的代码运行说明 …

kolors文生图框架安装

环境安装 根据Kolors【github】的指引&#xff0c;安装命令如下&#xff1a; apt-get install git-lfs git clone https://github.com/Kwai-Kolors/Kolors cd Kolors conda create --name kolors python3.8 conda activate kolors pip install -r requirements.txt python3 s…

Vue3+TS项目封装SVG图标显示组件vite-plugin-svg-icons插件使用

准备好svg文件 假设从iconfont-阿里巴巴矢量图标库下载了一个svg格式的图标&#xff0c;放在我们项目里&#xff0c;并重命名为ic_money.svg&#xff0c;相对路径为&#xff1a;src\assets\images\icons\ic_money.svg 安装vite-plugin-svg-icons插件 npm install vite-plugi…

常用电路及分析

前言 最近在研究一些简单的硬件知识&#xff0c;把在网上看到的一些常见电路分析总结了一下。 有纰漏请指出&#xff0c;转载请说明。 学习交流请发邮件 1280253714qq.com 串联稳压电路 三极管串联线性稳压电路原理详解及Multisim仿真_三极管稳压电路-CSDN博客 线性稳压电…

Java小白一文讲清Java中集合相关的知识点(八)

HashMap底层机制及源码剖析 HashMap底层维护了Node类型的数组table,默认为null 当创建对象时&#xff0c;将加载因子初始化为0.75&#xff1b; 当添加key-value时&#xff0c;通过key的哈希值得到在table的索引&#xff0c;然后判断该索引处是否有元素&#xff0c;如果没有元…

力扣 — — 2555. 两个线段获得的最多奖品

力扣 — — 2555. 两个线段获得的最多奖品 一、题目描述 题目大意&#xff1a;给定一个数组prizePositions&#xff0c;数组中的值表示的是奖品的位置&#xff0c;每一个位置可以有多个奖品&#xff0c;并且设定一个线段的长度 K K K&#xff0c;要求从所有奖品位置中选择两个…

修改Netty 中EventLoopGroup的线程名字前缀

此方案针对 netty 4 , 阅读Netty 源码的过程中涉及到多种线程跳转&#xff0c;2-1 3-1 4-1 类似的命名头晕眼花&#xff0c;直接改了成方便辨认的名字吧&#xff01; 代码如下&#xff1a; public static EventLoopGroup getEventLoopGroup(String name, int nThread) {Defaul…

第十一周:机器学习

第十一周周报 摘要Abstract机器学习1. 注意力机制&#xff08;下&#xff09;1.1 multi-head self-attention&#xff08;多头注意力机制&#xff09;1.2 Positional Encoding&#xff08;位置编码&#xff09;1.3 truncated self attention&#xff08;截断式注意力机制&#…

SVGJS使用

svgjs用于操作 SVG 和动画的轻量级库。 官网 SVG.js v3.2 |家 (svgjs.dev) 1、安装 npm install svgdotjs/svg.js 或者下载直接引用 2、使用 <script src"https://cdn.jsdelivr.net/npm/svgdotjs/svg.js3.0/dist/svg.min.js"></script> import { S…

Win11 22H2/23H2用户速来!9月更新补丁KB5043076已发布

系统之家于9月11日发出最新报道&#xff0c;微软针对Win11用户发布了9月最新的更新补丁KB5043076&#xff0c;22H2用户升级系统后&#xff0c;版本号升至22621.4169&#xff0c;23H2用户的系统版本也升至22631.4169。此次更新支持用户从Windows分享窗口将内容共享到安卓设备。以…