计算机网络

1.网络的体系结构

(1)网络协议

网络协议:计算机网络为了有条不紊的交换数据,而是先约定好的规则

(2)为什么要对网络分层

(1)因为各层之间是独立的,所以分层可以简化问题的难度和复杂度
(2)灵活性好,当一层的技术发生变化时,只要层间的接口关系保持不变,其他层就不受影响
(3)易于实现和维护

(3)OSI七层协议

OSI的七层协议体系结构的概念清晰,理论比较完整,但是复杂又不实用

七层协议模型主要包括:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层

(4)TCP/IP四层体系结构

四层的体系结构:应用层、传输层、网际层、网络接口层

(5)五层协议

应用层、传输层、网络层、数据链路层、物理层
应用层由程序员实现,下边四层是内核实现的

2.五层协议

(1)应用层

应用层的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程间的通信和交互规则。
对于不同的网络应用需要不同的应用层协议。如:域名系统DNS、支持万维网应用的HTTP协议、
支持电子邮件的SMTP协议

(2)传输层协议

传输层的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。
应用进程利用该服务传送应用层报文。

传输层主要使用以下两种协议:
TCP(传输控制协议):提供面向连接的,可靠的数据传输服务
UDP(用户数据协议):提供无连接的,尽最大努力的数据传输服务

(3)网络层

网络层的任务就是选择合适的网间路由和交换节点,确保计算机的通信数据及时传送。在发送数据时,
网络层把传输层产生的报文段或用户数据报封装成分组和包进行传送。在TCP/IP体系结构中,
由于网络层使用IP协议,因此分组也叫IP数据报,简称数据报。

互联网是由大量的异构网络通过路由器相互连接起来的。互联网使用的网络层协议是无连接的网际协议
和许多路由选择协议,因此互联网的网络层也叫网际层或IP层

(4)数据链路层

数据链路层通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,
这就需要使用专门的链路层协议。

在两个相邻节点之间传送数据时,数据链路层将网络层交下来的ip数据报组装成帧,在两个相邻节点间的链路
上传送帧。每一帧包括数据和必要的控制信息。

在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始到哪个比特结束

一般web应用的通信传输流:

(5)物理层

在物理层上传送的数据单位是bit。

物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。
使其上面的数据链路层不必考虑网络的具体传输介质。

透明传送比特流:表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的

3.三次握手

三次握手的本质是确认通信双方收发数据的能力

第一次握手:客户端向服务端发起连接请求,发送的报文段包含SYN标志位,随机生成的起始序列号x。
服务器确定了客户端的发件能力和自己的收件能力是有效的

第二次握手:服务端收到客户端发过来的报文后,发现SYN=1,知道这是一个连接请求,将客户端发来的
起始序列号x保存,随机生成一个服务端的起始序列号y。然后给客户端回复一段报文,回复报文包含SYN和
ACK(确认序号有效)标志,起始序列号y,确认号x+1。
客户端确认了自己的收件能力和发件能力是正常的,也确认了服务端的发件能力和接收能力也是正常的

第三次握手:客户端收到服务端的回复后发现ACK=1并且ack=x+1,于是知道了服务端已经收到了序列号为
x的那段报文,同时发现SYN=1,知道了服务端同意了本次连接。就给服务端发送回复报文,服务端收到回复
报文后,发现ACK=1并且ack=y+1,就知道客户端收到了序列号为y的报文了,这样就建立了连接,开始数据传输。
至此,客户端和服务端都确认了双方收发数据的能力

4.四次挥手

四次挥手的目的是关闭一个连接

(1)第一次挥手:当客户端的数据都传输完成后,客户端向服务器发出连接释放报文(当然数据没发完时也可以
	发送连接释放报文并停止发送数据),此时客户端只是不能发数据了,但是还可以正常收数据

(2)第二次挥手:服务端收到客户端发的连接释放报文后给客户端回复确认报文,此时服务端处于关闭等待状态,
	而不是立马给客户端发送连接释放报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。

(3)第三次挥手:服务端将最后数据发送完毕后就向客户端发出连接释放报文

(4)第四次挥手:客户端收到服务端发的连接释放报文后,向服务端发出确认报文。客户端发出确认报文后
	不是立即释放TCP连接,而是要经过2MSL(最长报文段寿命的2倍时长)后才释放TCP连接。而服务端一旦
	收到客户端发出的确认报文后就会立马释放TCP,所以服务端结束TCP连接的时间要比客户端早一些。

5.为什么TCP连接的时候是3次,2次不可以吗

(1)因为需要考虑连接时丢包的问题,如果只握手两次,第二次握手时如果服务端发给客户端的确认报文段
	丢失,此时服务端已经准备好了收发数据,而客户端一直没收到服务端的确认报文,所以客户端就
	不知道服务端是否已经准备好了,这种情况下客户端不会给服务端发送数据,也会忽略服务端
	发过来的数据

(2)如果是三次握手,即使发生丢包也不会有问题,服务端在一段时间内没有收到确认报文的话就会重新
	进行第二次握手,客户端收到重发的报文段后会再次给服务端发送确认报文

6.为什么TCP连接的时候3次,关闭的时候却是4次

因为只有在客户端和服务端都没有数据要发送的时候才能断开TCP。而客户端发出释放连接报文时只能保证
客户端没有数据发了,服务端还有没有数据发客户端是不知道的。而服务端收到客户端的释放连接报文后
只能先回复客户端一个确认报文来告诉客户端它已经收到释放连接报文了,但是服务端可能还有一些数据
没发完,等这些数据发完了服务端才能给客户端发送连接释放报文

7.为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接

这里同样要考虑丢包的问题,如果第四次挥手的报文丢失,服务端没收到确认ack报文就会重发第三次挥手的
报文,这样报文一去一回时长就是2MSL,所以需要等这么长时间来确认服务端确认已经收到了

8.如果已经建立了连接,但是客户端突然出现了故障怎么办

TCP设有一个计时器,服务器每收到依次客户端的请求后都会重新复位这个计时器。当到了设定时间
还没有收到客户端的任何数据,服务端就会发送探测报文段,如果发送多个探测报文段客户端仍然
没有反应,就关闭连接

9.HTTP与HTTPS的区别

HTTP:是互联网应用最广泛的一种通信协议,基于TCP,可以使浏览器工作更为高效,减少网络传输

HTTPS:在HTTP的基础上加了SSL,增加了一系列的安全机制,一方面保证数据传输安全,另一方面对访问者
	   增加了验证机制。它通过在传输过程中加密数据,确保数据在传输过程中不容易被窃听、篡改或劫持

HTTP默认使用端口号80     HTTPS默认使用端口号443

1.在HTTPS握手阶段,服务器会提供一个公钥给客户端,客户端使用这个公钥来加密一个随机生成的会话密钥
  (对称密钥)。然后客户端将这个加密后的会话密钥发送回服务器。
  服务器的公钥用于加密会话密钥,以确保只有服务器可以解密该密钥
  客户端的公钥通常不会用于加密,而是用于数字签名验证服务器的身份。客户端可以使用服务器的公钥来
  验证服务器发送的证书的真实性。
2.一旦服务器和客户端都拥有了相同的会话密钥,它们就可以使用对称加密算法(如AES)来加密和解密实际
  的数据传输。对称加密速度较快,适用于大量的数据传输
3.综合来看,对称加密和非对称加密在HTTPS中扮演不同的角色:
  非对称加密用于保护会话密钥的安全传输,并验证服务器的身份
  对称加密用于加密和解密实际的数据传输,以确保数据的机密性

10.GET和POST的区别

(1)GET是不安全的,因为在传输过程中,数据被放在请求的URL中
	POST的所有操作对用户是不可见的
	
(2)对于GET方式的请求,浏览器会把header和data一起发送出去,服务器收到后返回数据(响应200)
	对于POST方式的请求,浏览器先发送header,服务器响应100,浏览器再发送data,服务器收到后
	返回数据(响应200)

11.什么是对称加密与非对称加密

(1)对称加密:是指加密和解密使用同一个密钥的方式,存在最大的问题是如何将密钥安全的发送给对方

(2)非对称加密:是指使用一对非对称密钥,即公钥和私钥。发送方使用对方的公钥进行加密,对方收到
			  加密信息后, 用自己的私钥进行解密,可以保证安全性

对称加密比非对称加密快的原因:对称加密算法的设计特点已经加解密过程简单

对称加密加密解密过程:
加密:发送方将明文数据划分为固定大小的数据块,然后使用密钥对每个数据块进行加密。加密过程通常涉及
	 一些基本的算法操作,如替代、置换和异或
解密:接收方使用相同的密钥对加密后的数据块进行解密,以恢复原始的明文数据

对称加密加密解密过程:
生成密钥对:首先生成一对密钥,即公钥和私钥。公钥可公开分享,而私钥是保密的
加密:
	发送方(加密方):要加密消息,发送方使用接收方的公钥对消息进行加密。这意味着只有拥有接收方
				  私钥的接收方才能解密消息
	加密方法:发送方将要传输的消息使用接收方的公钥进行加密。加密后的数据称为密文
解密:
	接收方(解密方):接收方使用自己的私钥对收到的密文进行解密,以还原原始的明文消息
	解密方法:接收方使用私钥进行解密,以恢复原始的消息

12.什么是Session、Cookie和Token及其主要区别

为什么存在它们:HTTP协议是无状态的,服务器无法判断用户身份

(1)cookie:cookie是由web服务器保存在用户浏览器的小文件(key-value格式),包含用户相关信息。
	客户端向服务端发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器发送
	一个cookie。浏览器会把cookie保存起来,当浏览器再次请求该网站时,会把请求的网址和cookie
	一同提交给服务器,服务器检查cookie,辨别用户身份

(2)session:session是依赖cookie实现的,服务器默认在发送给浏览器的cookie中设置sessionid,
	浏览器在向服务器请求过程中传输的cookie中包含sessionid,服务器根据sessionid获取出会话
	中存储的信息

(3)Token:Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,
	服务器生成一个Token,并返回给客户端。以后客户端只需要带上Token来请求数据即可,
	无需带上用户名和密码。这样就可以减少频繁的向数据库查询用户名和密码是否正确,减轻服务器压力

(4)cookie和session的区别:
	cookie存放在客户端,安全性较差;session存放在服务器上,安全性较高
	session一定时间内保存在服务器上,当访问增多,占用服务器性能

(5)Token和session的区别
	session机制存在服务器压力增大,CSRF跨站伪造请求攻击,扩展性不强等问题
	session存在服务器,token存在客户端
	token提供授权和认证功能,作为身份认证,token安全性比session好
	session这种会话存储方式只适用于客户端代码和服务器代码运行在同一台服务器上,
	token适用于前后端分离项目

13.什么是socket

套接字
客户端的ip地址和端口号 与 服务端的ip地址和端口号 保持唯一性

14.BIO NIO AIO

BIO:同步阻塞IO,使用BIO读取数据时,线程会阻塞住,并且需要线程主动去查询是否有数据可读,并且
	 处理完一个Socket之后才能处理下一个Socket.当有多个客户端连接时,需要为每个客户端分配一个
	 独立的线程,导致资源消耗较大
	 适用于连接数较少的场景,如小型的服务端程序

NIO:同步非阻塞IO,使用NIO读取数据时,线程不会阻塞,但需要线程主动的去查询是否有IO事件。
	 通过 Channel 和 Buffer 实现,在 NIO 中,一个线程可以管理多个连接,通过单独的线程处理
	 I/O 事件
	 可以在高并发场景下减少线程开销,但需要更多的编程复杂性

AIO:异步非阻塞IO,使用AIO读取数据时,线程不会阻塞,并且当有数据可读时会通知给线程,不需要线程
	 主动去查询
	 在高并发和异步操作场景下表现最好,但只在部分平台上支持

15.分布式下cookie+session这种机制要怎么扩展

session黏贴:
		   在负载均衡中,通过一个机制保证同一个客户端的所有请求都会转发到同一个服务器中。
		   但是当这个服务出现问题后,请求又会被转发到其它服务上

session复制:当一个服务器上保存了session信息后,会主动将session复制到集群中的其它实例。
		    但是复制需要时间,在复制过程中,容易产生session信息丢失

session共享:
			将服务端的session信息保存到redis中,每个服务去访问redis获取即可

16.Netty

Netty是一个基于NIO的异步网络通信框架,性能高,封装了原生NIO编码的复杂度

特点:
	异步、NIO的网络通信框架
	高性能
	高扩展,高定制性
	易用性

高性能体现:
		 NIO模型,用最少的资源做更多的事情
		 内存零拷贝,尽量减少不必要的内存拷贝,实现了更高效率的传输
		 内存池设计,申请的内存可以重用,主要指直接内存。内部实现是用一颗二叉查找树管理内存分配

17.什么是零拷贝

应用程序在需要把内核中的一块区域数据转移到另外一块内核区域去时,不需要经过先复制到用户空间,再
转移到目标内核区域去了,而是直接实现转移

18.跨域请求

跨域是指浏览器在发起网络请求时,会检查该请求所对应的协议、域名、端口和当前网页是否一致,如果
不一致则浏览器会进行限制。
比如在www.baidu.com的某个网页,如果使用ajax去访问www.jd.com是不行的,但是如果是img iframe
script 等标签的src属性去访问则是可以的
浏览器做这层限制,是为了用户信息安全

如何实现跨域:
		   1.response添加header,比如resp.setHeader("Access-Control-Allow-Origin","*")
		     表示可以访问所有网站,不受是否同源的限制
		   2.jsonp的方式,该技术底层就是基于script标签来实现的因为script标签是可以跨域的
		   3.后台自己控制,先访问同域名下的接口,然后在接口中再去使用HTTPClient等工具去调用
		     目标接口
		   4.使用网关,交给后台服务进行跨域访问

19.epoll和poll的区别

select模型:
		  使用的是数组来存储Socket连接文件描述符,容量是固定的,需要通过轮询来判断是否发生了
		  IO事件
poll模型:
		使用的是链表来存储Socket连接文件描述符,容量是不固定的,同样需要通过轮询来判断是否
		发生了IO事件
epoll模型:
		 epoll和poll是完全不同的,epoll是一种事件通知模型,当发生了IO事件时,应用程序才进行
		 IO操作,不需要像poll那样主动去轮询

20.浏览器发出一个请求到收到响应经历了哪些步骤

(1)浏览器解析用户输入的URL,生成一个HTTP格式的请求
(2)先根据URL域名从本地hosts文件查找是否有映射IP,如果没有就将域名发送给电脑所配置的DNS进行
	 域名解析,得到IP地址
(3)浏览器通过操作系统将请求通过网络协议发送到目标服务器
(4)目标服务器收到请求后,根据请求所指定的端口,将请求传递给绑定了该端口的应用程序
(5)应用程序接收到请求数据后,按照http协议的格式进行解析,解析得到所要访问的servlet
(6)然后servlet来处理这个请求,如果是SpringMVC中的DispatchServlet,那么则会找到对应的
	 Controller中的方法,并执行该方法得到结果
(7)tomcat得到响应结果后封装成HTT[响应的格式,并再次通过网络发送给浏览器所在的服务器
(8)浏览器所在的服务器拿到结果后再传递给浏览器,浏览器则负责解析并渲染

21.什么是CSRF攻击 如何防止


22.如何设计一个开放授权平台

开放授权平台可以按照认证和授权两个方向来梳理

认证:
	按照OAuth2.0协议来规划认证的过程
授权:
	首先需要待接入的第三方应用在开放授权平台进行注册,注册需要提供几个必要的信息 clintID 
	消息推送地址 密钥(公钥和私钥,私钥由授权平台自己保存,公钥分发给第三方应用)。
	然后第三方应用引导客户发起请求时,采用公钥进行参数加密,授权开放平台使用对应的私钥解密。
	接下来,授权开放平台同步响应给第三方应用的只是消息是否处理成功的结果。而真正的业务数据由
	授权开放平台异步推动给第三方应用预留的推送地址。

23.什么是CSRF攻击 如何防止

CSRF:跨站请求伪造

一个正常的请求会将合法用户的 sessionID 保存到浏览器的 cookie。这时候,如果用户在浏览器中打开
另一个tab页,那这个tab页也是可以获得浏览器的 cookie 的,黑客就可以利用这个 cookie 信息进行
攻击

攻击过程:
		1.某个银行网站可以以get请求的方式发起转账操作。www.xx.com/accountNum=1&money=100
		  accountNum表示目标账户
		2.攻击者在某个论坛或者网站上,上传一个图片,链接地址是
		  www.xx.com/accountNum=2&money=10000,这个accountNum就是攻击者的账户
		3.如果有个用户登录了银行网站,然后又打开浏览器的另一个tab页,点击了这个图片。这是银行会
		  收到一个带了正确cookie的请求,就会完成转账,用户的钱就被盗了

防止CSRF:
   		1.尽量使用POST请求,限制GET请求。POST请求可以带请求体,攻击者就不容易伪造出请求
   		2.将cookie设置为HttpOnly:response.setHeader("Set-Cookie","cookiename=
   		  cookievalue;HttpOnly")
   		3.增加token
   		  在请求中放入一个攻击者无法伪造的信息,并且该信息不存在与cookie当中
   		  这也是 Spring Security 框架中采用的防范方式

24.什么是OAuth2.0协议

OAuth2.0是一个开放标准,允许用户授权第三方应用程序访问他们存储在另外的服务提供者上的信息,而
不是需要将用户名和密码提供给第三方应用或分享他们数据的所有内容

OAuth2.0协议的认证流程,简单理解就是允许我们将之前的授权和认证过程交给一个独立的第三方进行担保

授权模式

简化模式

密码模式

客户端认证

25.JWT令牌

普通令牌:
		是一个随机的字符串,没有特殊的意义。这就意味着当客户带上令牌去访问应用的接口时,应用本身
		无法判断这个令牌是否正确,他就需要到授权服务器上去判断令牌是否有效。高并发场景下,检查
		令牌的网络请求就有可能成为一个性能瓶颈

JWT令牌:
		将令牌对应的相关信息全部冗余到令牌本身,这样资源服务器就不再需要发送请求给授权服务器去
		检查令牌了,他自己就可以读取到令牌的授权信息。JWT令牌的本质就是一个加密的字符串

26.SSO

OAuth2.0的使用场景通常为联合登录    一处注册,多处使用

SSO 单点登录    一处登录多处同时登录,实现关键是将session信息集中存储

27.什么是嵌入式服务器

比如springboot集成了tomcat

节省了下载安装tomcat,应用也不需要再打war包,然后放到webapp目录下再运行
只需要安装一个JVM,就可以直接在上面部署应用程序了
springboot已经内置了tomcat.jar,运行main()时会去启动tomcat,并利用tomcat的spi机制加载
springmvc

28.什么是认证和授权

认证:对系统访问者的身份进行确认 (用户名密码登录、二维码登录、手机短信登录...)

授权:对系统访问者的行为进行控制,通常在认证之后,对系统内的用户隐私数据进行保护。
	 后台接口访问权限、前台控件的访问权限

通常设计权限认证框架的时候会基于RBAC模型
RBAC:主体 --> 角色 --> 资源 --> 访问系统的行为
用户(user):系统的用户,可以是个人或实体,需要访问系统中的资源
角色(role):角色是一组相关权限的集合,用户可以被分配为一个或多个角色,而不是直接授予具体的权限
权限(permission):权限是指对系统资源执行的操作。如读取、写入、删除等。权限定义了用户或角色
				 能够执行的具体操作
访问规则(access rules):定义了哪些角色被授予了哪些权限,以及哪些用户被分配了哪些角色。这些规则
					   构成了系统的访问控制策略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cw旧巷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值