【计算机网络 - 基础问题】每日 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. 分布式流量分析:通过分析流量模式,检测和阻止来自僵尸网络的恶意请求。

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

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

相关文章

C++:STL详解(一)string类的基本介绍与使用方式

✨ Blog’s 主页: 白乐天_ξ( ✿>◡❛) 🌈 个人Motto:实践是检验真理的唯一标准!!!敲代码需要勤快点!!!! 💫 欢迎来到我的学习笔记&#xff0…

docker-01 创建一个自己的镜像并运行容器

docker-01 创建一个自己的镜像并运行容器 前言 我们都知道使用Docker的镜像可以快速创建和部署应用,大大的节约了部署的时间。并且Docker 的镜像提供了除内核外完整的运行时环境,确保代码的环境一致性,从而不会在出现这段代码在我机器上没问…

用于遥感深度学习的7种高光谱遥感图像和标签

数据介绍 此数据集来自于GIC(GRUPO INTELIGENCIA COMPUTACIONAL )官网 直达链接,采用MATLAB存储为矩阵形式,数据集后缀为.mat形式。每一个数据分为原始图像数据和标签数据,标签对应码请参考官网。注:此数据为公开数据&#xff0c…

国产视频转换HDMI1.4转单/双MIPI DSI/CSI LT6911C芯片方案,带音频输出,QFN64封装 Lontium

LT6911C:HDMI 1.4 TO MIPI DSI/CSI 芯片简介: LT6911C是一款高性能的HDMI1.4转换器MIPI DSI/CSI芯片用于VR/智能手机/显示应用。对于MIPI DSI/CSI输出,LT6911C功能可配置单端口或双端口MIPIDSI/CSI 1高速时钟通道和1~4个高速数据通道最大1.5Gb/s/lane&am…

网络工程师学习笔记——网络互连与互联网

互联网的定义 由多个网络相互连接组成更大的网络称为互联网 常见的网络设备(是网络拓扑结构和网络的基础) 物理层 中继器(是将传输的信号进行放大,延长传输的距离),集线器也是这样,但是有更多…

如何获取MySQL数据表的列信息

在数据库管理中,了解表的结构是至关重要的。在MySQL中,我们可以通过几种方式来获取数据表的列信息。这不仅可以帮助我们更好地理解表的结构,还可以在编写查询时提供便利。以下是三种常用的方法来获取MySQL数据表的列信息。 使用 SHOW COLUMN…

C++速通LeetCode简单第10题-翻转二叉树

递归法: class Solution { public:TreeNode* invertTree(TreeNode* root) {if (root nullptr) {return nullptr;}TreeNode* left invertTree(root->left);TreeNode* right invertTree(root->right);root->left right;root->right left;return roo…

AtCoder ABC369 A-D题解

比赛链接:ABC369 省流&#xff1a;A<B<D<C&#xff08;题解是按照该顺序写的&#xff09; Problem A: #include <bist/stdc.h> using namespace std; int main(){int A,B;cin>>A>>B;if(AB)cout<<1<<endl;else if(abs(A-B)%20)cout&l…

一个软件分发和下载的网站源码,带多套模板

PHP游戏应用市场APP软件下载平台网站源码手机版 可自行打包APP&#xff0c;带下载统计&#xff0c;带多套模板&#xff0c;带图文教程 代码下载&#xff1a;百度网盘

饿了么基于Flink+Paimon+StarRocks的实时湖仓探索

摘要&#xff1a;本文整理自饿了么大数据架构师、Apache Flink Contributor 王沛斌老师在8月3日 Streaming Lakehouse Meetup Online&#xff08;Paimon x StarRocks&#xff0c;共话实时湖仓架构&#xff09;上的分享。主要分为以下三个内容&#xff1a; 饿了么实时数仓演进之…

C语言-整数和浮点数在内存中的存储-详解-上

C语言-整数和浮点数在内存中的存储-详解-上 1.前言2.整数2.1无符号整数2.2原码、反码、补码符号位最大值转换过程补码的意义简化算术运算易于转换方便溢出处理 1.前言 在C语言的使用中&#xff0c;需要时刻关注数据的类型&#xff0c;不同类型交替使用可能会发生错误&#xff…

算子级血缘在金融数据环境的实践应用

在企业的数据管理领域&#xff0c;算子级血缘极大优化了脚本内部字段口径的理解与追踪。面对几十、几百乃至几千行代码的复杂脚本&#xff0c;并且有着各种函数调用、数据转换等复杂的加工逻辑&#xff0c;如果通过传统的 ETL 工作模式&#xff0c;开发人员就不得不采用“盲人摸…

【H2O2|全栈】关于CSS(2)CSS基础(二)

目录 CSS基础知识 前言 准备工作 选择器的组合 盒模型 示例网页代码 后代选择器 亲代选择器 相邻兄弟选择器 后续兄弟选择器 多个元素选择器 通配符选择器 优先级 其他应用 伪类 锚链接的属性 列表的属性 list-style-type list-style-position list-style…

a√斗地主之顺子

题目描述 在斗地主扑克牌游戏中&#xff0c;扑克牌由小到大的顺序为:3,4,5.6,7.8,9,10,J,Q,K,A,2&#xff0c;玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。 其中顺子的出牌规则为:由至少5张由小到大连续递增的扑克牌组成&#xff0c;且不能包含2。 例如:(3.4.…

【JavaEE】IP协议 应用层协议

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 &#x1f576;️一.IP地址 IP协议&#xff08;Internet Protocol&#xff09;是TCP/IP协议族中最核心的协议之一&#xff0c;它定义了数据包在网络中传输的标准…

快速使用react 全局状态管理工具--redux

redux Redux 是 JavaScript 应用中管理应用状态的工具&#xff0c;特别适用于复杂的、需要共享状态的中大型应用。Redux 的核心思想是将应用的所有状态存储在一个单一的、不可变的状态树&#xff08;state tree&#xff09;中&#xff0c;状态只能通过触发特定的 action 来更新…

测试工程师学历路径:从功能测试到测试开发

现在软件从业者越来越多&#xff0c;测试工程师的职位也几近饱和&#xff0c;想要获得竞争力还是要保持持续学习。基本学习路径可以从功能测试-自动化测试-测试开发工程师的路子来走。 功能测试工程师&#xff1a; 1、软件测试基本概念&#xff1a; 学习软件测试的定义、目的…

微信小程序开发——比较两个数字大小

在这里我们使用的工具是 需要自行安装和配置。 在微信小程序中比较两个数字大小有以下几种方式&#xff1a; 一、普通条件判断 在小程序的.js 文件中&#xff0c;先定义两个数字&#xff0c;如let num1 5; let num2 3;。通过if - else if - else语句&#xff0c;根据num1与…

【测试报告】博客系统

1.项目背景 在互联网高度发达的今天,越来越多的人开始学习编程,诞生了越来越多的程序员,但他们没有可以互相交流学习、分享经验的平台。本项目旨在为更多的程序员以及新手小白提供一个能够促进学习、共同进步&#xff0c;让小白也能成为大神的交流学习平台 1.1测试目标以及测试…

【数据结构】8——图3,十字链表,邻接多重表

数据结构8——图3&#xff0c;十字链表&#xff0c;邻接多重表 文章目录 数据结构8——图3&#xff0c;十字链表&#xff0c;邻接多重表前言一、十字链表结构例子 复杂例子 二、邻接多重表&#xff08;Adjacency Multilist&#xff09;例子 前言 除了之前的邻接矩阵和邻接表 …