五、计算机网络
5.1 OSI七层协议模型
从上到下 | 传输单位 | 任务 | 功能 | 常见协议 |
---|---|---|---|---|
应用层 | ~ | 用户与网络交互界面,为特定网络应用提供访问OSI环境服务 | ~ | HTTP,FTP,SMTP,DNS |
表示层 | ~ | 处理两个通信系统中交换信息的方式 | 数据压缩,数据加密解密 | - |
会话层 | ~ | 建立同步SYN | ~ | - |
传输层 | 报文段(TCP)或用户数据报(UDP) | 负责主机中两个进程之间的通信,为端到端提供可靠的传输服务 | 流量控制;差错控制;数据传输管理 | TCP,UDP |
网络层 | 数据报 | 把网络层的协议数据单元(分组)从源端传送到目的端,为分组交换网上的不同主机提供通信服务 | 路由选择;流量控制;拥塞控制;差错控制;网际互联等功能 | IP,ICMP,IGMP,ARP,RARP,OSPF |
数据链路层 | 帧 | 将网络层传下来的IP数据报组装成帧 | 成帧;差错控制;流量管理;传输管理 | PPP,帧中继 |
物理层 | 比特 | 传输透明比特流 | 在物理媒体上为数据端设备透明传输比特流 | EIA-232C |
5.2 TCP/IP 协议
TCP/IP | OSI |
应用层 | 应用层 |
表示层 | |
会话层 | |
运输层 | 传输层 |
网际层 | 网络层 |
网络接口层 | 数据链路层 |
物理层 |
5.3 三次握手&四次挥手*
TCP属于可靠的数据传输协议,在建立连接时需要三次握手
,断开连接需要四次挥手
。过程如图
(1)简述三次握手过程:
①首先A向B发SYN(同步请求)
②然后B回复SYN+ACK(同步请求应答)
③最后A回复ACK确认。至此TCP链接建立完成
(2)简述四次挥手过程:
①客户端打算关闭连接,发送连接释放报文(FIN),并停止发送数据
②服务端收到连接释放报文立即发出确认报文,服务器进入半关闭状态
③若服务器不会再发送数据,向客户端发送FIN连接释放
④客户端收到服务端的连接释放后立即发送确认报文,此时客户端等待2MSL后进入关闭状态。至此TCP释放完成
扩展1. 为什么需要三次握手?两次可以吗?
答:不可以。假如只有前面2次握手,那么服务端来收到SYN并且发出SYN+ACK包之后就会处于工作状态。在这种情况下如果服务端在某一时刻突然收到了一个来自客户端的SYN包,在发出ACK之后,服务端处于工作状态。但是可能这个包是卡了很久已经被客户端给丢弃了。客户端收到这个SYN+ACK之后,并不会理会这个报文,但是服务端已经处于工作状态了,会造成资源的浪费。
扩展2. 为什么断开连接需要四次?而不是三次
答:根据状态流程图,我们可以看出服务端响应断开连接的请求时,其ACK和FIN包并不是一起发送给客户端的,因为第一次由客户端->服务端的FIN信号表示的是客户端想要断开连接。服务端先给出ACK确认信号,表示已经收到FIN请求,然后当自己也可以结束的时候,再次发送FIN信号,。
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。
扩展2. 四次挥手主动方为什么需要等待2MSL?“
答:MSL表示最大报文生存周期,任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。主动关闭方需要等待2MSL是为了,防止最后一次ACK没有被正确的传给被动方,被动关闭方会再次发送第三次的FIN信号。
5.4 TCP和UDP协议的区别?*
- TCP协议进行数据通信之前需要三次握手建立连接,UDP协议不需要建立连接即可发送数据。
- TCP有确认机制,丢包可以重发,保证数据的正确性;UDP不保证正确性,只是单纯的负责发送数据包。
- TCP协议可能会对大数据包进行拆分,并且在接收方进行重组数据包操作;UDP协议是面向报文的,不会进行分片和重组,所以需要注意传输的报文大小。
- 网络包中的TCP头部为20个字节;UDP头部只有8个字节。-
TCP常用于文件传输、邮件发送等可靠数据传输;UDP由于传输不需要建立连接,资源消耗较小,常用在视频直播、语音传输中,域名解析服务DNS都使用了UDP协议。
5.5 TCP协议的拥塞避免算法
拥塞控制:防止过多的数据注入到网络中,使得网络中的路由器或链路不致过载。
当网络中的资源供应不足,网络的性能就要明显变坏,整个网络的吞吐量随之负荷的增大而下降。也就是说对资源的需求超过了可用的资源,因为传输数据是需要资源的。拥塞避免算法主要有如下两种:
- 慢启动+拥塞避免
慢启动:当cwnd < ssthresh
时,每收到一个报文确认,cwnd+1
拥塞避免:当cwnd > ssthresh
时,每经过一个往返时延,cwnd+1
- 快重传+快恢复
快重传:当收到连续三个重复的ACK,直接重传对方期待的报文
拥塞避免:当收到连续三个冗余的ACK,令ssthresh=cwnd=cwnd/2
备注:ssthresh
:慢开始门限, cwnd
:滑动窗口大小
5.6 HTTP协议
(1)基本概念
HTTP是超文本传输协议,是一种无状态的协议,是常见的一种应用层协议。HTTP是一个通信规则,规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。
-
HTTP请求信息
:HTTP请求头中可以看到当前请求支持的语言,压缩格式,编码格式以及何种类型的返回文件,Connection以及Cookie,Content-Type等信息。 -
HTTP返回信息
:HTTP返回信息中包括响应协议,HTTP Code以及Content-Type,时间和Cookie等信息。
(2) HTTP请求中的Get
和Post
方法的区别
- Get方法一般用来从服务器上查询获取资源;Post一般用来更新服务器上的资源;
- Get方法将参数直接拼接在URL后边,明文显示,可通过浏览器直接访问
- Post方法请求用于表单提交,数据不是明文,安全性更高;
- Get请求有长度限制,Post请求没有
(3)HTTP Code
Code码 | 解释 | 常见 |
---|---|---|
1xx(临时响应) | - | - |
2xx(成功) | - | 200 :成功 |
3xx(重定向) | 表示要完成请求需要进一步操作 | 302 (重定向):请求重定向到指定网页304 (未修改):自从上次请求后,请求的页面未修改过,服务器返回次响应时,不会返回网页内容 |
4xx(错误) | 表示请求可能出错,妨碍了服务器的处理 | 401 (未授权):请求要求身份验证403 (禁止):服务器拒绝请求404 (未找到):服务器找不到请求的网页资源405 (方法禁用):Post请求当成了Get请求直接访问 |
5xx(服务器错误) | 表示服务器在尝试处理请求时发生内部错误 | 500 (服务器内部错误):有bug导致程序出错502 (错误网关):服务器从上游接到了无效响应504 (网关超时):nginx请求超时,请求一直没有返回 |
5.7 Cookie和Session
因为HTTP时无状态协议,所以一般使用Cookie和session保持会话状态。用户发起请求,服务端收到请求处理后,生成一个sessionId,并且将sessionId存入cookie中返回给客户端,将session中的内容存储在服务器上,在下一次请求中,客户端带着cookie来请求服务器,服务端从cookie中取出sessionId,实现了与用户的会话保持。
Cookie 一般用来保存用户信息
,Session 的主要作用就是通过服务端记录用户的状态
缺点
:因为服务器端存储了额外的东西,在用户量较大的情况下,服务器负担较大,现阶段一般时将登录状态直接存入cookie并返回给用户,下次请求时,服务端直接去除cookie中的信息和参数信息进行比较,保持会话状态。
总结
:session保存在服务端,cookie保存在客户端,cookie有大小限制。
5.8 HTTP和HTTPS协议的区别*
- HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。
- HTTPS需要申请证书,一般是收费的
- HTTP默认80端口,HTTPS默认使用443端口
5.8.1 SSL协议
HTTPS协议在HTTP的基础上加入了SSL(安全套接字层)
协议,SSL逐渐演变为了TLS
协议。SSL协议在传输控制层的基础上建立了安全的连接,它作为一种通用可靠的安全解决方案,可与多种应用层协议结合使用,实现应用数据的安全传输。SSL协议分为记录协议
,握手协议
,警告协议
和密码规范改变协议
:
- 记录协议:接收上层协议或下层协议的消息并进行一系列的处理,然后再将处理后的消息继续向下或向上传递。主要包括对消息进行加解密,压缩解压缩,分段或者重组等操作。
- 握手协议:建立在三次握手之后,为通信双方确立安全连接所需要的安全参数,通常也会在此阶段对通信双方身份的真实性进行验证。
- 警告协议:无论是在握手阶段还是在对应用层数据的传输阶段,都有可能出现差错。警告协议规定了在SSL协议工作过程中可能出现的差错、错误的严重等级以及相应的处理方式。
- 密码规范改变协议:在SSL握手刚开始的时候,加密参数还没确定,消息都是明文传送的。双方协商好加密参数之后,在发送握手结束消息之前,需要发送一个密码规范改变消息(Change Cipher Message)来通知对方随后的消息都使用刚刚协商好的加密算法和加密密钥进行加密。
5.9 HTTP1.0,HTTP1.1以及HTTP2.0协议的区别*
(1)HTTP1.0:一种无状态,无连接
的协议。浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态)。也就是默认使用Connection: close
(2)HTTP1.1:默认使用Connection: keep-alive
,避免了连接建立和释放的开销。但服务器必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容。通过Content-Length
字段来判断当前请求的数据是否已经全部接收。不允许同时存在两个并行的响应。
(3)HTTP2.0:新增了二进制分帧
,多路复用
,头部压缩
和服务器推送
等功能,进一步提高了传输效率。
5.10 路由汇聚,子网划分及子网掩码求法
(1) 路由汇聚
是指把一组路由汇聚为一个单个的路由广播。路由汇聚优点是可以缩小网络上的路由表的尺寸。
如将下面四个网络内聚在一个网络上,为: 172.18.128.0/21
172.18.129.0/24
172.18.130.0/24
172.18.132.0/24
172.18.133.0/24
(2)子网划分
:根据主机数确定后面1的位数,或者网段数确定前面1的位数,注意0和255是否可取。 由此得出子网掩码和子网
5.11 浏览器输入了一个地址,发生了什么?*
简述:
1、浏览器的地址栏输入URL并按下回车。
2、浏览器查找当前URL是否存在缓存,并比较缓存是否过期。
3、DNS解析URL对应的IP。
4、根据IP建立TCP连接(三次握手)。
5、HTTP发起请求。
6、服务器处理请求,浏览器接收HTTP响应。
7、渲染页面,构建DOM树。
8、关闭TCP连接(四次挥手)。
文字描述:
①在浏览器中输入一个网址,首先要做的就是域名的解析,也就是域名->②ip的解析,依次查看了浏览器缓存,系统缓存,hosts文件,路由器缓存,递归搜索根域名服务器,直到找到最终的ip地址。(查询使用UDP)
③然后就是TCP协议的三次握手建立连接,过程我们已经阐述了。由浏览器发送一个HTTP请求;
④经过路由器的转发,通过服务器的防火墙,该HTTP请求到达了服务器;
⑤服务器处理该HTTP请求,返回一个HTML文件;
⑥浏览器解析该HTML文件,并且渲染显示在浏览器端。
⑦断开连接
网络层 | 协议 |
---|---|
应用层 | DNS,HTTP |
传输层 | TCP,UDP |
网络层 | IP,ARP |
六、操作系统
6.1 进程与线程的区别
进程与线程的区别*
进程
是一个可独立执行的程序,是系统资源分配
和调度
的一个独立单位
线程
是进程的一个实体
,一个进程中一般拥有多个线程。线程之间共享地址空间和其他资源(所以通信和同步等操作,线程比进程更加容易)- 线程一般不拥有系统资源,但是也有一些必不可少的资源(使用
ThreadLocal
存储) - 线程上下文的切换比进程上下文切换要快得多,原因如下:
①进程切换时
,设计当前进程的CPU环境的保存和新被调度运行进程的CPU环境设置
②线程切换时
,仅需要保存和设置少量的寄存器内容,不涉及存储管理方面的操作
6.2 进程之间的通信方式*
管道/匿名管道(Pipes)
:用于具有亲缘关系的父子进程间或者兄弟进程之间的通信。
-信号(Signal)
:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生;消息队列(Message Queuing)
:消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。管道和消息队列的- 通信数据都是先进先出的原则。与管道(无名管道:只存在于内存中的文件;命名管道:存在于实际的磁盘介质或者文件系统)不同的是消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显示地删除一个消息队列时,该消息队列才会被真正的删除。消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取.比 FIFO 更有优势。消息队列克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小受限等缺。信号量(Semaphores)
:信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。这种通信方式主要用于解决与同步相关的问题并避免竞争条件。共享内存(Shared memory)
:使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有用的进程间通信方式。套接字(Sockets)
: 此方法主要用于在客户端和服务器之间通过网络进行通信。套接字是支持 TCP/IP 的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
6.3 线程间的同步的方式
- 互斥量(Mutex):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。比如 Java 中的 synchronized 关键词和各种 Lock 都是这种机制。
- 信号量(Semphares) :它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量
- 事件(Event) :Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操
6.4 进程的调度算法
先到先服务(FCFS)调度算法
: 从就绪队列中选择一个最先进入该队列的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。短作业优先(SJF)的调度算法
: 从就绪队列中选出一个估计运行时间最短的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。时间片轮转调度算法
: 时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法,又称 RR(Round robin)调度。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。多级反馈队列调度算法
:前面介绍的几种进程调度的算法都有一定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程 。多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业(进程)迅速完成。,因而它是目前被公认的一种较好的进程调度算法,UNIX 操作系统采取的便是这种调度算法。优先级调度
: 为每个流程分配优先级,首先执行具有最高优先级的进程,依此类推。具有相同优先级的进程以 FCFS 方式执行。可以根据内存要求,时间要求或任何其他资源要求来确定优先级。
6.5 内存管理 以及 方式
内存管理介绍:操作系统的内存管理主要负责内存的分配与回收(malloc 函数:申请内存,free 函数:释放内存),另外地址转换也就是将逻辑地址转换成相应的物理地址等功能也是操作系统内存管理做的事情。
- 块式管理 : 远古时代的计算机操系统的内存管理方式。将内存分为几个固定大小的块,每个块中只包含一个进程。如果程序运行需要内存的话,操作系统就分配给它一块,如果程序运行只需要很小的空间的话,分配的这块内存很大一部分几乎被浪费了。这些在每个块中未被利用的空间,我们称之为碎片。
- 页式管理 :把主存分为大小相等且固定的一页一页的形式,页较小,相对相比于块式管理的划分力度更大,提高了内存利用率,减少了碎片。页式管理通过页表对应逻辑地址和物理地址。
- 段式管理 : 页式管理虽然提高了内存利用率,但是页式管理其中的页实际并无任何实际意义。 段式管理把主存分为一段段的,每一段的空间又要比一页的空间小很多 。但是,最重要的是段是有实际意义的,每个段定义了一组逻辑信息,例如,有主程序段 MAIN、子程序段 X、数据段 D 及栈段 S 等。 段式管理通过段表对应逻辑地址和物理地址。
- 段页式管理机制 。段页式管理机制结合了段式管理和页式管理的优点,就是把主存先分成若干段,每个段又分成若干页,也就是说 段页式管理机制 中段与段之间以及段的内部的都是离散的。
6.6 分页机制和分段机制的共同点和区别
共同点 :
- 分页机制和分段机制都是为了提高内存利用率,较少内存碎片。
- 页和段都是离散存储的,所以两者都是离散分配内存的方式。但是,每个页和段中的内存是连续的。
区别 : - 页的大小是固定的,由操作系统决定;而段的大小不固定,取决于我们当前运行的程序。
- 分页仅仅是为了满足操作系统内存管理的需求,而段是逻辑信息的单位,在程序中可以体现为代码段,数据段,能够更好满足用户的需要。
6.7 逻辑(虚拟)地址和物理地址
我们编程一般只有可能和逻辑地址打交道,比如在 C 语言中,指针里面存储的数值就可以理解成为内存里的一个地址,这个地址也就是我们说的逻辑地址
,逻辑地址由操作系统决定
。物理地址指的是真实物理内存中地址
,更具体一点来说就是内存地址寄存器中的地址。物理地址是内存单元真正的地址。
6.8 CPU 寻址了解吗?为什么需要虚拟地址空间?
处理器使用的是一种称为 虚拟寻址(Virtual Addressing)
的寻址方式。使用虚拟寻址,CPU 需要将虚拟地址翻译成物理地址
,这样才能访问到真实的物理内存。
为什么要有虚拟地址空间呢?
没有虚拟地址空间的时候,程序都是直接访问和操作的都是物理内存 。
- 用户程序可以访问任意内存,寻址内存的每个字节,这样就很容易(有意或者无意)破坏操作系统,造成操作系统崩溃。
- 想要同时运行多个程序特别困难,比如你想同时运行一个微信和一个 QQ 音乐都不行。为什么呢?举个简单的例子:微信在运行的时候给内存地址 1xxx 赋值后,QQ 音乐也同样给内存地址 1xxx 赋值,那么 QQ 音乐对内存的赋值就会覆盖微信之前所赋的值,这就造成了微信这个程序就会崩溃。
6.9 虚拟内存(Virtual Memory)
虚拟内存 可以让程序可以拥有超过系统物理内存大小的可用内存空间。另外,虚拟内存为每个进程提供了一个一致的、私有的地址空间,它让每个进程产生了一种自己在独享主存的错觉(每个进程拥有一片连续完整的内存空间)。这样会更加有效地管理内存并减少出错。
6.10 CPU 局部性原理
- 时间局部性 :如果程序中的某条指令一旦执行,不久以后该指令可能再次执行;如果某数据被访问过,不久以后该数据可能再次被访问。产生时间局部性的典型原因,是由于在程序中存在着大量的循环操作。
- 空间局部性 :一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,这是因为指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的。
6.11 页面置换算法
解释当发生缺页中断时,如果当前内存中并没有空闲的页面,操作系统就必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。用来选择淘汰哪一页的规则叫做页面置换算法
OPT 页面置换算法(最佳页面置换算法)
:最佳(Optimal, OPT)置换算法所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。但由于人们目前无法预知进程在内存下的若千页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现。一般作为衡量其他置换算法的方法。FIFO(First In First Out) 页面置换算法(先进先出页面置换算法)
: 总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰。LRU (Least Currently Used)页面置换算法(最近最久未使用页面置换算法)
:LRU算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 T,当须淘汰一个页面时,选择现有页面中其 T 值最大的,即最近最久未使用的页面予以淘汰。LFU (Least Frequently Used)页面置换算法(最少使用页面置换算法)
: 该置换算法选择在之前时期使用最少的页面作为淘汰页。
6.12 虚拟内存的技术实现
虚拟内存的实现需要建立在离散分配的内存管理方式的基础上。 虚拟内存的实现有以下三种方式:
请求分页存储管理
:建立在分页管理之上,为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能。请求分页是目前最常用的一种实现虚拟存储器的方法。请求分页存储管理系统中,在作业开始运行之前,仅装入当前要执行的部分段即可运行。假如在作业运行的过程中发现要访问的页面不在内存,则由处理器通知操作系统按照对应的页面置换算法将相应的页面调入到主存,同时操作系统也可以将暂时不用的页面置换到外存中。请求分段存储管理
:建立在分段存储管理之上,增加了请求调段功能、分段置换功能。请求分段储存管理方式就如同请求分页储存管理方式一样,在作业开始运行之前,仅装入当前要执行的部分段即可运行;在执行过程中,可使用请求调入中断动态装入要访问但又不在内存的程序段;当内存空间已满,而又需要装入新的段时,根据置换功能适当调出某个段,以便腾出空间而装入新的段。请求段页式存储管理
:
不管是上面那种实现方式,我们一般都需要:
- 一定容量的内存和外存:在载入程序的时候,只需要将程序的一部分装入内存,而将其他部分留在外存,然后程序就可以执行了;
- 缺页中断:如果需执行的指令或访问的数据尚未在内存(称为缺页或缺段),则由处理器通知操作系统将相应的页面或段调入到内存,然后继续执行程序;
- 虚拟地址空间 :逻辑地址到物理地址的变换。
扩展: Linux常用命令
命令 | 解释 |
---|---|
切换目录 | |
cp, mv,rm | 复制、剪切、删除 |
ls、ll | 查看信息 |
cd、mkdir、find | 打开、创建、查找目录 |
touch 、cat、vim | 文件的创建、查看、修改 |
tar、zip | 解压缩 |
chmod | 权限 |
useradd 、userdel、usermod、 password | 用户的添加、删除、修改、修改密码 |
groupadd、groupmod、groupdel | 用户组的添加、修改、删除 |
pwd | 查看路径 |
grep 要搜索的字符串 要搜索的文件 --color | 搜索命令 |
ps -ef、ps -aux | 这两个命令都是查看当前系统正在运行进程 |
kill -9 进程的pid | 杀死进程 |
ifconfig、ping、netstat -an | 网关命令 |
shutdown、reboot | 关机、重启 |