面经-网络+操作系统
网络基础
TCP三次握手
一条视频讲清楚TCP协议与UDP协议-什么是三次握手与四次挥手_哔哩哔哩_bilibili
三次握手过程:
客户端——发送带有SYN标志的数据包——服务端 一次握手 Client进入syn_send状态
服务端——发送带有SYN/ACK标志的数据包——客户端 二次握手 服务端进入syn_rcvd
客户端——发送带有ACK标志的数据包——服务端 三次握手 连接就进入Established状态
为什么三次:
主要是为了建立可靠的通信信道,保证客户端与服务端同时具备发送、接收数据的能力
为什么两次不行?
假设采用两次握手建立连接,客户端向服务端发送了一个SYN包来请求建立连接,因为某些原因,并未到达服务器,在中间某个网络节点产生了滞留,为了建立连接客户端会重发SYN包,这次数据包正常送达,服务端回复SYN+ACK,之后建立连接。但是第一包数据阻塞的网络节点突然恢复,第一包SYN包又送达到服务端,这时服务端会误认为是客户端又发起了一个新的连接,这样服务端进入等待数据状态,这样客户端认为是一个连接,服务端认为是两个连接。
TCP协议如何处理丢包问题以及乱序问题
TCP为每一个连接,建立一个发送缓冲区,从建立链接后的第一个字节的序列号为0,后面每个字节的序列号就会增加1,发送数据时,从发送缓冲区,取一部分数据组成发送报文,在发送报文的tcp协议头中会附带序列号和长度,接受端在收到数据后,需要回复确认报文,确认报文中的ACK,等于接收序列号加长度,也就是下一包数据要发送的起始序列号。这样一问一答的发送方式能够使发送端确认发送的数据已经被接收端收到,发送端也可以一次发送连续的多包数据,接收端只需要回复一次ACK就可以了,这样发送端,可以把待发送的数据分割成一系列的碎片发送到对端,对端根据序列号和长度,在接收后重构出来完整的数据。假设其中丢失了某些数据包,在接收端可以要求发送端重传,比如丢失了100-199这100个字节,接收端向发送端发送ACK=100的报文,发送端收到后重传这一包数据,接收端进行补全,以上过程不区分客户端和服务端,tcp连接是全双工的,对于两端来说都采取这种机制。
TCP四次挥手过程
四次挥手过程:
客户端——发送带有FIN标志的数据包——服务端,关闭与服务端的连接 ,客户端进入FIN-WAIT-1状态
服务端收到这个 FIN,它发回⼀ 个 ACK,确认序号为收到的序号加1,服务端就进入了CLOSE-WAIT状态
服务端——发送⼀个FIN数据包——客户端,关闭与客户端的连接,客户端就进入FIN-WAIT-2状态
客户端收到这个 FIN,发回 ACK 报⽂确认,并将确认序号设置为收到序号加1,TIME-WAIT状态
为什么四次:
因为需要确保客户端与服务端的数据能够完成传输。
CLOSE-WAIT:
这种状态的含义其实是表示在等待关闭
TIME-WAIT(等待超时时间):
这是为了保证对方已收到ACK包,因为假设客户端发送完最后一包 ACK包后就释放了连接,一旦ACK包在网络中丢失,服务端将一直停留在最后确认状态,如果客户端发送最后一包ACK包后等待一段时间,这时服务端因为没有收到ACK包,会重发FIN包,客户端会响应这个FIN包,重发ACK包并刷新超时时间,也是为了保证在不可靠的网络链路中进行可靠的连接断开确认
如何查看TIME-WAIT状态的链接数量?
netstat -an |grep TIME_WAIT|wc -l 查看连接数等待time_wait状态连接数
为什么会TIME-WAIT过多?解决方法是怎样的?
可能原因: 高并发短连接的TCP服务器上,当服务器处理完请求后立刻按照主动正常关闭连接
解决:负载均衡服务器;Web服务器首先关闭来自负载均衡服务器的连
UDP协议
首先udp协议是基于非连接的,发送数据,就是简单地将数据包封装起来,然后从网卡发出去,数据包之间并没有状态上的联系,正因为udp这种简单的处理方式,导致他的性能损耗很小,资源占用也很小,但是对于网络传输过程中产生的丢包,UDP协议并不能保证,所以UDP在传输稳定性上要弱于tcp
1、OSI与TCP/IP 模型
OSI七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
2、TCP/IP模型各层的功能
TCP/IP五层:物理层、数据链路层、网络层、传输层、应用层
2、常见网络服务分层
应用层:HTTP、SMTP(支持电子邮件的 SMTP 协议)、DNS、FTP
传输层:TCP 、UDP
网络层:ICMP 、网际协议 IP 、NAT协议
网络接口层:以太网技术、MAC 协议、CSMA/CD 协议
3、TCP与UDP区别及场景
UDP全称为用户数据报协议。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
TCP全称传输控制协议,必须对数据的传输进行控制。
类型 | 特点 | 性能 | 应用过场景 | 首部字节 |
---|---|---|---|---|
TCP | 面向连接、可靠、字节流,适用于对网络通信质量要求较高的环境 | 传输效率慢、所需资源多 | 文件、邮件传输 | 20-60 |
UDP | 无连接、不可靠、数据报文段,适用于对实时性要求较高 | 传输效率快、所需资源少 | 语音、视频、直播 | 8个字节 |
基于TCP的协议:HTTP、FTP、SMTP
基于UDP的协议:RIP、DNS、SNMP
TCP与UDP区别总结:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
HTTP协议
1.HTTP报文
请求报文
GET请求
1、请求行
(1) 请求的方式 GET
(2) 请求的资源路径[+?+请求参数]
(3) 请求的协议的版本号 HTTP/1.1
2、请求头
浏览器的一些信息,由键值对组成
key : value 组成 不同的键值对,表示不同的含义
POST请求报文
1、请求行
(1) 请求的方式 POST
(2) 请求的资源路径[+?+请求参数]
(3) 请求的协议的版本号 HTTP/1.1
2、请求头
浏览器的一些信息,由键值对组成
1) key : value 不同的请求头,有不同的含义
3、空行
4、请求体 ===>>> 就是发送给服务器的数据
响应报文
1、响应行
(1) 响应的协议和版本号
(2) 响应状态码
(3) 响应状态描述符
2、响应头
(1) key : value 不同的响应头,有其不同含义
空行
3、响应体 ---->>> 就是回传给客户端的数据
2、HTTP与HTTPS之间的区别
HTTP与HTTPS之间的区别:
HTTP | HTTPS |
---|---|
默认端口80,URL前缀是http:// | HTTPS默认使用端口443,URL前缀https:// |
明文传输、数据未加密、安全性差 | 传输过程ssl加密、安全性较好 |
响应速度快、消耗资源少 | 响应速度较慢、消耗资源多、需要用到CA证书 |
URI 和 URL 的区别是什么?
- URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。
- URL(Uniform Resource Locator) 是统一资源定位符,可以提供该资源的路径。它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。
HTTPS链接建立的过程:
1.首先客户端先给服务器发送一个请求
2.服务器发送一个SSL证书给客户端,内容包括:证书的发布机构、有效期、所有者、签名以及公钥
3.客户端对发来的公钥进行真伪校验,校验为真则使用公钥对对称加密算法以及对称密钥进行加密
4.服务器端使用私钥进行解密并使用对称密钥加密确认信息发送给客户端
5.随后客户端和服务端就使用对称密钥进行信息传输
对称加密算法:
双方使用相同的加密算法,且加密速度快,典型对称加密算法:DES、AES
非对称加密算法:
密钥成对出现(私钥、公钥),私钥只有自己知道,不在网络中传输;而公钥可以公开。
私钥放在服务器里,数据经过公钥加密,只能私钥解密。数据经过私钥加密只能公钥解密
相比对称加密速度较慢,典型的非对称加密算法有:RSA、DSA
证书
SSL证书其实就是保存在源服务器的数据文件,要让SSL证书生效就需要向CA申请,也就是Certificate Authority证书授权中心,这是第三方的机构,这样大家都来信任这个机构颁发的证书。
证书保存域名归属,日期,公钥
加密算法/压缩算法
常用的加密算法(md5,sha256,base64,RSA,DES,前3个不可逆,后2个可逆)
常用的压缩算法(gzip:底层基于了哈夫曼编码,字典压缩法,定长位压缩,前缀树压缩)
9、get/post的区别
HTTP请求:
方法 | 描述 |
---|---|
GET | 向特定资源发送请求,查询数据,并返回实体 |
POST | 向指定资源提交数据进行处理请求,可能会导致新的资源建立、已有资源修改 |
PUT | 向服务器上传新的内容 |
HEAD | 类似GET请求,返回的响应中没有具体的内容,用于获取报头 |
DELETE | 请求服务器删除指定标识的资源 |
OPTIONS | 可以用来向服务器发送请求来测试服务器的功能性 |
TRACE | 回显服务器收到的请求,用于测试或诊断 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器 |
区别:
POST:
①、参数不会拼接再请求地址后,会放在请求体中,所以post有请求体,get没有
②、post相对安全
③、post传输速度相对慢
④、传输数据量大,可以认为是无限制的
⑤、文件上传使用post
GET:
①、每当使用get请求方式提交参数,请求参数会拼接在请求在请求地址后,用?来拼接,后面是请求参数名=请求参数值&请求参数名=请求参数值。。。
②、因为会将参数放在地址栏,所以不安全
③、因为是伴随着地址传输,所以get传输速度快
④、传输数据量小
⑤、文件不可能拼接在地址中,如果使用get方式在传文件,地址栏传输的是文件的名称,所以上传文件不适用get
4、HTTP常见响应状态码
100:Continue --- 继续。客户端应继续其请求。
200:OK --- 请求成功。一般用于GET与POST请求。
301:Moved Permanently --- 永久重定向。
302:Found --- 暂时重定向。
400:Bad Request --- 客户端请求的语法错误,服务器无法理解。(跨域问题)
403:Forbideen --- 服务器理解请求客户端的请求,但是拒绝执行此请求。
404:Not Found --- 服务器无法根据客户端的请求找到资源(网页)。
500:Internal Server Error --- 服务器内部错误,无法完成请求。
502:Bad Gateway --- 作为网关或者代理服务器尝试执行请求时,从远程服务器接收到了无效的响应。
5、重定向和转发区别
重定向:redirect:
地址栏发生变化
重定向可以访问其他站点(服务器)的资源
重定向是两次请求。不能使用request对象来共享数据
转发:forward:
请求转发是指,服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发
转发地址栏路径不变
转发只能访问当前服务器下的资源
转发是一次请求,可以使用request对象共享数据
6、Cookie和Session区别。
Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,但两者有所区别:
Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行欺骗,考虑到安全应当使用session。
Cookie ⼀般⽤来保存⽤户信息,Session 的主要作⽤就是通过服务端记录⽤户的状态
Cookie、Session、Token究竟区别在哪?如何进行身份认证,保持用户登录状态?
7,浏览器输入URL过程
过程:DNS解析、TCP连接、发送HTTP请求、服务器处理请求并返回HTTP报文、浏览器渲染、结束
过程 | 使用的协议 |
---|---|
1、DNS解析-把URL地址解析为ip地址(浏览器缓存、路由器缓存、DNS缓存) | DNS:获取域名对应的ip |
2、根据ip建立TCP连接,就是三次握手 | TCP:与服务器建立连接 |
3、浏览器向服务器发送HTTP请求,HTTP请求具体看上面 | HTTP:发送请求 |
4、服务器响应HTTP响应,具体看上面 | HTTP |
5、浏览器进行渲染 |
操作系统基础
进程和线程的区别
进程:是资源分配的最小单位,一个进程可以有多个线程,多个线程共享进程的堆和方法区资源,不共享栈、程序计数器
线程:是任务调度和执行的最小单位,线程并行执行存在资源竞争和上下文切换的问题
协程:是一种比线程更加轻量级的存在,正如一个进程可以拥有多个线程一样,一个线程可以拥有多个协程。
进程间的通信方式
👨💻面试官 :进程间的通信常见的的有哪几种方式呢?
🙋 我 :大概有 7 种常见的进程间的通信方式。
下面这部分总结参考了:《进程间通信 IPC (InterProcess Communication)》open in new window 这篇文章,推荐阅读,总结的非常不错。
- 管道/匿名管道(Pipes) :用于具有亲缘关系的父子进程间或者兄弟进程之间的通信。
- 有名管道(Names Pipes) : 匿名管道由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道。有名管道严格遵循先进先出(first in first out)。有名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。
- 信号(Signal) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生;
- 消息队列(Message Queuing) :消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。管道和消息队列的通信数据都是先进先出的原则。与管道(无名管道:只存在于内存中的文件;命名管道:存在于实际的磁盘介质或者文件系统)不同的是消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显式地删除一个消息队列时,该消息队列才会被真正的删除。消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取.比 FIFO 更有优势。消息队列克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小受限等缺点。
- 信号量(Semaphores) :信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。这种通信方式主要用于解决与同步相关的问题并避免竞争条件。
- 共享内存(Shared memory) :使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有用的进程间通信方式。
- 套接字(Sockets) : 此方法主要用于在客户端和服务器之间通过网络进行通信。套接字是支持 TCP/IP 的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
2.4 线程间的同步的方式
👨💻面试官 :那线程间的同步的方式有哪些呢?
🙋 我 :线程同步是两个或多个共享关键资源的线程的并发执行。应该同步线程以避免关键的资源使用冲突。操作系统一般有下面三种线程同步的方式:
- 互斥量(Mutex):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。比如 Java 中的 synchronized 关键词和各种 Lock 都是这种机制。
- 信号量(Semaphore) :它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
- 事件(Event) :Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。
#2.5 进程的调度算法
👨💻面试官 :你知道操作系统中进程的调度算法有哪些吗?
🙋 我 :嗯嗯!这个我们大学的时候学过,是一个很重要的知识点!
为了确定首先执行哪个进程以及最后执行哪个进程以实现最大 CPU 利用率,计算机科学家已经定义了一些算法,它们是:
- 先到先服务(FCFS)调度算法 : 从就绪队列中选择一个最先进入该队列的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。
- 短作业优先(SJF)的调度算法 : 从就绪队列中选出一个估计运行时间最短的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。
- 时间片轮转调度算法 : 时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法,又称 RR(Round robin)调度。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。
- 多级反馈队列调度算法 :前面介绍的几种进程调度的算法都有一定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程 。多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业(进程)迅速完成。,因而它是目前被公认的一种较好的进程调度算法,UNIX 操作系统采取的便是这种调度算法。
- 优先级调度 : 为每个流程分配优先级,首先执行具有最高优先级的进程,依此类推。具有相同优先级的进程以 FCFS 方式执行。可以根据内存要求,时间要求或任何其他资源要求来确定优先级。
#2.6 什么是死锁
👨💻面试官 :你知道什么是死锁吗?
🙋 我 :死锁描述的是这样一种情况:多个进程/线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于进程/线程被无限期地阻塞,因此程序不可能正常终止。
#2.7 死锁的四个条件
👨💻面试官 :产生死锁的四个必要条件是什么?
🙋 我 :如果系统中以下四个条件同时成立,那么就能引起死锁:
-
互斥条件:进程对所分配到的资源不允许其他进程访问,若其他进程访问该资源,只能等待至占有该资源的进程释放该资源;
-
请求与保持条件:进程获得一定的资源后,又对其他资源发出请求,阻塞过程中不会释放自己已经占有的资源
-
非剥夺条件:进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用后自己释放循
-
环等待条件:系统中若干进程组成环路,环路中每个进程都在等待相邻进程占用的资源
注意,只有四个条件同时成立时,死锁才会出现。
#2.8 解决死锁的方法
破坏死锁的任意一条件
-
乐观锁,破坏资源互斥条件,CAS
-
资源一次性分配,从而剥夺请求和保持条件、tryLock
-
可剥夺资源:即当进程新的资源未得到满足时,释放已占有的资源,从而破坏不可剥夺的条件,数据库deadlock超时
-
资源有序分配法:系统给每类资源赋予一个序号,每个进程按编号递增的请求资源,从而破坏环路等待的条件,转账场景
操作系统内存管理
内存存管理方式
页式管理、段式管理、段页式管理
分段管理:
将程序的地址空间划分为若干段(segment),如代码段,数据段,堆栈段;这样每个进程有一个二维地址空间,相互独立,互不干扰。段式管理的优点是:没有内碎片(因为段大小可变,改变段大小来消除内碎片)。但段换入换出时,会产生外碎片(比如4k的段换5k的段,会产生1k的外碎片)
分页管理:
在页式存储管理中,将程序的逻辑地址划分为固定大小的页(page),而物理内存划分为同样大小的页框,程序加载时,可以将任意一页放入内存中任意一个页框,这些页框不必连续,从而实现了离散分离。页式存储管理的优点是:没有外碎片(因为页的大小固定),但会产生内碎片(一个页可能填充不满)
段页式管理:
段⻚式管理机制结合了段式管理和⻚式管理的优点。简单来说段⻚式管理机制就是把主存先分成若⼲段,每个段⼜分成若⼲⻚,也就是说 段⻚式管理机制 中段与段之间以及段的内部的都是离散的
2、死锁条件、解决方式。
死锁是指两个或两个以上进程在执行过程中,因争夺资源而造成的下相互等待的现象;
死锁的条件:
互斥条件:进程对所分配到的资源不允许其他进程访问,若其他进程访问该资源,只能等待至占有该资源的进程释放该资源;
请求与保持条件:进程获得一定的资源后,又对其他资源发出请求,阻塞过程中不会释放自己已经占有的资源
非剥夺条件:进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用后自己释放
循环等待条件:系统中若干进程组成环路,环路中每个进程都在等待相邻进程占用的资源
解决方法:破坏死锁的任意一条件
乐观锁,破坏资源互斥条件,CAS
资源一次性分配,从而剥夺请求和保持条件、tryLock
可剥夺资源:即当进程新的资源未得到满足时,释放已占有的资源,从而破坏不可剥夺的条件,数据库deadlock超时
资源有序分配法:系统给每类资源赋予一个序号,每个进程按编号递增的请求资源,从而破坏环路等待的条件,转账场景