计算机基础

一、操作系统

1. 堆&栈、内部碎片&外部碎片

①堆和栈的区别?

Ⅰ. 栈是操作系统自动分配的一段连续内存区域,计算机在底层为栈分配了专门的寄存器,栈操作也有专门指令,速度非常快且不会产生内存碎片;
堆是用户自己申请的非连续内存区域,堆的操作是由C/C++的函数库提供,速度较慢且可能会产生内存碎片;
Ⅱ. 栈向低地址方向增长,大小在编译时就确定了,
堆向高地址方向增长,大小可以在运行时动态确定;
Ⅲ. 栈通常用来临时存储函数内部的数据,生命周期是其所属函数的执行时间,
堆通常用来存储大小不确定、跨函数的数据,生命周期可以自行决定;

 

②内存碎片中的内部碎片和外部碎片有什么区别?

内部碎片:指分配给程序但没有被利用上的的内存部分,通常出现在对内存采用固定分配的情况下,内存分区大小固定,程序无法完全利用,就产生了内部碎片;
外部碎片:指有些内存区域因为过小无法被分配给程序,通常出现在对内存采用动态分配的情况下,由于根据程序运行所需内存动态分配,所以不会出现内存碎片了,但可能会出现一些较小的内存区域无法被利用上,就产生了外部碎片;
 
解决外部碎片的方式?
内存交换,即通过将内存先写入硬盘再写回内存的方式,将原本不连续的内存段拼接到连续的内存区域,填满外部碎片;
 
 
 

2.内存置换算法、局部性原理

①内存置换算法有哪些?

Ⅰ. 最佳置换算法OPT:优先替换那些在未来最长时间内不会被用到的页面,不过这是一种理想中的算法,实际无法预知未来;
Ⅱ. 先进先出算法FIFO:每次淘汰最早进入内存的页面,没有考虑到局部性原理,性能较差一般不会使用;
Ⅲ. 最近最久未使用算法LRU:每次淘汰那些最近最久未使用的页面,性能较高,但需要硬件支持开销较大;(这里可以联系到手写带TTL的LRU算法)
Ⅳ. 时钟算法CLOCK:为每个页面设置一个默认为0访问位,并将全部页面组成一个循环队列,当页面被访问时将访问位置为1,当需要进行页面置换时,
  第一轮扫描寻找访问位为0的页面进行置换,并将扫描到的页面置为访问位0,
  没找到则进行第二轮扫描,
  算法开销较小,但未考虑到页面是否被修改;
Ⅴ. 改进的时钟算法:在时钟算法的基础上,为每个页面添加一个默认为0的修改位,当被修改时置为1,当需要进行页面置换时,
  第一轮寻找访问位、修改位均为0的页面,
  没找到则第二轮寻找访问位为0,修改位为1的页面,同时将扫描到的页面置为访问位0,
  没找到则第三轮寻找访问位、修改位均为0的页面,
  没找到则第四轮寻找访问位为0,修改位为1的页面,
  算法开销较小,性能也不错;
 
 
 

②什么是局部性原理?

局部性原理又分为时间局部性和空间局部性,
时间局部性是指如果一个数据被访问了,那么不久之后这个数据很有可能再次被访问,原因是因为程序中常常存在大量循环;
空间局部性时指如果一块内存区域被访问了,那么与其相邻的内存区域很有可能也会被访问,因为很多数据在内存中都是连续存放的;
例如TLB快表和Cache高速缓冲技术都利用了局部性原理;
 
 
 
 

3.虚拟内存、虚拟地址、大端&小端存储

①什么是虚拟内存?虚拟内存最大是多少?

虚拟内存就是操作系统将物理内存抽象成虚拟地址空间,每个进程有各自的虚拟地址空间,
这个虚拟地址空间又被分为多个页,每个虚拟页都会映射到一个物理页上,可以通过查页表将虚拟页的地址转换为物理页的地址,
除此之外,虚拟页不需要全都在物理内存中,当程序用到不在物理内存中的页时,通过缺页中断将缺失的虚拟页从硬盘中加载到物理内存中即可;
 
虚拟内存的作用是一方面可以避免多个进程之间的地址冲突;
另一方面,可以让程序获得更多的可用内存;
 
虚拟内存最大是多少?
虚拟存储器的实际容量=min(内存外存容量之和,CPU寻址范围);

 

②虚拟地址是怎么转换为物理地址的?/分页和分段的区别?

首先二者都是操作系统用来管理虚拟地址与物理地址之间的关系的方式;
 
分页是将虚拟内存和物理内存都切分成一个个固定大小的空间,在Linux中页大小为4KB,虚拟内存中称为页,物理内存中称为页框,页与页框的映射关系存储在页表中,虚拟地址中由页号和页内偏移量组成,通过页号查询页表即可知页框号,与页内偏移量拼接即可得物理地址;
分页对用户不可见,是操作系统的行为,主要为了消除外部碎片,提高内存利用率,不过可能会产生内部碎片;
 
分段是将虚拟内存和物理内存按照程序实际需要分成一个个大小不一的内存空间,称为段,段的虚拟地址和物理地址的映射关系存储在段表中,与页表不同的是段表还存储了段长字段,在查询段的物理地址前还需要先判断是否越界;
分段对用户可见,主要为了满足用户需要,分段可能会产生外部碎片;
在操作系统中通常分页和分段是组合使用的,先将程序分为多个有逻辑意义的段,再将每个段分成若干个固定大小的页;
 
 

③大端存储和小端存储

大端存储就是将数据在内存中按从高地址到低地址逆序存放,
小端存储就是将数据在内存中按从低地址到高地址顺序存放,操作系统默认按照小端存储;
其应用例如MySQL的行记录中的NULL值列表和变长字段列表就是使用大端存储的,这样做是因为列表之后就是真实数据,这样一来行记录中靠前的真实数据就更有可能和自己的列表信息在在同一个CPU Cache Line中,提高Cache命中率;

 

 

 

4.进程&线程&协程、进程的状态

①进程、线程、协程的区别与联系

进程是运行起来的可执行程序,是资源分配的基本单位,进程切换开销很大,包括虚拟地址空间和内核堆栈等的切换,
一个进程可以有多个线程,线程是程序执行和调度的基本单位,线程切换的开销很小,只需要切换程序计数器和栈空间(包括虚拟机栈和本地方法栈)即可,
协程是用户态的轻量级线程,是线程内部调度的基本单位,特点是同一时间只有一个协程运行无法并行,且切换时无需进入内核态,因此切换速度非常快;
 
 

②进程的状态有哪些?每个阶段都做了什么

①创建态:此阶段进程被创建,系统为进程分配资源,创建进程控制块PCB(进程存在的唯一标志,存放在进程id、所属用户uid、进程当前状态等信息);
②就绪态:当进程完成创建后就进入就绪态,等待CPU资源;
③运行态:就绪态的进程分配到CPU资源时就会进入运行态,执行该进程对应的程序/指令;
④阻塞态:进程运行过程中可能需要等待某个事件的发生,例如等待某个资源的分配、或是其他进程的响应,此时进程就会进入阻塞态;
⑤终止态:进程执行完毕,被收回各种资源;

 

 

 

5.进程调度算法

①进程调度算法有哪些?

——页面置换算法的目标是让被访问的页面尽可能在内存中,进程调度的算法是尽量根据优先级、等待时间、响应时间等综合考虑

Ⅰ. 先来先服务算法FCFS:调度时选择最先请求的进程,对长作业有利,对短作业不利;
Ⅱ. 短作业优先算法SJF:调度时选择预估执行时间最短的进程,对短作业有利,对长作业不利;
Ⅲ. 高响应比优先:按照(等待时间+要求服务时间)/要求服务时间计算每个的响应比,调度时选择响应比最高的进程,这种算法综合考虑了等待时间和要求服务时间两个因素;
Ⅳ. 时间片轮转算法:按照进程请求的顺序,轮流让每个进程执行一个固定时长的时间片,时间片用完就换下一个进程,优点是响应时间快,缺点是频繁切换开销较大;
Ⅴ. 优先级调度算法:调度时选择优先级最高的进程; 
Ⅵ. 多级反馈队列算法:建立多个优先级、时间片不同的队列,优先级越高的队列时间片越短,进程到达时先进入优先级最高时间片最短的队列,如果未完成则进入优先级更低的队列,只有高优先级队列中的作业执行完,才会去执行低优先级的队列,多级反馈队列算法是时间片轮转算法和优先级调度算法的结合;
 
 
 
 

6.进程间通信、线程间通信、信号量解决进程同步问题

①进程间通信有哪些?

管道通信(Pipe):特点是单向通信,适用于父子进程之间通信;

消息队列(Message Queue):通过消息缓冲区实现进程间的异步通信;

共享内存(Shared Memory):多个进程共享同一块内存区域,实现高效的数据交换;

信号量(Semaphore):用于实现进程间的同步和互斥;

套接字(Socket):适用于不同主机间的进程通信,可实现网络通信;

 

②线程间通信知道哪些?

互斥锁:使用互斥锁保护共享资源,可以保证同一时刻只有一个线程访问该资源;

读写锁:允许多个线程同时进行读操作,但需要进行写操作时只能由一个线程独占;

信号量:线程也可以使用信号量来实现线程间的同步和互斥;

 

③信号量解决进程同步问题

信号量:操作系统提供的用于表示系统资源数量的变量,可以使用不可中断的原语P、V操作来操作信号量,实现进程同步;
哲学家进餐问题的解决方法:有两种思路,
  一种是根据资源数量计算不可能发生死锁的情况下允许同时进餐的哲学家的最大数量,例如有6只筷子,那么只允许5名哲学家同时进餐就可以保证不发生死锁;
  另一种是保证拿两只筷子的操作是互斥的,同一时间只允许一个哲学家进行拿筷子的操作;
 
 
 
 

7.Reactor并发编程模式 Reactor模式

Reactor是一种并发编程模式,用于处理多个客户端请求的并发事件,
具体来说就是通过IO多路复用监听连接和获取发生事件的连接,根据事件类型分配给对应的模块进行处理;
Reactor有三种经典的方案:
  Ⅰ. 单Reactor单线程:主要分为Reactor、Acceptor、Handler三部分,Reactor负责接收和分发事件,Acceptor负责处理建立连接的事件,Handler负责处理其他事件例如读写操作等;
  ——这种方案的主要缺点在于不能充分利用多核CPU的性能,且如果某个事件的处理占用线程时间过长,会减慢对其他事件的响应;
  Ⅱ. 单Reactor多线程:主线程管理Reactor、Acceptor、Handler,但区别在于此时Handler不再负责处理任务,而是将任务交给线程池中的某个子线程处理,Handler只负责转发数据;
  ——充分利用了多核CPU的性能,且即使出现某个耗时长的事件,也不会影响对其他事件的响应速度,此时由一个主线程管理的单个Reactor成为了性能瓶颈;
  Ⅲ. 多Reactor多线程:主线程只管理一个主Reactor和Acceptor,负责处理连接事件和将连接分配给一个子线程(不再负责分发事件,而是改为分配连接),每个子线程都有自己的副Reactor和Handler,会继续监听连接并当发生事件时分发给自己的Handler来处理事件;

 

 

 

8.中断、异常、DMA

①中断了解吗?介绍一下

中断就是指在计算机执行现行程序的过程中,出现急需处理的异常情况或特殊请求,CPU暂时中止现行程序,而转去对这些异常情况或特殊请求进行处理,在处理完毕后CPU又自动返回到断点处,继续执行原程序;



②中断和异常有什么区别?

相同点:

都需要操作系统进入内核态来处理;

不同点:

首先,中断是硬件设备产生的,如IO中断是由各种IO设备发出的,而异常是CPU在执行程序时产生的,如运行除法程序时,当除数为0时就会产生除0异常;

其次,处理中断时需要对正在执行的进程进行上下文的保存与恢复,而处理异常不需要切换上下文;

 

③说一说中断的完整过程(以键盘输入字符的IO中断为例)

首先,当用户按下键盘输入字符,键盘控制器就会产生扫描码并将其暂存在缓冲区中,然后通过总线向CPU发送中断请求;

在CPU收到中断请求之后,操作系统就会中断当前正在执行的进程,并将其上下文保存起来,然后调用键盘的中断处理程序;

中断处理程序负责从键盘控制器的缓冲区中读取扫描码,找到扫描码对应的字符并将其放到读缓冲队列中,然后显示器的驱动程序会读取这些字符并将其显示在显示器上;中断处理程序执行完毕后,操作系统又会恢复之前被中断进程的上下文,并继续执行;

 

④了解DMA方式吗?

DMA控制器内部包含一些寄存器和中断机构,可以代替CPU来执行数据IO任务,可以在处理完一片数据后,再让CPU中断直接从中读取数据,不需要CPU频繁中断执行中断处理程序;

DMA方式的中断频率低,对CPU友好,但响应速度慢,适用于磁盘IO这类大量数据IO的场景; 操作系统 如何让服务器能够并发地处理尽可能多的请求?

 

如何让服务器能够并发地处理尽可能多的请求?

①采用IO多路复用(epoll)监听连接和获取发生事件的连接;

②使用Reactor模式(多Reactor多线程)根据事件类型分配给对应的模块进行处理;

 

 

 

二、计算机网络

1.OSI七层模型 & TCP/IP模型

物理层:在物理介质上进行数据传输;
数据链路层:将网络层的数据包组装成帧,添加MAC地址等信息——包含ARP协议(根据IP地址获取MAC地址);
网络层:负责设备间的数据传输,实现寻址和路由选择——包含IP协议;
传输层:负责端口间的数据传输,实现流量控制、拥塞控制等功能——包含TCP、UDP等协议;
会话层:管理主机间的会话进程;
表示层:对数据的表示进行操作,例如压缩和加密等;
应用层:具体的网络应用——包含HTTP、DNS等协议;
 
TCP/IP模型将会话层、表示层、应用层合并为一个应用层,将物理层和链路层合并成一个网络接口层,同时网络层称为网际层;

 

 

2.在浏览器地址栏输入一个URL后回车,背后会进行哪些步骤?

Ⅰ. 首先浏览器解析URL,确定协议类型(HTTP或是HTTPS)、Web服务器名称、文件路径名等,并生成HTTP请求报文;
Ⅱ. 然后浏览器会使用DNS协议根据域名获取对应的IP地址:具体来说首先会查询本地DNS缓存,未找到则查询本地DNS服务器,仍未找到则向根DNS服务器发送请求逐级向下查找;
Ⅲ. 获得IP地址之后,就可以通过TCP三次握手建立TCP连接了;
Ⅳ. 如果是HTTPS协议的话,在TCP三次握手之前还需要经过TLS四次握手,实现加密传输;
Ⅴ. 建立TCP连接之后就可以进行数据传输了,浏览器向Web服务器发送HTTP请求,服务器收到报文之后,根据请求中的内容来决定需要获取哪些文件,生成HTTP响应报文并发送给浏览器;
Ⅵ. 浏览器根据响应对页面进行渲染并呈现给用户;
 
 
 
 
  • 生成HTTP报文:首先浏览器解析URL,根据Web服务器名称、文件名生成HTTP报文;
  • DNS协议获取IP地址:浏览器会根据我们输入的域名查询DNS服务器获取Web服务器的IP地址,具体来说首先会向本地域名服务器发出请求,本地域名服务器查看缓存,若缓存中没有,则查询其他更高级的域名服务器直至获取IP地址;
  • 传输层建立TCP 连接生成TCP报文:然后向 Web 服务器发起 TCP 连接请求,通过 TCP 三次握手建立连接,之后给HTTP报文加上包含端口号的TCP头部,变为TCP报文;
  • 网络层IP协议:TCP报文在网络层的传输需要委托IP协议为TCP报文添加包含IP地址的IP头部,变为IP报文;
  • 链路层ARP协议:链路层的传输需要MAC地址,所以使用ARP协议根据IP地址找到目的MAC地址(首先查询ARP缓存,未命中则主机将包含目标IP地址的ARP请求广播到网络上的所有主机,目标服务器会返回其MAC地址),再为IP报文添加包含MAC地址的MAC头部,变为MAC报文;
  • 数据包经过网卡、交换机、路由器等设备传输到目标服务器;
  • 服务器处理请求并返回响应报文:服务器收到数据包之后,拆开得到HTTP请求报文,根据 HTTP 请求中的内容来决定需要获取哪些文件,生成HTTP响应报文并发送给浏览器;
  • 浏览器渲染:浏览器根据响应对页面进行渲染并呈现给用户;
 
首先浏览器解析URL,根据Web服务器名称、文件名生成HTTP报文;
然后使用DNS协议根据域名获取Web服务器的IP地址;
通过 TCP 三次握手与Web服务器建立连接,并给HTTP报文加上包含端口号的TCP头部,变为TCP报文;
在网络层IP协议为TCP报文添加包含IP地址的IP头部,变为IP报文;
在链路层,使用ARP协议根据IP地址找到目的MAC地址,为IP报文添加包含MAC地址的MAC头部,变为MAC报文;
之后,数据包经过网卡、交换机、路由器等设备传输到目标服务器;
服务器收到数据包之后,拆开得到HTTP请求报文,根据请求中的内容来决定需要获取哪些文件,生成HTTP响应报文并发送给浏览器;
浏览器根据响应对页面进行渲染并呈现给用户;
 
 
 
 

3.HTTP无状态、GET&POST、HTTP状态码、HTTP1.0&1.1&2.0&3.0

①http为什么是无状态的?

因为每个HTTP请求之间都是相互独立的,服务器不会在不同请求之间保留客户端的状态信息。

无状态的好处是:

  ①简单性:使得HTTP协议的设计更加简单灵活,不需要维护复杂的状态信息;

  ②可伸缩性:因为服务器不需要保留客户的信息,可以更容易地进行水平扩展,处理更多的并发请求;

  ③易于缓存:无状态使得缓存更加有效,可以缓存响应在多个请求之间共享,提高性能;

不过无状态也有坏处,那就是在完成一些有关联的操作时非常麻烦,例如登录、添加购物车、下单、结算、支付这一系列操作都需要用户身份才能进行,而服务器是没有保存用户信息的,此时每进行一步都需要验证用户身份,非常繁琐;

可以通过Cookie技术来解决这一问题;

Cookie技术就是在客户端第一次发出请求时,服务器会在响应中添加Cookie信息,后续客户端的请求带上Cookie信息即可被识别;

 

②GET和POST有什么区别?

首先,GET和POST是HTTP请求的两种基本方法,其底层实现是一样的,都是基于TCP/IP,

造成两种方法不同的原因其一是HTTP协议规定,GET方法将请求参数放在URL中,POST方法将请求参数放在放在Request body中,这是一种准则,但其实从技术上来说,GET方法也可以将参数放在Request body中,post请求也可以将参数放在URL中;

其二是浏览器和服务器的规定,由于URL长度有限制,因此GET方法的请求参数长度也有限制,而Request body的大小通常没有限制,因此POST方法的请求参数大小也没有限制,

              除此之外,GET请求只产生一个数据包,浏览器会将http header和data一起发送出去,而POST请求则会产生两个数据包,浏览器先发送header,服务器响应100 continue,然后再发送data;(FireFox好像都只发一次)

              还有就是当GET请求的是静态资源(前端页面,如HTML、CSS、JS、图片等)时,浏览器通常会主动缓存,而POST请求则不会;

从使用场景来看,GET适合用于获取静态资源、简单查询的接口,POST请求则适用于增删改、复杂的查询接口;

 

③HTTP常见状态码

1XX表示信息:100 continue表示请求正在处理;

2XX表示成功:200 ok表示请求正常处理完毕;

3XX表示重定向:301永久重定向;

4XX客户端错误:404 not found资源未找到;

5XX服务器错误:500 服务器执行请求时发生错误;

 

④HTTP1.0、1.1、2.0、3.0的区别?

1.0无状态无连接,浏览器每次请求都需要建立TCP连接,服务器处理完请求之后就会断开连接,也不会记录过去的请求;

1.1支持长连接和请求的流水线处理,在一个TCP连接上可以传送多个HTTP请求和响应;

2.0基于二进制流,可以将HTTP报文分解为独立的帧交错发送,提高了网络传输效率;

3.0引入了QUIC协议,进一步提高了网络传输效率;

 

 

 

4.HTTP&HTTPS、对称加密&非对称加密、对称算法&非对称算法

①HTTPS 与 HTTP 有哪些区别?

HTTP明文传输,存在安全风险,HTTPS在HTTP和TCP层之间添加SSL/TLS安全协议,使得报文能够加密传输;
HTTP只需要TCP三次握手建立连接之后就可以进行报文传输,而HTTPS在建立TCP连接后,还需要通过SSL/TLS握手,才能进行加密报文传输;
HTTP默认端口为80,HTTPS默认端口为443;
 
 

②对称加密和非对称加密的区别?各有哪些算法?

对称加密就是只使用一个密钥进行加密和解密,优点是运算速度快,缺点是密钥必须保密,不能进行安全的密钥交换;
非对称加密就是使用两个密钥:公钥和私钥,公钥任意分发,私钥保密。优点是可以进行安全的密钥交换,缺点是速度较慢。公钥和私钥都可以用来加密和解密,流程不同目的也不同;
公钥加密、私钥解密:目的是保证加密内容只有私钥持有人可解析;
私钥加密、公钥解密:目的是保证发送消息的人不可被冒充,因为私钥不会被泄露;
 
常见的对称加密算法有AES算法,非对称加密算法有RSA算法、ECC算法;
 
 

③HTTPS信息传输用的是对称算法还是非对称算法?

HTTPS采用的是对称算法和非对称算法结合的混合加密方式,具体来说:
在通信建立前采用非对称加密的方式交换密钥;
在通信过程中使用对称加密的方式对明文数据进行加密;
 
 
 
 

5.HTTPS四次握手、数字证书、三个随机数、RSA算法的缺陷、防止下载文件被篡改

①HTTPS/TLS四次握手过程说一下

以使用采用RSA密钥协商算法的TLS握手阶段为例:
①第一次握手:客户端发起加密通信请求,携带客户端支持的TLS协议版本、密码套件列表,以及客户端生成的随机数;
②第二次握手:服务器收到请求之后,确认TLS协议版本和密码套件列表,向客户端发出响应,携带服务器生成的随机数和数字证书;
③第三次握手:客户端收到回应后,首先校验数字证书的真实性,然后从中取出服务器的公钥,使用公钥加密向服务器发送的报文,再携带一个随机数,并通知服务器接下来都会使用上述三个随机数生成的会话密钥进行加密通信,以及客户端的握手已经结束;
④第四次握手:服务器收到请求之后,使用私钥解析报文,并使用上述三个随机数生成会话密钥,并向客户端发出响应,通知客户端接下来进行加密通信,并且服务器的握手也已经结束;
 
 

②数字证书是什么?有什么用?客户端如何验证服务器的数字证书?

数字证书包含公钥、持有者的各项信息、证书认证机构CA的数字签名等,作用是认证公钥持有者的身份,防止第三方冒充;
CA在签发证书时,会根据数字证书中的各项信息使用hash算法生成一个hash值,使用自己的私钥对这个hash值加密生成数字签名,添加到数字证书中;
客户端在校验数字证书时,首先会使用相同的哈希算法获取证书的hash值,然后使用浏览器或是操作系统中CA的公钥来解密证书中CA的数字签名,获得第二个hash值,如果这两个值相同,则认为这个数字证书可信,反之不可信;
 
 

③为什么需要三个随机数?

前两个随机数是为了保证每个HTTPS会话生成的会话密钥都是唯一的,并且多个随机数生成的密钥更难破解,
第三个随机数会使用服务器的公钥进行加密,是为了确保不被第三方破解,保证会话密钥的安全性;
 
 

④使用RSA密钥协商算法的TLS握手有何缺陷?解决办法?

最大的缺陷就是不支持前向保密,因为第三次握手中客户端传输最后一个随机数使用的是服务器提供的公钥进行加密的,服务器使用私钥进行解密,但如果服务器的私钥泄露了,则第三方也可以获得随机数进而生成会话密钥,后续所有报文都会被破解;
 
解决方法是使用ECDHE密钥协商算法
首先利用了离散对数(在对数运算基础上加了取模运算)即使已知底数和真数也很难计算出对数的特性,将对数作为私钥,大大提高了破解私钥的难度,
同时利用离散对数的交换律,让客户端和服务器能够使用各自的私钥和对方的公钥生成相同的会话密钥;
然后每次双方进行密钥交换时,都会随机生成私钥,这样即使某一次通信过程的私钥被破解,也不会影响其它通信过程;
最后利用ECC椭圆曲线的特性,使得能用更少的计算量计算出公钥和最终的会话密钥;
 
四次握手上的区别主要在于:
客户端也会生成自己的公钥和私钥,并将自己的公钥发送给服务端;
 
 

⑤怎么防止下载的文件被劫持和篡改?

  • 确保下载链接使用HTTPS协议,加密传输数据,防止第三方攻击和数据篡改。
  • 验证文件完整性:在下载文件后,使用哈希算法(如MD5、SHA-256)计算文件的哈希值,与官方提供的哈希值进行比对,验证文件是否被篡改。

 

 

6.TCP三次握手

①TCP建立连接的三次握手

初始客户端和服务端都处于CLOSE状态,服务端主动监听某个端口进入LISTEN状态,
第一次握手:客户端发出SYN建立连接请求,携带一个初始序列号,之后客户端进入SYN_SENT状态;
第二次握手:服务端收到客户端请求之后,会给客户端发送一个SYN+ACK报文,携带自己的初始序列号,以及等于客户端序列号+1的确认应答号,之后进入SYN_RCVD状态;
第三次握手:客户端收到服务端报文之后,会给服务端发送一个ACK应答报文,携带等于服务端序列号+1的确认应答号,之后客户端进入ESTABLISHED状态;
服务端在收到客户端报文之后,也会进入ESTABLISHED状态,至此连接建立完成,可以互相发送数据了;
 
 

②为什么是三次握手?可以更少吗?

首先,为了阻止重复历史连接的建立,至少需要三次握手,如果只有两次,服务端在收到SYN报文后就进入ESTABLISHED状态建立连接,会导致那些因网络延迟而重发的SYN报文重复建立连接,浪费资源;
其次,为了同步客户端和服务端的序列号,需要两次一来一回的报文,中间的两个报文合并,也是至少需要三次握手;
 
 
 
 

7.TCP四次挥手

①TCP断开连接的四次挥手

初始客户端和服务端都处于ESTABLISHED状态,
第一次挥手:客户端发送FIN报文;
第二次挥手:服务端收到报文后,发送一个ACK应答报文,之后服务端进入CLOSE_WAIT状态;
此时TCP进入半关闭状态,客户端到服务端的连接已经释放,但服务端到客户端的连接还未释放,服务端仍可以发送数据;
第三次挥手:服务端发送FIN报文,
第四次挥手:客户端收到报文后,发送一个ACK应答报文,之后进入TIME_WAIT状态,在经过2MSL时间后进入CLOSE状态;
服务端在收到ACK报文之后进入CLOSE状态;
 
 

②为什么是四次挥手?三次行吗?

如果服务端在收到客户端的FIN报文后没有数据要传输,且开启了TCP延迟确认,就会合并服务端的ACK报文和FIN报文,变成三次挥手;
TCP延迟确认:当需要发送ACK响应报文时,会等待一段时间看有没有数据需要传输,如果有就会将数据携带在响应报文中一同传输;
 
 

③为什么需要TIME_WAIT状态?为什么等待时间是2MSL?

首先是为了防止历史连接中延迟传输的报文被后续建立的新连接接收,(因为TCP中序列号是循环的,历史连接中报文的序列号有可能和后来的连接中报文的序列号相同,这就可能会导致后来的连接错误接收历史连接中延迟的报文)在断开连接时,设置TIME_WAIT状态等待2MSL确保这次连接中所有请求和应答报文均已送达或被丢弃;
——MSL(Maximum Segment Lifetime)是一个报文在网络中存在的最长时间,超过这个时间的报文将被丢弃(Linux中默认30s),
其次是为了确保第四次挥手中客户端的ACK报文成功送达服务端,连接正常关闭,因为如果这个ACK报文发送失败,服务端会重发一个FIN报文,这样一来一回最多2MSL,此时客户端就会重置等待时间,并重发一个ACK报文;
 
 

④服务器出现大量TIME_WAIT的原因有哪些?

首先,TIME_WAIT状态是主动关闭连接的一方才会出现的状态,因此服务器中出现大量TIME_WAIT状态说明服务器主动断开了大量TCP连接,
出现这一情况的原因有:
  服务端或客户端没有开启HTTP的Keep-Alive长连接;
  HTTP长连接超时;
  HTTP长连接的请求数量达到上限;
 
 

⑤服务器出现大量CLOSE_WAIT状态的原因有哪些?

首先,CLOSE_WAIT是被动关闭方才会有的状态,被动关闭方在第二次挥手发送应答报文后,在第三次挥手发送FIN报文前都会处于CLOSE_WAIT状态,
因此服务器中出现大量CLOSE_WAIT状态的原因可能是:
  服务器内部业务处理占用过长时间,迟迟没有处理完;
  服务器的业务逻辑有问题,没有调用close()方法关闭连接;
 
 
 
 

8.TCP可靠传输、TCP&UDP

①TCP如何保证可靠传输?

Ⅰ. 重传机制
超时重传:TCP的发送方在规定时间内没有收到应答方的ACK报文时(这一时间是动态改变的,一般略大于报文往返时间RTT),就会重新发送报文;
快速重传:TCP的发送方在连续三次收到来自接收方的相同序号的应答报文时,即使还没有超时也会重新发送报文;
SACK选择性重传:接收方会在ACK应答报文中携带当前已接收的报文段的信息,这样发送方就只需要重传丢失的报文;
 
Ⅱ. 流量控制——避免发送方数据填满接收方的缓存
TCP使用滑动窗口来控制发送方在未收到确认的情况下可发送的最大数据量,超过窗口大小就停止发送数据,直至窗口内的数据被确认,
发送方窗口的大小根据接收方返回的报文中的窗口字段来动态改变;
 
Ⅲ. 拥塞控制——避免发送方数据填满整个网络
慢启动算法:TCP刚建立连接时,拥塞窗口为1,每经过一个报文往返时间RTT就翻一番;
拥塞避免算法:当拥塞窗口大小达到慢启动门限ssthresh后,每经过一个RTT就令拥塞窗口+1;
当网络中出现拥塞时,需要进行重传,重传机制有两种,执行的拥塞发生算法也不同:
  一种是超时重传,此时令慢启动门限ssthresh为发生拥塞时拥塞窗口大小的一半,拥塞窗口变为1,重新从慢启动算法开始执行;
  一种是快速重传,此时仍令慢启动门限ssthresh为发生拥塞时拥塞窗口大小的一半,但拥塞窗口大小变为与慢启动门限相同,执行拥塞避免算法;
 

②TCP和UDP的区别?

TCP面向连接,建立连接和释放连接需要三次握手和四次挥手,UDP是无连接的;
TCP保证可靠传输(有序无错、不丢不重),UDP不保证可靠传输(无重传机制、无拥塞控制);
TCP报文首部20字节,UDP报文首部只有8字节;
TCP只支持一对一连接,UDP还支持一对多、多对一、多对多;
TCP是面向字节流的,UDP是面向报文的;
TCP适用于对可靠性比较高的场景,例如远程登录,UDP适用于对实时性要求较高对可靠性要求不那么高的场景,例如视频通话;
 
 
 

9.子网掩码、MAC&IP

①子网掩码的作用是什么?

通过将子网掩码和IP地址进行逻辑与操作,将IP地址划分为网络号和主机号,帮助路由器识别网络间和网络内部的通信,对数据包进行正确的分发;
 
 

②MAC 和 IP 区别

MAC地址是用于在局域网中唯一标识设备的硬件地址,在数据链路层使用;
而IP地址是用于在广域网中唯一标识设备的逻辑地址,在网络层使用;
 
posted @   Avava_Ava  阅读(26)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示