【计算机网络 - 基础问题】每日 3 题(六)

✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/fYaBd
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
📝推荐参考地址:https://www.xiaolincoding.com/(这个大佬的专栏非常有用!)

16. Cookies、Session、Token 的区别是什么?

  1. session

在服务器端记录,每一个会话会产生一个 session id。当用户打开某个 web 应用时,便与 web 服务器产生一次 session。服务器使用 session id 把用户的信息临时保存在了服务器上,用户离开网站后 session 会被销毁。这样服务器就会根据每个人 session id 的不同,区别开谁是谁了,从而返回给用户不同的请求结果。

缺点:

如果使用单个服务器的话,用户过多的话,会造成服务器开销太大。如果我们系统采用分布式的话,我们登录时,响应我们的那台机器会记录我们登录信息,万一下一个请求,响应我们的不是原来那台机器的话,它并没有存储我们之前会话信息,就会认为我们并没有登录。session 粘连或者 session 复制都不是特别好的方案。
那既然服务端存储这些 session id 这么麻烦,人类又想出一招,那就是把这些 session id 都存储在客户端。这个时候,cookie 运用而生

  1. cookie

cookie 是服务端保存在客户端的临时的少量的数据。cookie 由服务器生成,发送给浏览器,浏览器把 cookie 以 kv 形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该 cookie 发送给服务器。由于 cookie 是存在客户端上的,所以浏览器加入了一些限制确保 cookie 不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的 cookie 数量是有限的。

但是,cookie 这种方式很容易被恶意攻击者入侵,那么又怎么验证客户端发给我的 session id 的确是我生成的呢?如果不去验证,服务器都不知道他们是不是合法登录的用户,那些不怀好意的家伙们就可以伪造 session id,为所欲为了。

这就需要我们用一种加密的方法或者可以说暗号,来验证这个 id 是否由我自己的服务器之前生成而非恶意攻击者篡改的。

  1. token

但是这里会有个问题,服务器要保存所有用户的 session 信息,开销会很大,如果在分布式的架构下,就需要考虑 session 共享的问题,需要做额外的设计和开发,例如把 session 中的信息保存到 Redis 中进行共享;所以因为这个原因,有人考虑这些信息是否可以让客户端保存,可以保存到任何地方,并且保证其安全性,于是就有了 token。

token 是服务端生成的一串字符串,可以看做客户端进行请求的一个令牌。
当客户端第一次访问服务端,服务端会根据传过来的唯一标识 userId,运用一些加密算法,生成一个 token,客户端下次请求时,只需要带上 token,服务器收到请求后,会验证这个 token。

有些公司会建设统一登录系统(单点登录),客户端先去这个系统获取 Token,验证通过再拿着这些 token 去访问其他系统;API Gateway 也可以提供类似的功能,我们公司就是这样,客户端接入的时候,先向网关获取 token,验证通过了才能访问被授权的接口,并且一段时间后要重新获取 token。

session 的原理

(1)服务器在处理客户端请求过程中会创建 session,并且为该 session 生存唯一的 session id。(这个 session id 在随后的请求中会被用来重新获得已经创建的 session。在 session 被创建后,就可以调用 session 相关的方法向 session 中新增内容,这些内容只会保存在服务器中)。

(2)服务器将 session id 发送到客户端。

(3)当客户端再次请求时,就会带上这个 session id。

(4)服务器接收到请求之后就会一句 session id 找到相应的 session,完成请求。

注意:

1、虽然 session 保存在服务器,但它还是需要客户端浏览器的支持,因为 session 需要使用 cookie 作为识别标志。服务器会向客户端发送一个名为 JSEDDIONID 的 cookie,它的值为 session id。

2、当 cookie 被禁用时,可以使用 url 重写的方法:将 session 写在 URL 中,服务器再进行解析。

cookie 的生命周期

cookie 的生存时间是整个会话期间:浏览器会将 cookie 保存在内存中,浏览器关闭时自动删除这个 cookie。

cookie 的生存时间是长久有效的:手动将 cookie 保存在客户端的硬盘中,浏览器关闭的话,cookie 页不会清除;下次在打开浏览器访问对应网站内容,这个 cookie 就会自动再次发送到服务器。

token 认证流程

token 的认证流程与 cookie 很相似:

  1. 客户端使用用户名、密码做身份验证;
  2. 服务端收到请求后进行身份验证;(也可能是统一登录平台、网关)
  3. 验证成功后,服务端会签发一个 token 返回给客户端;
  4. 客户端收到 token 以后可以把它存储起来(可以放在);每次向服务端发送请求的时候,都要带着 token;
  5. token 会有过期时间,过期后需要重新进行验证;
  6. 服务端收到请求,会验证客户端请求里面的 token,验证成功,才会响应客户端的请求;

应用场景

总结下来就是: session 是空间换时间,token 是时间换空间。

分布式 session 解决方案

方案 1:session 复制(session 同步)

在这里插入图片描述

原理:就是让这两个服务器之间互相同步 session,比如左边服务器之前保存了一个 1,右边服务器之前保存了一个 2,他们两个一同步,那么左边服务器保存了 1,2,右边服务器也保存了 1,2。这样做的话,我们无论去哪个服务器,都相当于能拿到全量的 session 数据,这样就不用担心负载均衡到哪个服务器了。

优点:tomcat 原生支持,只需要修改一下配置文件,好多 tomcat 之间就能复制 session。

缺点:

  1. session 同步需要通过网络进行数据传输,就有延迟问题,同时会占用大量带宽,这样会压缩我们整个业务的带宽,会降低我们的处理能力。
  2. 假如我们这里有 100 台 tomcat,每一个 tomcat 里面 session 都只存了 1G 的数据,我们想要用同步方案来做的话,那相当于其他 tomcat 都要保存剩下 99 个人的所有全量数据,那相当于每个 tomcat 都至少需要 100G 的内存才能将 session 整个全量保存下来。因此,这个解决方案受到内存限制,我们服务器无法水平扩展,不能复制上好多个 tomcat 来进行使用。

总结:如果是大型分布式集群环境,由于所有的 web-server 都全量保存数据,所以这种方案我们不使用。而如果是小型系统里面,就 3/5 个 tomcat,我们想使用的话,就简单配置一下也还可以。

方案 2:客户端存储

在这里插入图片描述

原理:我们让客户端自己来存储 session,我们服务器想用哪些数据,读取浏览器带过来的 cookie 即可。这样可以节省服务器资源。

缺点:都是缺点。

  1. 每次 http 请求,携带用户在 cookie 中的完整信息,浪费网络带宽。
  2. session 数据放在浏览器的 cookie 中,有些浏览器遵循的标准不一样,它的长度限制不一样,比如长度限制 4k,因此不能保存大量信息。
  3. session 数据放在 cookie 中,存在泄露、篡改、窃取等安全隐患。

总结:上面的缺点都很致命,因此我们实际绝对不会使用这种方案。

方案 3:HASH 一致性(推荐)

在这里插入图片描述

原理:

利用了我们负载均衡机制,我们可以利用 ip 的哈希一致性,只要来自于同一个 ip 的,那我们就永远给它定位到同一个服务器,我们也不给它跑到第二个服务器了,这样比如标绿色的浏览器去的标绿色的服务器里面存的东西,无论多少次请求过来,都会落到标绿色服务器的身上,我们就能取得到。

我们 hash 一致性还可以结合业务字段,如下面的图,凡是 456 号用户他的请求都落在绿色服务器,凡是 123 号这个用户他的请求都落在橙色服务器。

优点:

  1. 只需要改负载均衡 nginx 的配置,让它做一个 ip hash,而不需要修改应用代码。
  2. 负载是均衡的:只要 hash 属性的值分布是均匀的,多台 web-server 的负载就是均衡的。
  3. 支持 web-server 水平扩展(而 session 复制方案是不行的,受内存限制)。

缺点:

  1. session 还是存在 web-server 中,因此 web-server 突然闪断或者重启了,可能会导致部分 session 丢失,这部分用户只要下次再过来,所有的数据都没了,他需要重新登录一遍,所有东西都得重新做一遍。
  2. 如果我们服务器要水平扩展,如果我们固定了也好,但是如果原来是 2 台服务器,现在加到了 4 台服务器,现在想要做哈希的话,相当于重新得计算一下,假设我们以前计算哈希最简单的方式,按照 ip 地址得到一个整数型的哈希,如果只有 2 台服务器,那么就可以对 2 求余操作,求到余数,如果余数是 1,就落到第一台服务器,如果没有余数,就落到第二台服务器。但如果变成了 4 台服务器,我们相当于就要对 4 进行求余操作,如果余 1,落到第一台服务器,余 2 落到第二台服务器,余 3 落到第三台服务器,没有余数我们落到第四台服务器。(即水平扩展后,rehash 后 session 重新分布,会有一部分用户路由不到正确的服务器)

总结:以上缺点问题不大,而且后来呢,我们 ip 哈希的这种也用的比较多,因为基于 session 本来就是具有有效期的,就算这次因为水平扩展原因或者服务器闪断原因没有了,那就相当于浏览器关掉了呗,那我们让用户重新再做一次登录即可。

方案 4:统一存储(推荐)

在这里插入图片描述

原理:

我们之前出现的所有问题是,因为浏览器访问我们服务的时候,由于负载均衡机制会跳到不同的服务器,而又由于 session 是每个服务器各自存储在各自内存空间的,所以这导致我们跳到下一个服务器以后,我们上一个服务器 session 里面的数据它就用不到了,那怎么办呢?

那我们就可以让 session 统一存储,无论是你哪个服务器,哪个 tomcat,你的 session 都不要存储到你的内存里面了,全部呢,大家都可以存到数据库,或者 redis 之类的速度更快的 nosql 中间件等等。所以,我们可以使用这种方案。

优点:

  1. 没有安全隐患,没有让浏览器自己存储到 cookie 里,所有的数据都是我们后台统一存储,浏览器肯定是没办法访问到的,只要我们保障了我们后台的 redis 的安全,就没有人能去篡改里面相关的数据。
  2. 水平扩展也很容易,无论我们 web 服务器有多少个,10 个,100 个,1000 个,反正大家都去 redis 中做存取,即使 redis 不够用了,我们做 redis 集群,每个里面存一点,每个里面存一点。
  3. 括我们服务器即使重启、宕机,下次再启动了,我们 session 也不会丢失,因为 session 都是 redis 里面存着,跟我们业务服务器宕机与否没有任何关系。

缺点:

  1. 从内存中取数据是非常快的,也不需要网络交互,而如果我们存储到了 redis 里面,我们想要从 session 里面取数据,我们还得连接 redis,再来一次网络交互。
  2. 我们需要修改应用代码:如将所有的 getSession 方法替换为从 redis 查数据的方式。

总结:好的一点是,spring 早就意识到了这个问题,专门编写了一个框架叫 SpringSession,它就可以完美的解决我们 session 统一存储问题。

17. HTTP keep-alive 和 TCP keepalive 的区别

二者是完全不同的东西:

  • HTTP keep-alive:是应用层(用户态)实现,称为 HTTP 长连接。
  • TCP keepalive,是传输层 TCP(内核态)实现,称为 TCP 保活机制。

HTTP 的 keep-alive 也叫 HTTP 长连接,该功能是由「应用程序」实现的,可以使得用同一个 TCP 连接来发送和接收多个 HTTP 请求/应答,减少了 HTTP 短连接带来的多次 TCP 连接建立和释放的开销。

HTTP 协议的长连接和短连接,实质上是 TCP 协议的长连接和短连接。

TCP 的 Keepalive 也叫 TCP 保活机制,该功能是由「内核」实现的,当客户端和服务端长达一定时间没有进行数据交互时,内核为了确保该连接是否还有效,就会发送探测报文,来检测对方是否还在线,然后来决定是否要关闭该连接。

18. 什么是 Dos 攻击和 DDos 攻击?

DOS 攻击指的是攻击者通过向目标服务器发送大量的合法请求或利用安全漏洞,让服务器无法正常处理合法用户请求而导致服务不可用。攻击者的目的是消耗服务器的资源或使其崩溃,从而使正常用户无法访问服务。

DDOS 攻击是分布式的 DOS 攻击,攻击者利用多个恶意控制机器(也称为 “僵尸网络”)发起攻击。这些控制机器被远程控制,协同向目标服务器发送大量的请求,使其超出负载极限,导致服务不可用。

DOS 和 DDOS 攻击可以通过不同的方式实施,如:

  1. SYN Flood 攻击:攻击者发送大量伪造的 TCP 连接请求(SYN 包),而不真正建立连接,消耗服务器资源。
  2. UDP Flood 攻击:攻击者向目标服务器发送大量的 UDP 数据包,占用服务器带宽和处理能力。
  3. ICMP Flood 攻击:攻击者发送大量的 ICMP Echo 请求到目标服务器,占用服务器的网络带宽。

为了对抗 DOS 和 DDOS 攻击,通常采取以下措施:

  1. 过滤网络流量:通过配置防火墙、负载均衡器或入侵防御系统来过滤和丢弃恶意流量。
  2. 增加带宽和资源:增加服务器的处理能力和网络带宽,使其能够更好地抵御攻击。
  3. 流量清洗:使用专门的 DDOS 防护服务,识别和拦截恶意流量,只将合法流量转发到目标服务器。
  4. 分布式流量分析:通过分析流量模式,检测和阻止来自僵尸网络的恶意请求。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

回溯-重新安排行程

1.排序 Collections.sort(list,(o1, o2)-> o1.get(0).compareTo(o2.get(0))); 2.返回值 3.往集合添加元素 Arrays.asList(元素) List<List<String>> list new ArrayList<>();List<String> path new ArrayList<>();// 将[["JFK"…

影刀RPA实战:网页爬虫之CSDN博文作品数据

今天我们使用影刀来采集网页数据&#xff0c;影刀RPA是一款功能强大的自动化办公软件&#xff0c;它可以模拟人工的各种操作&#xff0c;帮助企业自动处理大量重复性、有逻辑规则的工作。影刀RPA在网页数据采集方面表现出色&#xff0c;能够实现对任何桌面软件、Web程序的自动化…

Python基础语法(1)上

常量和表达式 我们可以把 Python 当成一个计算器&#xff0c;来进行一些算术运算。 print(1 2 - 3) print(1 2 * 3) print(1 2 / 3) 这里我们可能会有疑问&#xff0c;为什么不是1.6666666666666667呢&#xff1f; 其实在编程中&#xff0c;一般没有“四舍五入”这样的规则…

第 13 章 兵马未动,粮草先行——InnoDB 统计数据是如何收集的

表的统计数据&#xff1a;SHOW TABLE STATUS LIKE table_name; 索引的统计数据&#xff1a;SHOW INDEX FROM table_name; 13.1 两种不同的统计数据存储方式 InnoDB 提供了两种存储统计数据的方式&#xff1a; 永久性的统计数据。存储在磁盘上&#xff0c;服务器重启之后还在…

华为 HCIP 认证费用和报名资格

在当今竞争激烈的信息技术领域&#xff0c;华为 HCIP认证备受关注。它不仅能提升个人的技术实力与职业竞争力&#xff0c;也为企业选拔优秀人才提供了重要依据。以下将详细介绍华为 HCIP 认证的费用和报名资格。 一、HCIP 认证费用 华为HCIP认证的费用主要由考试费和培训费构成…

Maven下载安装

下载 下载地址&#xff1a;Maven – Download Apache Maven 选择合适的版本进行下载 windows&Linux安装 1, 解压apache-maven-3.6.1.rar即安装完成 2&#xff0c; 配置环境变量MAVEN_HOME为安装路径&#xff0c;并将MAVEN_HOME的bin目录配置到PATH下 3&#xff0c;…

C#命令行参数解析库System.CommandLine介绍

命令行参数 平常在日常的开发过程中&#xff0c;会经常用到命令行工具。如cmd下的各种命令。 以下为sc命令执行后的截图&#xff0c;可以看到&#xff0c;由于没有输入任何附带参数&#xff0c;所以程序并未执行任何操作&#xff0c;只是输出了描述和用法。 系统在创建一个新…

最佳实践 · MySQL 分区表实战指南

引言 在数据量急剧增长的今天&#xff0c;传统的数据库管理方式可能无法有效处理海量数据的存储和查询需求。MySQL 提供了分区表功能&#xff0c;这不仅能够帮助优化性能&#xff0c;还能简化数据管理过程。分区表允许将数据表拆分成多个逻辑上的分区&#xff0c;每个分区可以…

资源管理新视角:利用 FastAPI Lifespan 事件优化你的应用II

本文说明在 FastAPI 应用程序中使用 lifespan 事件来管理资源的加载和卸载。lifespan 事件允许你在应用启动时执行一些初始化代码&#xff0c;并在应用关闭时执行一些清理代码。这是通过使用异步上下文管理器实现的&#xff0c;具体来说&#xff0c;是通过 asynccontextmanager…

什么是职场?职场的本质又是什么呢?

最近&#xff0c;经常看到很多职场相关的&#xff0c;比如职场必备技能、职场人际关系、职场晋升等等&#xff0c;这些都是职场的一些方面&#xff0c;但是却少有人来深入剖析什么是职场&#xff0c;职场的本质又是什么&#xff0c;今天我们就来一起来聊一聊&#xff0c;到底职…

音视频入门基础:AAC专题(5)——FFmpeg源码中,判断某文件是否为AAC裸流文件的实现

一、引言 通过FFmpeg命令&#xff1a; ./ffmpeg -i XXX.aac 可以判断出某个文件是否为AAC裸流文件&#xff1a; 所以FFmpeg是怎样判断出某个文件是否为AAC裸流文件呢&#xff1f;它内部其实是通过adts_aac_probe函数来判断的。从《FFmpeg源码&#xff1a;av_probe_input_for…

性能测试的复习3-jmeter的断言、参数化、提取器

一、断言、参数化、提取器 需求&#xff1a; 提取查天气获取城市名请求的响应结果&#xff1a;城市对查天气获取城市名的响应结果进行响应断言和json断言对查天气获取城市名添加用户参数 1、步骤 查看天气获取城市名 json提取器&#xff08;对响应结果提取、另一个接口请求…

也许你该了解下,DeepSeek Coder这个国产目前最牛逼的编码大模型,或许你真的用得上

你是不是也有这样的困惑:代码写不出来、调不通、效率低下,明明花了几个小时,结果却一无所获?别担心,不光是你,我也曾经有过同样的苦恼。但今天我要和你聊的,是一个能够改变这种局面的新工具——DeepSeek Coder。这个工具有多厉害?它能帮你解决闭源代码难以获取的问题,…

复杂情感识别系统

复杂情感识别系统&#xff08;CERS&#xff09;是一种先进的技术平台&#xff0c;旨在通过分析情感的组合、相互关系及其动态变化来解读和识别复杂的情感状态。这种系统通常采用以下技术和方法&#xff1a; 机器学习与深度学习&#xff1a; 通过训练算法识别和解释大量情感数据…

Blender/3ds Max/C4D哪个软件好?

在3D建模和动画制作领域&#xff0c;Blender、3ds Max和Cinema 4D&#xff08;C4D&#xff09;都是备受赞誉的软件。每个软件都有其独特的优势和特点&#xff0c;选择哪个软件取决于用户的具体需求和个人偏好。今天&#xff0c;成都渲染101云渲染就来分析一些这三款软件的情况&…

Linux服务器配合Xshell+Tensorboard实现深度学习训练过程可视化

问题背景&#xff1a; 在深度学习领域&#xff0c;监控模型的训练过程是非常重要的。TensorBoard 是 TensorFlow 提供的一个可视化工具&#xff0c;可以帮助我们直观地理解模型的训练和验证过程。我们一般在 Windows 系统只需要在自己的浏览器输入localhost:6006就可以观察训练…

Java的发展史与前景

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 &#x1f308;C专栏&#xff1a;C 文章目录 0. Java语言的发展史1.概述1.1 什么是Java1.2 …

java项目之基于工程教育认证的计算机课程管理平台(源码+论文)

项目简介 基于工程教育认证的计算机课程管理平台的主要管理员可以管理教师&#xff0c;可以对教师信息修改删除以及查询操作&#xff1b;可以对通知公告信息进行添加&#xff0c;修改&#xff0c;删除以及查询操作&#xff1b;可以对学生信息进行添加&#xff0c;修改&#xf…

Oracle绑定变量窥视与自适应游标共享

一.Oracle的绑定变量窥视与自适应游标共享 创建test表&#xff0c;列status存在2个值&#xff0c;有数据倾斜&#xff0c;在列status create table test as select rownum id,DBMS_RANDOM.STRING(A,12) name,DECODE(MOD(ROWNUM,500),0,Inactive,Active) status from all_obj…

Rust Windows下编译 静态链接VCRuntime140.dll

Rust 编译出来的exe默认动态链接VC运行库&#xff0c;分发电脑上需要安装有Microsoft Visual C Redistributable for Visual Studio 2015运行库。 编译时能静态链接进去&#xff0c;就省去客户端未安装运行库的问题。方法如下: 只需在当前根目录下新建.cargo\config.toml&#…