计网操作系统
计网操作系统
计网
计网基础知识
1.解释一下IP地址、子网掩码、网络地址。
IP 地址
IP地址是用来唯一标识互联网上每台设备的数字地址。IPv4地址是一个32位的二进制数,通常表示为四个十进制数(每个数在0到255之间),中间用点号分隔开,如192.168.1.1
。而IPv6地址则是一个128位的二进制数,通常表示为八组四位十六进制数,中间用冒号分隔,例如2001:0db8:85a3:0000:0000:8a2e:0370:7334
。
子网掩码
子网掩码用于确定IP地址中的哪部分代表网络地址,哪部分代表主机地址。通过与IP地址进行按位与运算,子网掩码可以帮助计算出设备所属的具体子网。对于IPv4,子网掩码也是一个32位的二进制数,通常以点分十进制形式表示,例如255.255.255.0
。不同的子网掩码可以创建不同大小的子网。
网络地址
IP地址和子网掩码进行按位与(bitwise AND)运算可以得到网络地址,也就是该IP地址所在的网络部分。
2.如何在Linux上配置一个IP地址,如果给定端口号如何解析出域名?
- 配置Linux系统的IP地址的方法,主要有以下三种: -ifconfig ifconfig 命令主要是用来查看网卡的配置信息,因为用它来配置网卡的IP地址时,只会临时生效 (Linux服务器重启后就会失效)setup setup 命令是 redhat 系列的linux系统(如CentOS)中专有的命令工具。可以使用 setup 命令, 来对网络配置中的IP地址、子网掩码、默认网关、DNS服务器进行设置。而且,setup 网络配置工 具设置的IP地址会永久生效。 修改网卡的配置文件 直接修改网卡的配置文件,设置方法有两种: 自动获取动态IP地址 手工配置静态的IP地址使用dig命令解析域名
3.客户端发送给服务器的请求,怎么确定具体的协议?
4. 谈谈单工、双工、半双工的通信方式。
0.OSI和TCP/IP 网络分层模型
1.OSI 七层模型
2.TCP/IP模型
由以下 4 层组成:
- 应用层
- 传输层
- 网络层
- 网络接口层
1.应用层
应用层位于传输层之上,主要提供两个终端设备上的应用程序之间信息交换的服务,它定义了信息交换的格式,消息会交给下一层传输层来传输。 我们把应用层交互的数据单元称为报文。
应用层常见协议:
HTTP(Hypertext Transfer Protocol,超文本传输协议):基于 TCP 协议,是一种用于传输超文本和多媒体内容的协议,主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的。
SMTP(Simple Mail Transfer Protocol,简单邮件发送协议):基于 TCP 协议,是一种用于发送电子邮件的协议。注意 ⚠️:SMTP 协议只负责邮件的发送,而不是接收。要从邮件服务器接收邮件,需要使用 POP3 或 IMAP 协议。
POP3/IMAP(邮件接收协议):基于 TCP 协议,两者都是负责邮件接收的协议。IMAP 协议是比 POP3 更新的协议,它在功能和性能上都更加强大。IMAP 支持邮件搜索、标记、分类、归档等高级功能,而且可以在多个设备之间同步邮件状态。几乎所有现代电子邮件客户端和服务器都支持 IMAP。
FTP(File Transfer Protocol,文件传输协议) : 基于 TCP 协议,是一种用于在计算机之间传输文件的协议,可以屏蔽操作系统和文件存储方式。注意 ⚠️:FTP 是一种不安全的协议,因为它在传输过程中不会对数据进行加密。建议在传输敏感数据时使用更安全的协议,如 SFTP。
Telnet(远程登陆协议):基于 TCP 协议,用于通过一个终端登陆到其他服务器。Telnet 协议的最大缺点之一是所有数据(包括用户名和密码)均以明文形式发送,这有潜在的安全风险。这就是为什么如今很少使用 Telnet,而是使用一种称为 SSH 的非常安全的网络传输协议的主要原因。
SSH(Secure Shell Protocol,安全的网络传输协议):基于 TCP 协议,通过加密和认证机制实现安全的访问和文件传输等业务
RTP(Real-time Transport Protocol,实时传输协议):通常基于 UDP 协议,但也支持 TCP 协议。它提供了端到端的实时传输数据的功能,但不包含资源预留存、不保证实时传输质量,这些功能由 WebRTC 实现。
DNS(Domain Name System,域名管理系统): 基于 UDP 协议,用于解决域名和 IP 地址的映射问题。
2.传输层
传输层的主要任务就是负责向两台终端设备进程之间的通信提供通用的数据传输服务。 应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。
传输层常见协议:
- TCP(Transmission Control Protocol,传输控制协议 ):提供 面向连接 的,可靠 的数据传输服务。
- UDP(User Datagram Protocol,用户数据协议):提供 无连接 的,尽最大努力 的数据传输服务(不保证数据传输的可靠性),简单高效。
3.网络层
网络层负责为分组交换网上的不同主机提供通信服务。 在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报,简称数据报。
网络层常见协议:
IP(Internet Protocol,网际协议):TCP/IP 协议中最重要的协议之一,主要作用是定义数据包的格式、对数据包进行路由和寻址,以便它们可以跨网络传播并到达正确的目的地。目前 IP 协议主要分为两种,一种是过去的 IPv4,另一种是较新的 IPv6,目前这两种协议都在使用,但后者已经被提议来取代前者。
ARP(Address Resolution Protocol,地址解析协议):ARP 协议解决的是网络层地址和链路层地址之间的转换问题。因为一个 IP 数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但 IP 地址属于逻辑地址,而 MAC 地址才是物理地址,ARP 协议解决了 IP 地址转 MAC 地址的一些问题。
ICMP(Internet Control Message Protocol,互联网控制报文协议):一种用于传输网络状态和错误消息的协议,常用于网络诊断和故障排除。例如,Ping 工具就使用了 ICMP 协议来测试网络连通性。
NAT(Network Address Translation,网络地址转换协议):NAT 协议的应用场景如同它的名称——网络地址转换,应用于内部网到外部网的地址转换过程中。具体地说,在一个小的子网(局域网,LAN)内,各主机使用的是同一个 LAN 下的 IP 地址,但在该 LAN 以外,在广域网(WAN)中,需要一个统一的 IP 地址来标识该 LAN 在整个 Internet 上的位置。
OSPF(Open Shortest Path First,开放式最短路径优先) ):一种内部网关协议(Interior Gateway Protocol,IGP),也是广泛使用的一种动态路由协议,基于链路状态算法,考虑了链路的带宽、延迟等因素来选择最佳路径。
RIP(Routing Information Protocol,路由信息协议):一种内部网关协议(Interior Gateway Protocol,IGP),也是一种动态路由协议,基于距离向量算法,使用固定的跳数作为度量标准,选择跳数最少的路径作为最佳路径。
BGP(Border Gateway Protocol,边界网关协议):一种用来在路由选择域之间交换网络层可达性信息(Network Layer Reachability Information,NLRI)的路由选择协议,具有高度的灵活性和可扩展性。
4.网络接口层
我们可以把网络接口层看作是数据链路层和物理层的合体。
- 数据链路层(data link layer)通常简称为链路层( 两台主机之间的数据传输,总是在一段一段的链路上传送的)。数据链路层的作用是将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
- 物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异
3.网络为什么要分层?
我觉得主要有 3 方面的原因:
- 各层之间相互独立:各层之间相互独立,各层之间不需要关心其他层是如何实现的,只需要知道自己如何调用下层提供好的功能就可以了(可以简单理解为接口调用)。这个和我们对开发时系统进行分层是一个道理。
- 提高了整体灵活性:每一层都可以使用最适合的技术来实现,你只需要保证你提供的功能以及暴露的接口的规则没有改变就行了。这个和我们平时开发系统的时候要求的高内聚、低耦合的原则也是可以对应上的。
- 大问题化小:分层可以将复杂的网络问题分解为许多比较小的、界线比较清晰简单的小问题来处理和解决。这样使得复杂的计算机网络系统变得易于设计,实现和标准化。 这个和我们平时开发的时候,一般会将系统功能分解,然后将复杂的问题分解为容易理解的更小的问题是相对应的,这些较小的问题具有更好的边界(目标和接口)定义。
1.TCP和UDP
0.udp
1.tcp的单播和udp的多播和广播
- 单播:两个主机间单对单的通信
- 广播:一个主机对整个局域网上所有主机上的数据通信(网络地址全1)
单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网的主机进行通信
3.多播:实际情况下,经常需要对一组特定的主机进行通信,而不是所有局域网上的主机
2.udp怎么解决数据包顺序错乱和丢包的问题/怎么保证可靠传输?
UDP(用户数据报协议)是一种无连接的传输层协议,它提供了不可靠的数据报服务。这意味着UDP本身并不保证数据包的顺序或防止数据包丢失。然而,可以在应用层上实现一些机制来解决这些问题。以下是一些常用的方法:
解决数据包顺序错乱的问题
- 序列号机制: 给每个发送的数据包分配一个唯一的序列号。接收端可以根据序列号重新排序接收到的数据包,确保它们按照正确的顺序处理。
- 确认应答(ACK)机制: 发送方为每个数据包设置一个定时器,并等待接收方的确认。如果在定时器超时前没有收到确认,则可以假设数据包已丢失,并重新发送该数据包。接收方在接收到数据包后,会根据序列号发送确认信息给发送方,以告知哪些数据包已经正确接收。
- 滑动窗口协议: 滑动窗口协议允许发送方连续发送多个数据包而不需要为每一个数据包等待确认。接收方可以使用序列号来识别乱序到达的数据包,并通过累积确认告诉发送方哪些数据包已经被成功接收。
解决数据包丢失的问题
- 超时重传: 结合上述的序列号和确认机制,如果发送方在一定时间内未收到确认,则认为数据包丢失并进行重传。
- 冗余编码: 在发送数据时加入一定的冗余信息(如前向纠错码FEC),这样即使某些数据包丢失,接收端也可以利用剩余的数据包和冗余信息恢复原始数据。
- 混合ARQ(自动重传请求): 结合前向纠错(FEC)与传统的ARQ技术,允许接收方在检测到丢失或错误时尝试自行纠正错误,同时对于无法纠正的情况请求重传。
这些方法都需要在应用程序层面实现,因为UDP本身并没有提供这样的功能。实际上,许多实时通信系统,比如VoIP和视频流媒体服务,都会在其协议栈中包含类似的机制来应对UDP的不可靠性。
0.为什么需要TCP?
IP 层是「不可靠」的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性。
因为 TCP 是一个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。
1.TCP和UDP的区别?
TCP:传输控制协议,UDP:用户数据报协议。
区别:
1.TCP面向连接,即使用TCP通信双方传输前要三次握手来简历TCP连接;UDP是无连接的,即发送数据之前不需要建立连接,可以随时发送数据。
2.TCP仅支持单播(即一对一通信);UDP支持单播、多播和广播;
3.TCP提供可靠的服务(即不会出现无码、丢失等传输差错);UDP提供不可靠服务。因此,TCP适用于要求可靠传输且对实时性要求不高的应用,如文件传输和电子邮件;而UDP适合视频会议等实时应用。
4.TCP面向字节流,即把应用报文看成一连串无结构的字节流;UDP是面向报文的,即对应用保温既不合并也不拆分而是保留报文的边界。
5.TCP有拥塞控制;UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如实时视频会议等)。
6.TCP首部开销20字节;UDP的首部开销小,只有8个字节。
2.使用 TCP 的协议有哪些?使用 UDP 的协议有哪些?
基于TCP的应用层协议有:HTTP、FTP、SMTP、TELNET、SSH
- HTTP:HyperText Transfer Protocol(超文本传输协议),默认端口80
- FTP: File Transfer Protocol (文件传输协议), 默认端口(20用于传输数据,21用于传输控制信息)
- SMTP: Simple Mail Transfer Protocol (简单邮件传输协议) ,默认端口25
- TELNET: Teletype over the Network (网络电传), 默认端口23
- SSH:Secure Shell(安全外壳协议),默认端口 22
基于UDP的应用层协议:DNS、TFTP、SNMP
- DNS : Domain Name Service (域名服务),默认端口 53
- TFTP: Trivial File Transfer Protocol (简单文件传输协议),默认端口69
- SNMP:Simple Network Management Protocol(简单网络管理协议),通过UDP端口161接收,只有Trap信息采用UDP端口162。
3.TCP 协议是如何保证可靠传输的?
- 数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时 TCP 发送数据端超时后会重发数据;
- 对失序数据包重排序:既然 TCP 报文段作为 IP 数据报来传输,而 IP 数据报的到达可能会失序,因此 TCP 报文段的到达也可能会失序。TCP 将对失序数据进行重新排序,然后才交给应用层;
- 丢弃重复数据:对于重复数据,能够丢弃重复数据;
- 应答机制:当 TCP 收到发自 TCP 连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒;
- 超时重传:TCP在发送一个数据之后,就开启一个定时器,若是在这个时间内没有收到发送数据的ACK确认报文,则对该报文进行重传,在达到一定次数还没有成功时放弃并发送一个复位信号。
- 流量控制:TCP 连接的每一方都有固定大小的缓冲空间。TCP 的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP 使用的流量控制协议是可变大小的滑动窗口协议。
- 拥塞控制 : 当网络拥塞时,减少数据的发送。TCP 在发送数据的时候,需要考虑两个因素:一是接收方的接收能力,二是网络的拥塞程度。接收方的接收能力由滑动窗口表示,表示接收方还有多少缓冲区可以用来接收数据。网络的拥塞程度由拥塞窗口表示,它是发送方根据网络状况自己维护的一个值,表示发送方认为可以在网络中传输的数据量。发送方发送数据的大小是滑动窗口和拥塞窗口的最小值,这样可以保证发送方既不会超过接收方的接收能力,也不会造成网络的过度拥塞。
4.TCP怎么实现流量控制(滑动窗口)
TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
以下是TCP滑动窗口流量控制的基本工作原理:
- 窗口大小:在TCP连接建立时,双方会协商一个初始窗口大小。这个窗口大小是以字节为单位的,并且在数据传输过程中可以动态调整。接收方会在每个ACK(确认)报文中包含当前可用窗口大小的信息。
- 累积确认:当接收方收到数据段后,它不会立即对每一个数据段都发送一个确认,而是等待一段时间看是否能接收到后续的数据段,然后一次性确认所有已经正确到达的数据。这种方式提高了效率,减少了网络上的确认报文数量。
- 流量控制:发送方根据接收到的接收方的窗口大小来决定接下来可以发送多少数据。如果接收方处理不过来,它可以减小窗口大小,甚至设置为0来暂停发送方的数据发送。当接收方处理完一些数据后,它可以再次增加窗口大小,允许发送方继续发送数据。
- **选择性确认(SACK)**:除了基本的累积确认外,TCP还支持选择性确认。这意味着接收方可以告诉发送方哪些特定的数据块已经成功接收,这样发送方就只需要重传那些确实丢失的数据段,而不是从最后一个确认的序列号开始重传所有数据。
- 快速重传与恢复:当发送方检测到数据包丢失时,它不需要等到超时重传计时器到期就可以重传丢失的数据包。这是通过接收到三个重复的ACK来触发的,表明接收方正在等待某个特定的数据包。发送方会立即重传丢失的数据包,并进入快速恢复算法以调整其拥塞窗口大小。
其他流量控制方法(令牌桶和漏桶)
令牌桶和漏桶是两种流量控制算法,它们各自有不同的特性和适用场景。具体来说:
- 令牌桶:令牌桶通过以固定的速率向桶中添加令牌来控制流量,每个请求都需要消耗一个令牌。如果桶中有可用的令牌,则请求被允许通过;如果桶中没有令牌,则请求会被限制或拒绝。令牌桶能够应对一定程度的突发流量,因为它可以累积令牌,从而在短时间内处理更多的请求。
- 漏桶:漏桶则是以固定容量的桶来控制流量,请求像水流一样以一定的速率流入桶中,超过桶的容量部分会被丢弃。漏桶算法能够平滑地限制请求的速率,但不适合应对突发流量,因为它的容量是固定的,无法临时处理超过平均速率的请求。
在实际应用中,选择使用令牌桶还是漏桶取决于具体的业务需求和流量特性:
- 对于需要限制平均速率的场景:可以选择漏桶,因为它能够确保请求的处理速度不会超过预设的速率。
- 对于需要处理突发流量的场景:令牌桶更为合适,因为它允许在短时间内处理更多的请求,只要这些请求在之前的时间窗口内有足够的令牌积累。
总结来说,令牌桶更适合处理突发流量,而漏桶更适合平滑限制流量。在实际应用中,应根据系统的承受能力和业务需求来选择合适的流量控制算法。
5.TCP的重传机制是什么?
TCP在发送一个数据之后,就开启一个定时器,若是在这个时间内没有收到发送数据的ACK确认报文,则对该报文进行重传,在达到一定次数还没有成功时放弃并发送一个复位信号。
6.TCP 的拥塞控制是怎么实现的?
拥塞控制是为了防止过多的数据注入到网络中让网络过载
为了进行拥塞控制,TCP 发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。
TCP 的拥塞控制采用了四种算法,即 慢开始、 拥塞避免、快重传 和 快恢复。在网络层也可以使路由器采用适当的分组丢弃策略(如主动队列管理 AQM),以减少网络拥塞的发生。
- 慢开始: 慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd 初始值为 1,每经过一个传播轮次,cwnd 加倍。
- 拥塞避免: 拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送方的 cwnd 加 1.
- 快重传与快恢复: 在 TCP/IP 中,快速重传和恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包。没有 FRR,如果数据包丢失了,TCP 将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。有了 FRR,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。有了 FRR,就不会因为重传时要求的暂停被耽误。 当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。
7.说说TCP的三次握手
(序号字段seq:本TCP报文段数据载荷的第一个字节的序号;
确认号字段ack:指出希望受到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的数据的确认;
确认标志位ACK:值为1表示确认号字段有效;
同步标志位SYN:SYN=1且ACK=0表示是个TCP连接请求报文段;SYN=1且ACK=1表示同意连接请求报文段)
假设发送端为客户端,接收端为服务端。开始时客户端和服务端的状态都是CLOSED
。
- 第一次握手:客户端向服务端发起建立连接请求,客户端会随机生成一个起始序列号x,客户端向服务端发送连接请求报文,其中包含标志位
SYN=1
,序列号seq=x
。第一次握手前客户端的状态为CLOSE
,第一次握手后客户端的状态为SYN-SENT
。此时服务端的状态为LISTEN
。 - 第二次握手:服务端在收到客户端发来的连接请求报文后,会随机生成一个服务端的起始序列号y,然后给客户端回复确认报文段,其中包括标志位
SYN=1
,确认标志位ACK=1
(表示这是个TCP连接请求确认报文段),序列号seq=y
,确认号ack=x+1
。第二次握手前服务端的状态为LISTEN
,第二次握手后服务端的状态为SYN-RCVD
,此时客户端的状态为SYN-SENT
。 - 第三次握手:客户端收到服务端发来的报文后,会再向服务端发送确认报文段,其中包含确认标志位
ACK=1
,序列号seq=x+1
,确认号ack=y+1
。第三次握手前客户端的状态为SYN-SENT
,第三次握手后客户端和服务端的状态都为ESTABLISHED
。此时连接建立完成。
为什么不是两次握手?
之所以需要第三次握手,主要为了防止已失效的连接请求报文段突然又传输到了服务端,导致产生问题。
- 比如客户端A发出连接请求,可能因为网络阻塞原因,A没有收到确认报文,于是A再重传一次连接请求。
- 然后连接成功,等待数据传输完毕后,就释放了连接。
- A发出的第一个连接请求等到连接释放以后的某个时间才到达服务端B,此时B误认为A又发出一次新的连接请求,于是就向A发出确认报文段。
- 如果不采用三次握手,只要B发出确认,就建立新的连接了,此时A不会响应B的确认且A不发送数据,这时候B处于SYN-RECV状态一直等待A发送数据,浪费资源。
8.TCP的4次挥手
客户端先向其TCP发出连接释放报文段(FIN=1,seq=u
),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1
(终止等待1)状态,等待服务端的确认。
服务端收到连接释放报文段后即发出确认报文段(ACK=1,ack=u+1,seq=v
),服务端进入CLOSE-WAIT
(关闭等待)状态,此时的TCP处于半关闭状态,A到B的连接释放。
A收到B的确认后,进入FIN-WAIT-2
(终止等待2)状态,等待B发出的连接释放报文段。
B发送完数据,就会发出连接释放报文段(FIN=1,ACK=1,seq=w,ack=u+1
),B进入LAST-ACK
(最后确认)状态,等待A的确认。
A收到B的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1
),A进入TIME-WAIT
(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL
(最大报文段生存时间)后,A才进入CLOSED
状态。B收到A发出的确认报文段后关闭连接,若没收到A发出的确认报文段,B就会重传连接释放报文段。
第四次挥手为什么客户端要等待2MSL才进入Closed状态?
保证A发送的最后一个ACK报文段能够到达B。这个ACK
报文段有可能丢失,B收不到这个确认报文,就会超时重传连接释放报文段,然后A可以在2MSL
时间内收到这个重传的连接释放报文段,接着A重传一次确认,重新启动2MSL计时器,最后A和B都进入到CLOSED
状态,若A在TIME-WAIT
状态不等待一段时间,而是发送完ACK报文段后直接进入Closed状态,则A无法收到B重传的连接释放报文段,然后B就会反复重传连接释放报文段而不会进入Closed状态。
为什么是四次挥手?
在关闭连接时,当Server端收到Client端发出的连接释放报文时,很可能并不会立即关闭SOCKET,即服务端的报文还没有发完,所以Server端先回复一个ACK
确认报文,告诉Client端我收到你的连接释放报文了。只有等到Server端所有的报文都发送完了,这时Server端才能发送连接释放报文,之后两边才会真正的断开连接。故需要四次挥手。
9.TIME-WAIT
为什么出现TIME-WAIT?
主动关闭连接的一方在发送最后一个ACK后进入的一个临时状态,持续2MSL(1MSL是报文的存活时间)的时间长度。
当两个系统通过 TCP 协议进行通信,并且一方决定关闭连接时,会经过一个四次挥手的过程来完成连接的终止。在最后一次确认(ACK)发送之后,主动关闭连接的一方并不会立即释放端口并允许新的连接使用该端口,而是将该连接标记为 TIME_WAIT 状态,并等待一段时间(通常是两倍的最大段生存时间,即 2MSL),以确保最后一个 ACK 已经被被动关闭连接的一方正确接收。这段时间过后,连接才会被完全关闭,并且端口号可以被重新分配给其他服务。
1.TIME_WAIT 状态会导致什么问题
从网络资源的角度看,该状态下的TCP连接占用了本地端口,无法立即释放。由于端口资源有限,大量处于TIME_WAIT状态的连接可能会导致端口资源枯竭,从而影响新的连接建立。尤其是在高并发、短连接的场景下,这个问题尤为显著。例如,服务器可能会因为大量的TIME_WAIT状态而导致新的客户端无法连接。
2.有很多 TIME-WAIT 状态如何解决
当系统中有大量连接进入 TIME_WAIT 状态时,可以通过多种方法来减轻这种状态带来的负面影响。以下是一些常见的解决方案:
- 优化应用逻辑: 减少短连接:尽可能将短连接转换成长连接。例如,Web 应用可以使用 HTTP/1.1 的 keep-alive 特性,这样客户端和服务器之间可以保持一个长期的连接,多次请求复用同一个连接,减少了连接建立和关闭的次数。批量处理请求:在客户端,可以尝试将多个请求打包成一个较大的请求,从而减少连接建立和关闭的次数。
- 调整内核参数: 增大端口范围:在 Linux 中,可以增加 ephemeral port(临时端口)的范围,这样可以有更多的端口可用于新的连接。通过修改 /proc/sys/net/ipv4/ip_local_port_range 文件来实现这一点。减小 TIME_WAIT 超时时间:可以尝试减小 TIME_WAIT 的超时时间。虽然这可以更快地回收端口,但也增加了旧数据包干扰新连接的风险。可以通过调整 /proc/sys/net/ipv4/tcp_fin_timeout 参数来设置 TIME_WAIT 的超时时间。启用 TIME_WAIT sockets 快速回收:Linux 内核提供了一个选项 net.ipv4.tcp_tw_reuse,当设置为 1 时,可以启用 TIME_WAIT sockets 的快速回收。这可以让服务器更快地复用本地地址,但同样需要注意旧数据包干扰的风险。
- 使用 SO_REUSEADDR 或 SO_REUSEPORT: 服务器可以设置 SO_REUSEADDR 套接字选项来通知内核,如果端口被占用,但 TCP 连接位于 TIME_WAIT 状态时可以重用端口。
10.SIN/FIN不包含数据却要消耗序列号
凡是需要对端确认的,一定消耗TCP报文的序列号。SYN和FIN需要对端的确认,因此需要消耗一个序列号。
SYN作为三次握手的确认。FIN作为四次挥手的确认。如果没有序列号,会导致SYN请求多次重发,服务端多次处理,造成资源浪费
11.TCP报文首部有哪些字段,其作用又分别是什么?
16位端口号:源端口号,主机该报文段是来自哪里;目标端口号,要传给哪个上层协议或应用程序
32位序号:一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。
32位确认号:用作对另一方发送的tcp报文段的响应。其值是收到的TCP报文段的序号值加1。
4位头部长度:表示tcp头部有多少个32bit字(4字节)。因为4位最大能标识15,所以TCP头部最长是60字节。
6位标志位:URG(紧急指针是否有效),ACk(表示确认号是否有效),PSH(缓冲区尚未填满),RST(表示要求对方重新建立连接),SYN(建立连接消息标志接),FIN(表示告知对方本端要关闭连接了)
16位窗口大小:是TCP流量控制的一个手段。这里说的窗口,指的是接收通告窗口。它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
16位校验和:由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意,这个校验不仅包括TCP头部,也包括数据部分。这也是TCP可靠传输的一个重要保障。
16位紧急指针:一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此,确切地说,这个字段是紧急指针相对当前序号的偏移,不妨称之为紧急偏移。TCP的紧急指针是发送端向接收端发送紧急数据的方法
12.TCP的粘包和拆包问题及其解决方案
TCP是面向流,没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。
为什么会产生粘包和拆包呢?
- 要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包;
- 接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包;
- 要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包;
- 待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。即TCP报文长度-TCP头部长度>MSS。
解决方案:
- 发送端将每个数据包封装为固定长度
- 在数据尾部增加特殊字符进行分割
- 将数据分为两部分,一部分是头部,一部分是内容体;其中头部结构大小固定,且有一个字段声明内容体的大小
13.什么是SYN攻击
我们都知道 TCP 连接建立是需要三次握手,假设攻击者短时间伪造不同 IP 地址的 SYN 报文,服务端每接收到 一个 SYN 报文,就进入 SYN_RCVD 状态,但服务端发送出去的 ACK + SYN 报文,无法得到未知 IP 主机的ACK 应答,久而久之就会占满服务端的 SYN 接收队列(未连接队列),使得服务器不能为正常用户服务。
14.如何唯一确定一个TCP连接呢?
TCP 四元组可以唯一的确定一个连接,四元组包括如下: 源地址 源端口 目的地址 目的端口。
源地址和目的地址的字段(32位)是在 IP 头部中,作用是通过 IP 协议发送报文给对方主机。
源端口和目的端口的字段(16位)是在 TCP 头部中,作用是告诉 TCP 协议应该把报文发给哪个进程。
2.IP
0.什么是ip地址?
IP地址为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
IP地址在网络通信中起关键作用,类似于现实生活中的住址。每个设备在加入网络时都会被分配一个唯一的IP地址,以确保数据包能够准确地送达目的地。
1.说一说你对IP分类的了解。
IP(Internet Protocol)地址是用于在网络中唯一标识设备的一串数字,它允许设备在互联网上进行通信。IP地址有两种主要版本:IPv4和IPv6。
IPv4使用32位地址,通常表示为四个十进制数(每个数介于0到255之间),中间用点号隔开(例如192.0.2.1)。IPv4地址可以分为五类(A、B、C、D、E),每类具有不同的特点:
2.IP为什么要分类?
根据IP地址访问终端是通过路由器,路由设备当中有一张路由表,该路由表记录了所有IP地址的位 置,这样就可以进行包的转发了,如果我们不区分网络地址,那么这张路由表当中就要保存有所有IP地 址的方向,这张路由表就会很大,就像下面说的那样:如果不分网络位和主机位,路由器的路由表就是 都是32位的地址,那所有的路由器维护的路由表会很大,转发速度会变慢(因为查询变慢)。而且所有 的路由器都要有全Internet的地址,所有人的路由器都要有足够的性能来存下全网地址。估计建造这样 的Internet成本是现在的几万倍,甚至更高。
有了网络地址,就可以限定拥有相同网络地址的终端都在同一个范围内,那么路由表只需要维护这个 网络地址的方向,就可以找到相应的终端了。
3.为什么有了ipv4后还要ipv6?
IPv4和IPv6是互联网使用的两种重要IP地址协议,它们在地址空间、地址分配以及网络配置等方面有显著差异。下面将深入探讨为什么在已有IPv4的情况下还需要发展IPv6:
- 地址空间问题 有限地址空间:IPv4使用32位地址,仅能提供约43亿个唯一地址,这一数量在互联网设备迅速增加的今天已经显得远远不够。地址耗尽:根据统计,剩余的IPv4地址池正在快速消耗,许多地区已经用尽了IPv4地址。
- 技术局限性 子网划分问题:IPv4的子网划分和地址分配方式有时不够灵活,容易造成资源浪费或不足。NAT技术局限:虽然网络地址转换(NAT)技术在一定程度上缓解了IPv4地址短缺问题,但它依然存在诸多限制,例如无法支持某些特定的网络应用。
4.IPV4和IPV6有什么区别?
IPv4(Internet Protocol version 4)和IPv6(Internet Protocol version 6)是互联网协议的两个版本,它们之间存在几个重要的区别:
地址格式
- IPv4 使用32位地址,表示为四个十进制数(每个数介于0到255之间),中间用点号隔开(如192.0.2.1)。
- IPv6 使用128位地址,表示为八组由冒号隔开的四位十六进制数(如2001:0db8:85a3:0000:0000:8a2e:0370:7334)。IPv6地址通常会省略前导零,并且可以用双冒号
::
来表示一个或多个全零字段。
地址数量
- IPv4 提供大约43亿个地址(2^32 - 1),这个数量已经不足以满足全球不断增长的网络设备需求。
- IPv6 则提供了几乎无限的地址空间(2^128),理论上可以提供比地球上所有原子还多的地址数量。
头部结构
- IPv4 的头部固定为20字节,并且包括一个可选字段区域。
- IPv6 的头部简化并固定为40字节,没有可变长度的选项字段,而是使用扩展头部来携带选项信息。
安全性
- IPv4 在协议层面没有内置安全性功能,安全机制通常依赖于其他协议或设备。
- IPv6 设计时考虑到了安全性,IPv6中包含了对IPsec(Internet Protocol Security)的支持,这使得端到端的安全通信更加容易实现。
自动配置
- IPv4 需要手工配置或使用DHCP(动态主机配置协议)来自动分配IP地址。
- IPv6 支持无状态地址自动配置(SLAAC),设备可以自行生成自己的IP地址,而不需要专门的服务器来分配地址。
组播
- IPv4 支持组播,但并不是所有设备都支持。
- IPv6 将组播作为标准特性之一,更加强调其重要性。
路由效率
- IPv4 路由表随着网络的增长变得越来越大,增加了路由器处理的负担。
- IPv6 通过地址前缀聚合可以减小路由表的大小,提高路由效率。
私有地址
- IPv4 中有特定的私有地址段(如10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16),用于内部网络,不会出现在互联网上。
- IPv6 也有私有地址段,称为唯一本地地址(ULA, Unique Local Address),格式为fc00::/7。
2.HTTP
0.什么是HTTP协议
HTTP(Hypertext Transfer Protocol,超文本传输协议):基于 TCP 协议,是一种用于传输超文本和多媒体内容的协议,主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的。
什么是超文本?
就是超链接
1.2种HTTP报文结构
客户端发送一个请求报文给服务器,服务器根据请求报文中的信息进行处理,并将处理结果放入响应报文中返回给客户端。
HTTP 请求报文由请求行、请求头、空行和请求体(body)组成。
请求报文结构:
- 请求行:由请求方法(GET/POST/PUT)、请求URL(不包括域名 | 、HTTP协议版本组成
- 请求头部 Header:请求头部由关键字/值对组成,每行一对**;主要包含Content-Length标头:实体的长度,Content-Tyep标头:实体的媒体类型
- 空行:一个空行用来分隔首部和内容主体 Body
- 请求体body为空
响应报文结构:
- 状态行:包含http协议版本、状态码和状态描述,最常见的是 200 OK 表示请求成功了
- 响应头部
- 空行:一个空行分隔首部和内容主体
- 响应体body
2.URI 和 URL 的区别是什么?
- URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。
- URL(Uniform Resource Locator) 是统一资源定位符,可以提供该资源的路径。URL是URI的子集,它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 定位这个资源。
3.HTTP状态码
101 切换请求协议,从 HTTP 切换到 WebSocket
200 请求成功,有响应体
什么是重定向?
重定向(Redirect)是指通过各种方式将网络请求重新定义,使其转向其他位置的过程。这种机制在互联网中广泛应用,例如:
- 网页重定向:当用户访问的URL已经不再使用或内容已迁移至新的URL时,服务器会返回一个重定向状态码(如301永久重定向或302临时重定向),并告知浏览器新的URL,浏览器会自动跳转到新地址。
- 域名重定向:当一个域名被设置为另一个域名的别名时,所有对该域名的请求都会被自动转发到主域名。
- 路由重定向:在网络路由中,数据包的路径选择变化也可以视为一种重定向,即数据包被重新导向至新的路径以到达目的地。
302和304有什么区别?
302和304是网页请求的两个不同的响应状态码。302 (临时移动)表示 服务器目前从不同位置的网 页响应请求,但请求者应继续使用原有位置来进行以后的请求。 304 (未修改)表示 自从上次请求 后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
4.HTTP方法
1.有哪些HTTP方法
1 | GET | 请求指定的页面信息,并返回实体主体。 |
---|---|---|
2 | HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
5 | DELETE | 请求服务器删除指定的页面。 |
6 | CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS | 允许客户端查看服务器的性能。 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
9 | PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
2.POST和GET有哪些区别?各自应用场景?
1.使用场景:GET 用于获取资源,而 POST 用于传输实体主体。
2.参数:GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。
3.安全性:安全的 HTTP 方法不会改变服务器状态,也就是说它只是可读的。GET 方法是安全的,而 POST 却不是,因为 POST 的目的是传送实体主体内容,这个内容可能是用户上传的表单数据,上传成功之后,服务器可能把这个数据存储到数据库中,因此状态也就发生了改变。
4.幂等性:幂等的 HTTP 方法,同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说就是,幂等方法不应该具有副作用(统计用途除外)。所有的安全方法也都是幂等的。即GET幂等,POST不幂等。
5.HTTP头部header
有 4 种类型的首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段。
通用首部字段
Cache-Control | 控制缓存的行为 |
---|---|
Connection | 控制不再转发给代理的首部字段、管理持久连接 |
Date | 创建报文的日期时间 |
Pragma | 报文指令 |
Trailer | 报文末端的首部一览 |
Transfer-Encoding | 指定报文主体的传输编码方式 |
Upgrade | 升级为其他协议 |
Via | 代理服务器的相关信息 |
Warning | 错误通知 |
6.HTTP各版本的比较
1.HTTP/1.0 和 HTTP/1.1 有什么区别?
- 连接方式 : HTTP/1.0 为短连接,HTTP/1.1 支持长连接。
- 状态响应码 : HTTP/1.1 中新加入了大量的状态码,光是错误响应状态码就新增了 24 种。比如说,
100 (Continue)
——在请求大资源前的预热请求,206 (Partial Content)
——范围请求的标识码,409 (Conflict)
——请求与当前资源的规定冲突,410 (Gone)
——资源已被永久转移,而且没有任何已知的转发地址。 - 缓存机制 : 在 HTTP/1.0 中主要使用 Header 里的 If-Modified-Since,Expires 来做为缓存判断的标准,HTTP/1.1 则引入了更多的缓存控制策略例如 Entity tag,If-Unmodified-Since, If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略。
- 带宽:HTTP/1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP/1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
- Host 头(Host Header)处理 :HTTP/1.1 引入了 Host 头字段,允许在同一 IP 地址上托管多个域名,从而支持虚拟主机的功能。而 HTTP/1.0 没有 Host 头字段,无法实现虚拟主机。
长连接和短连接的区别
HTTP1.0协议不支持长连接,从HTTP1.1协议以后,连接默认都是长连接。
1.什么是长连接和短连接
长连接:客户端与服务端先建立连接,连接建立后不断开,然后再进行报文交易。适用于操作频繁、点对点通讯,如数据库的连接。
短连接:客户端与服务端每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此方式常用于一点对多点通讯,如web网站的http服务·。
2.操作步骤区别:
短连接的操作步骤是:建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接长连接的操作步骤是:建立连接——数据传输…(保持连接)…数据传输——关闭连接
。
3.使用场景区别:
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个 TCP 连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就 OK 了,不用建立 TCP 连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成 socket 错误,而且频繁的 socket 创建也是对资源的浪费。
而像 WEB 网站的 http 服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像 WEB 网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。
2.HTTP/1.1 和 HTTP/2.0 有什么区别?
HTTP/1.0 和 HTTP/1.1 对比
- 多路复用(Multiplexing):HTTP/2.0 在同一连接上可以同时传输多个请求和响应(可以看作是 HTTP/1.1 中长链接的升级版本),互不干扰。HTTP/1.1 则使用串行方式,每个请求和响应都需要独立的连接,而浏览器为了控制资源会有 6-8 个 TCP 连接都限制。。这使得 HTTP/2.0 在处理多个请求时更加高效,减少了网络延迟和提高了性能。
- 二进制帧(Binary Frames):HTTP/2.0 使用二进制帧进行数据传输,而 HTTP/1.1 则使用文本格式的报文。二进制帧更加紧凑和高效,减少了传输的数据量和带宽消耗。
- 头部压缩(Header Compression):HTTP/1.1 支持
Body
压缩,Header
不支持压缩。HTTP/2.0 支持对Header
压缩,使用了专门为Header
压缩而设计的 HPACK 算法,减少了网络开销。 - 服务器推送(Server Push):HTTP/2.0 支持服务器推送,可以在客户端请求一个资源时,将其他相关资源一并推送给客户端,从而减少了客户端的请求次数和延迟。而 HTTP/1.1 需要客户端自己发送请求来获取相关资源。
3.HTTP/2.0 和 HTTP/3.0 有什么区别?
HTTP/2.0 和 HTTP/3.0 对比
- 传输协议:HTTP/2.0 是基于 TCP 协议实现的,HTTP/3.0 新增了 QUIC(Quick UDP Internet Connections) 协议来实现可靠的传输,提供与 TLS/SSL 相当的安全性,具有较低的连接和传输延迟。你可以将 QUIC 看作是 UDP 的升级版本,在其基础上新增了很多功能比如加密、重传等等。HTTP/3.0 之前名为 HTTP-over-QUIC,从这个名字中我们也可以发现,HTTP/3 最大的改造就是使用了 QUIC。
- 连接建立:HTTP/2.0 需要经过经典的 TCP 三次握手过程(由于安全的 HTTPS 连接建立还需要 TLS 握手,共需要大约 3 个 RTT)。由于 QUIC 协议的特性(TLS 1.3,TLS 1.3 除了支持 1 个 RTT 的握手,还支持 0 个 RTT 的握手)连接建立仅需 0-RTT 或者 1-RTT。这意味着 QUIC 在最佳情况下不需要任何的额外往返时间就可以建立新连接。
- 队头阻塞:HTTP/2.0 多请求复用一个 TCP 连接,一旦发生丢包,就会阻塞住所有的 HTTP 请求。由于 QUIC 协议的特性,HTTP/3.0 在一定程度上解决了队头阻塞(Head-of-Line blocking, 简写:HOL blocking)问题,一个连接建立多个不同的数据流,这些数据流之间独立互不影响,某个数据流发生丢包了,其数据流不受影响(本质上是多路复用+轮询)。错误恢复:HTTP/3.0 具有更好的错误恢复机制,当出现丢包、延迟等网络问题时,可以更快地进行恢复和重传。而 HTTP/2.0 则需要依赖于 TCP 的错误恢复机制。安全性:HTTP/2.0 和 HTTP/3.0 在安全性上都有较高的要求,支持加密通信,但在实现上有所不同。HTTP/2.0 使用 TLS 协议进行加密,而 HTTP/3.0 基于 QUIC 协议,包含了内置的加密和身份验证机制,可以提供更强的安全性。
7.在浏览器中输入 URL 地址到显示主页的过程?
- DNS 解析:浏览器查询DNS把域名解析成 IP 地址
- TCP 连接:浏览器获得域名对应的 IP 地址以后,浏览器向服务器请求建立链接,发起三次握手
- 发送 HTTP 请求:TCP 连接建立起来后,浏览器向服务器发送 HTTP 请求
- 服务器处理请求并返回 HTTP 报文:服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
- 浏览器解析渲染页面
- 断开连接:TCP 四次挥手断开连接
在浏览器中输入 https的URL 地址到显示主页的过程?
当在浏览器中输入一个以https开头的URL地址后,会经过以下一系列过程才会显示主页:
- DNS解析:浏览器首先会对输入的URL进行解析,然后通过DNS(域名系统)将域名解析成对应的IP地址。这一过程确定了将要访问的服务器的具体位置。
- 建立TCP连接:浏览器与服务器之间建立一个TCP连接,这个过程通常被称为TCP三次握手。这个连接确保了数据能够安全地在用户和服务器之间传输。
- SSL/TLS协议:由于是https连接,所以在数据传输前会进行SSL/TLS握手,以确保通信加密和服务器身份验证。这是为了保障用户信息的安全,防止数据在传输过程中被窃取或篡改。
- 发送HTTP请求:一旦安全连接建立,浏览器会向服务器发送一个HTTP请求,请求中包含了想要获取的资源(如HTML页面、图片、脚本文件等)。
- 服务器处理请求:服务器接收到请求后,根据请求的内容进行处理,并返回相应的HTTP响应,这通常包括了请求的网页内容以及可能关联的资源文件。
- 浏览器解析渲染:浏览器接收到从服务器返回的数据后,开始解析这些数据,并将其渲染成用户可见的页面。这包括了解析HTML、CSS以及执行JavaScript代码等。
- 断开连接:页面渲染完成后,浏览器和服务器之间的TCP连接不会立即关闭,而是会在一段时间无活动后通过TCP四次挥手来断开连接。
8.HTTPS
0.简单说下 HTTPS 和 HTTP 的区别
Http协议运行在TCP之上,明文传输(不安全),客户端与服务器端都无法验证对方的身份;Https是身披SSL(Secure Socket Layer)外壳的Http,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP。二者之间存在如下不同:
1、端口不同:Http与Https使用不同的连接方式,用的端口也不一样,前者是80,后者是443;
2、资源消耗:和HTTP通信相比,Https通信会由于加减密处理消耗更多的CPU和内存资源;
3、开销:Https通信需要SSL证书,而证书一般需要向认证机构购买; 4、安全性:HTTP 的连接很简单,是无状态的;HTTPS 协议是由 TLS+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全
1.什么是HTTPS?
HTTPS 并不是新协议,而是让 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信,也就是说 HTTPS 使用了隧道进行通信。
通过使用 SSL,HTTPS 具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)。
1.加密(对称加密和非对称加密)
加密分为对称密匙加密和非对称密匙加密2种。
对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方。
优点: 对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。
缺点: 没有非对称加密安全.
用途: 一般用于保存用户手机号、身份证等敏感但能解密的信息。
常见的对称加密算法有: AES、HS256
非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。
**优点: ** 非对称加密与对称加密相比,其安全性更好;
缺点: 非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。用途: 一般用于签名和认证。私钥服务器保存, 用来加密, 公钥客户拿着用于对于令牌或者签名的解密或者校验使用.
常见的非对称加密算法有: RSA、DSA(数字签名用)、ECC(移动设备用)、RS256 (采用SHA-256 的 RSA 签名)
HTTPS 采用混合的加密机制:
- 使用非对称密钥加密方式,传输对称密钥加密方式所需要的 Secret Key,从而保证安全性;
- 获取到 Secret Key 后,再使用对称密钥加密方式进行通信,从而保证效率。
以下就是加密过程:
(1)某网站拥有用于非对称加密的公钥A、私钥A’。
(2)浏览器像网站服务器请求,服务器把公钥A明文给传输浏览器。
(3)浏览器随机生成一个用于对称加密的密钥X,用公钥A加密后传给服务器。
(4)服务器拿到后用私钥A’解密得到密钥X。
(5)这样双方就都拥有密钥X了,且别人无法知道它。之后双方所有数据都用密钥X加密解密
2.证书认证
通过使用 证书 来对通信方进行认证。
数字证书认证机构(CA,Certificate Authority)是客户端与服务器双方都可信赖的第三方机构。
服务器的运营人员向 CA 提出公开密钥的申请,CA 在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公开密钥证书后绑定在一起。
进行 HTTPS 通信时,服务器会把证书发送给客户端。客户端取得其中的公开密钥之后,先使用数字签名进行验证,如果验证通过,就可以开始通信了。
3.完整性保护SSL
SSL 提供报文摘要功能来进行完整性保护。
HTTP 也提供了 MD5 报文摘要功能,但不是安全的。例如报文内容被篡改之后,同时重新计算 MD5 的值,通信接收方是无法意识到发生了篡改。
HTTPS 的报文摘要功能之所以安全,是因为它结合了加密和认证这两个操作。试想一下,加密之后的报文,遭到篡改之后,也很难重新计算报文摘要,因为无法轻易获取明文。
2.HTTPS是如何保证数据安全的呢?
HTTPS是基于HTTP的上层添加了一个叫做TLS的安全层,对数据的加密等操作都是在这个安全层中进行处理的,其底层还是应用的HTTP。用对称加密来传送消息,但对称加密所使用的密钥是通过非对称加密的方式发送出去。
3.HTTPS 一定安全吗?什么时候不安全?怎么解决?
HTTPS被设计为安全的,但并非绝对安全。
HTTPS协议通过在HTTP的基础上加入SSL/TLS加密层来提供数据传输的安全,包括加密和身份验证功能。它广泛用于网络上对安全性要求高的场合,例如在线支付等交易服务。然而,尽管HTTPS大幅提高了传输过程的安全性,但它并不能保证所有场景下都是绝对安全的。
HTTPS不安全的情况通常包括以下几点:
- 中间人攻击:攻击者可能截取和篡改数据,造成信息泄露或不当修改。
- SSL/TLS协议漏洞:使用的加密协议若存在漏洞,则可能被利用进行攻击。
- 错误的SSL证书:如果网站的SSL证书有问题,比如过期、错误或未由可信机构签发,浏览器会提示不安全。
- 不安全的网络环境:即便使用了HTTPS,在一个本身不安全的网络环境中(如公共WiFi),仍然可能受到攻击。
为了解决这些导致HTTPS不安全的问题,可以采取以下措施:
- 对于中间人攻击,确保通信双方的证书是由受信任的证书颁发机构(CA)颁发的,并通过链式信任验证其合法性。同时,保持警惕,避免在不安全的网络环境下进行敏感操作。
- 针对SSL/TLS协议漏洞,网站管理员应时刻关注并应用最新的安全更新和补丁,使用较新且被广泛认可的加密协议。
- 确保使用的是正确的SSL证书并且是有效的,没有过期,与网站名匹配,并且由知名机构签发。
- 清除网页中的非HTTPS内容,确保所有内容都通过HTTPS加载,防止“混合内容”的风险。
综上所述,HTTPS确实提供了强有力的安全保障,但在实际使用中,用户和网站管理员都需要采取额外的措施来确保其安全性。
9.HTTP协议属于TCP/IP 模型哪一层?
属于应用层。
10.HTTP的无状态
无状态,就是http协议本身是无法在浏览器与服务器上留下数据,没有数据就无法区分一系列请求是有联系的。最简单的案例就是,用户访问某网站,服务器不知道这个访问者是谁? 服务器与浏览器为了进行会话跟踪(知道是谁访问我),就必须主动的去维护一个状态,这个状态就要通过cookie和session机制去实现。也就是cookie和session是不属于http协议的东西,在协议之上。
1.HTTP 是不保存状态的协议, 如何保存用户状态?
HTTP 是一种不保存状态,即无状态(stateless)协议。也就是说 HTTP 协议自身不对请求和响应之间的通信状态进行保存。那么我们如何保存用户状态呢?Session 机制的存在就是为了解决这个问题,Session 的主要作用就是通过服务端记录用户的状态。典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了(一般情况下,服务器会在一定时间内保存这个 Session,过了时间限制,就会销毁这个 Session)。
在服务端保存 Session 的方法很多,最常用的就是内存和数据库(比如是使用内存数据库 redis 保存)。既然 Session 存放在服务器端,大部分情况下,我们都是通过在 Cookie 中附加一个 Session ID 的方式来进行session跟踪。
2.Cookie 和 Session 有什么区别?
Session
的主要作用就是通过服务端记录用户的状态。 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session
之后就可以标识这个用户并且跟踪这个用户了。
Cookie
数据保存在客户端(浏览器端),Session
数据保存在服务器端。相对来说 Session
安全性更高。如果使用 Cookie
的一些敏感信息不要写入 Cookie
中,最好能将 Cookie
信息加密然后使用到的时候再去服务器端解密。
具体区别:
①Cookie可以存储在浏览器或者本地,Session只能存在服务器②session 能够存储任意的 java 对象,cookie 只能存储 String 类型的对象③Session比Cookie更具有安全性(Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击)④Session占用服务器性能,Session过多,增加服务器压力⑤单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie,Session是没有大小限制和服务器的内存大小有关。
3.websocket
1.什么是websocket?
WebSocket 是一种基于 TCP 连接的全双工通信协议,即客户端和服务器可以同时发送和接收数据。
WebSocket 协议在 2008 年诞生,2011 年成为国际标准,几乎所有主流较新版本的浏览器都支持该协议。不过,WebSocket 不只能在基于浏览器的应用程序中使用,很多编程语言、框架和服务器都提供了 WebSocket 支持。
WebSocket 协议本质上是应用层的协议,用于弥补 HTTP 协议在持久通信能力上的不足。客户端和服务器仅需一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
2.WebSocket 和 HTTP 有什么区别?
WebSocket 和 HTTP 两者都是基于 TCP 的应用层协议,都可以在网络中传输数据。
下面是二者的主要区别:
- WebSocket 是一种双向实时通信协议,而 HTTP 是一种单向通信协议。并且,HTTP 协议下的通信只能由客户端发起,服务器无法主动通知客户端。
- WebSocket 使用 ws:// 或 wss://(使用 SSL/TLS 加密后的协议,类似于 HTTP 和 HTTPS 的关系) 作为协议前缀,HTTP 使用 http:// 或 https:// 作为协议前缀。
- WebSocket 可以支持扩展,用户可以扩展协议,实现部分自定义的子协议,如支持压缩、加密等。
- WebSocket 通信数据格式比较轻量,用于协议控制的数据包头部相对较小,网络开销小,而 HTTP 通信每次都要携带完整的头部,网络开销较大(HTTP/2.0 使用二进制帧进行数据传输,还支持头部压缩,减少了网络开销)。
3.WebSocket 的工作过程是什么样的?
WebSocket 的工作过程可以分为以下几个步骤:
- 客户端向服务器发送一个 HTTP 请求,请求头中包含
Upgrade: websocket
和Sec-WebSocket-Key
等字段,表示要求升级协议为 WebSocket; - 服务器收到这个请求后,会进行升级协议的操作,如果支持 WebSocket,它将回复一个 HTTP 101 状态码,响应头中包含 ,
Connection: Upgrade
和Sec-WebSocket-Accept: xxx
等字段、表示成功升级到 WebSocket 协议。 - 客户端和服务器之间建立了一个 WebSocket 连接,可以进行双向的数据传输。数据以帧(frames)的形式进行传送,WebSocket 的每条消息可能会被切分成多个数据帧(最小单位)。发送端会将消息切割成多个帧发送给接收端,接收端接收消息帧,并将关联的帧重新组装成完整的消息。
- 客户端或服务器可以主动发送一个关闭帧,表示要断开连接。另一方收到后,也会回复一个关闭帧,然后双方关闭 TCP 连接。
4.ping命令和telnet工具
1.PING 命令的作用是什么?
PING 命令是一种常用的网络诊断工具,经常用来测试网络中主机之间的连通性和网络延迟。
PING 命令的输出结果通常包括以下几部分信息:
- ICMP Echo Request(请求报文)信息:序列号、TTL(Time to Live)值。
- 目标主机的域名或 IP 地址:输出结果的第一行。
- 往返时间(RTT,Round-Trip Time):从发送 ICMP Echo Request(请求报文)到接收到 ICMP Echo Reply(响应报文)的总时间,用来衡量网络连接的延迟。
- 统计结果(Statistics):包括发送的 ICMP 请求数据包数量、接收到的 ICMP 响应数据包数量、丢包率、往返时间(RTT)的最小、平均、最大和标准偏差值。
如果 PING 对应的目标主机无法得到正确的响应,则表明这两个主机之间的连通性存在问题(有些主机或网络管理员可能禁用了对 ICMP 请求的回复,这样也会导致无法得到正确的响应)。如果往返时间(RTT)过高,则表明网络延迟过高。
2.PING 命令的工作原理是什么?
PING 基于网络层的 ICMP(Internet Control Message Protocol,互联网控制报文协议),其主要原理就是通过在网络上发送和接收 ICMP 报文实现的。
ICMP 报文中包含了类型字段,用于标识 ICMP 报文类型。ICMP 报文的类型有很多种,但大致可以分为两类:
- 查询报文类型:向目标主机发送请求并期望得到响应。
- 差错报文类型:向源主机发送错误信息,用于报告网络中的错误情况。
PING 用到的 ICMP Echo Request(类型为 8 ) 和 ICMP Echo Reply(类型为 0) 属于查询报文类型 。
- PING 命令会向目标主机发送 ICMP Echo Request。
- 如果两个主机的连通性正常,目标主机会返回一个对应的 ICMP Echo Reply。
3.假设有两台服务器,怎么确定这两台服务器是否网络可通(不能用ping)
可用telnet命令
3.telnet命令有什么用?
telnet用于尝试连接到远程主机的特定端口。如果telnet连接成功,说明不仅可以通过网络到达对方,而且对方服务器上的指定端口也是开放的并且正在监听连接。这对于检查特定服务(如SMTP、HTTP等)是否可用非常有用。
4.假设A服务器开了8080端口,B服务器用什么命令去访问?
k可用telnet命令
5.DNS域名解析协议
1.DNS 的作用是什么?
DNS(Domain Name System)域名管理系统,是当用户使用浏览器访问网址之后,使用的第一个重要协议。DNS 要解决的是域名和 IP 地址的映射问题。
2.DNS 解析的过程
域名解析成IP的全过程涉及到多个步骤和组件,包括本地缓存检查、系统缓存检查、本地域名服务器查询等。具体分析如下:
- 本地缓存检查浏览器缓存:当人们访问一个网站时,浏览器首先会检查自身的缓存记录中是否存在该网站的域名对应的IP地址。如果存在,则直接使用该IP地址访问网站,解析过程到此结束。
- 本地域名服务器查询向本地DNS服务器发起请求:如果以上两步都未能解析出IP地址,人们的系统会向配置的本地DNS服务器发起请求。本地DNS服务器通常由人们的网络接入服务商提供,比如学校或电信运营商等。本地DNS服务器缓存:本地DNS服务器在接收到请求后,同样会先检查自己的缓存中是否有对应的解析记录。如果有,直接返回给客户端,并且解析过程到此结束。
- 远程DNS服务器查询向根域名服务器查询:如果本地DNS服务器的缓存中也没有相应记录,它会向根域名服务器发起请求。全球有大约13个逻辑根域名服务器,它们不存储具体的域名与IP的对应信息,但能提供顶级域名服务器的指引。向顶级域名服务器查询:根据根域名服务器的指引,本地DNS服务器接着向指定的顶级域名服务器(如.com、.org等)发起请求,以获取权限域名服务器的地址。权限域名服务器返回结果:顶级域名服务器会返回具体负责所查询域名的权限域名服务器的地址。之后本地DNS服务器向权限域名服务器发起请求并得到最终的IP地址结果。
- 结果返回与缓存本地DNS服务器缓存结果:得到解析结果后,本地DNS服务器不仅将IP地址返回给请求者,还会在本地缓存该解析结果。缓存的时间长短由DNS记录的TTL(Time To Live)参数决定。
综上所述,整个域名解析的过程可能会因缓存的存在而大大缩短,因为大部分的解析请求会在本地DNS服务器或客户端缓存中找到对应的IP地址,从而避免了冗长的远程查询过程。而TTL值的合理设定能有效平衡DNS解析的及时更新与查询效率。
3、DNS 劫持/DNS重定向了解吗?如何应对?
DNS 劫持是一种网络攻击,它通过修改 DNS 服务器的解析结果,使用户访问的域名指向错误的 IP 地址,从而导致用户无法访问正常的网站,或者被引导到恶意的网站。DNS 劫持有时也被称为 DNS 重定向、DNS 欺骗或 DNS 污染。
6.IP协议和MAC
-2.MAC 和 IP 区别
MAC地址和IP地址是网络通信中的两个重要概念,它们在功能、特性和应用层次上有所区别。具体分析如下:
- 功能:MAC地址用于在局域网中唯一标识一个网络设备,而IP地址用于在整个互联网中标识主机。
- 特性:MAC地址是物理地址,它是每个网络设备硬件(如网卡)出厂时分配的唯一标识,通常不可更改。IP地址是逻辑地址,它可以根据网络配置需要被修改,以适应不同的网络环境。
- 应用层次:MAC地址应用于OSI模型的数据链路层,主要在局域网内部使用,而IP地址应用于网络层,用于在全球范围内进行路由选择和寻址。
总的来说,MAC地址作为设备的物理标识,保证了局域网内设备的唯一性;而IP地址作为设备的逻辑地址,使得设备能够在更广阔的互联网中被正确识别和访问。
-1.MAC 作用在什么场景
MAC地址在确保网络安全、网络配置以及网络服务提供商限制服务等方面发挥作用。
首先,MAC地址在网络安全方面扮演着重要角色。网络管理员可以通过设置MAC地址过滤来增强网络的安全保护措施。这种设置只允许特定的设备,即那些列入许可名单的MAC地址的设备,连接到网络。这有助于防止未授权的设备获取对网络的访问权。
其次,在网络配置方面,MAC地址同样重要。在某些网络环境中,为了确保设备每次连接都能获得相同的IP地址,网络管理员可能会根据设备的MAC地址来分配静态IP。这样做可以方便管理并减少配置错误的可能性。
除此之外,当面临网络服务提供商基于MAC地址限制服务的情况时,用户有时也会通过修改自己设备的MAC地址来绕过此类限制,这种做法通常称为MAC地址克隆。
总的来说,MAC地址虽然不像IP地址那样在整个互联网中唯一标识设备,但它在确保网络安全和进行特定网络配置方面仍然不可或缺。
-1.IP地址编码方式
IP 地址的编址方式经历了三个历史阶段:
- 分类
- 子网划分
- 无分类
分类
IP地址由两部分组成,网络号和主机号。
子网划分通过在主机号字段中拿一部分作为子网号,把两级 IP 地址划分为三级 IP 地址。
IP 地址 ::= {< 网络号 >, < 子网号 >, < 主机号 >}
要使用子网,必须配置子网掩码。一个 B 类地址的默认子网掩码为 255.255.0.0,如果 B 类地址的子网占两个比特,那么子网掩码为 11111111 11111111 11000000 00000000,也就是 255.255.192.0。
注意,外部网络看不到子网的存在。
无分类
无分类编址 CIDR 消除了传统 A 类、B 类和 C 类地址以及划分子网的概念,使用网络前缀和主机号来对 IP 地址进行编码,网络前缀的长度可以根据需要变化。
IP 地址 ::= {< 网络前缀号 >, < 主机号 >}
CIDR 的记法上采用在 IP 地址后面加上网络前缀长度的方法,例如 128.14.35.7/20 表示前 20 位为网络前缀。
CIDR 的地址掩码可以继续称为子网掩码,子网掩码首 1 长度为网络前缀的长度。
一个 CIDR 地址块中有很多地址,一个 CIDR 表示的网络就可以表示原来的很多个网络,并且在路由表中只需要一个路由就可以代替原来的多个路由,减少了路由表项的数量。把这种通过使用网络前缀来减少路由表项的方式称为路由聚合,也称为 构成超网 。
在路由表中的项目由“网络前缀”和“下一跳地址”组成,在查找时可能会得到不止一个匹配结果,应当采用最长前缀匹配来确定应该匹配哪一个。
0.IP数据报格式
- 版本 : 有 4(IPv4)和 6(IPv6)两个值;
- 首部长度 : 占 4 位,因此最大值为 15。值为 1 表示的是 1 个 32 位字的长度,也就是 4 字节。因为固定部分长度为 20 字节,因此该值最小为 5。如果可选字段的长度不是 4 字节的整数倍,就用尾部的填充部分来填充。
- 区分服务 : 用来获得更好的服务,一般情况下不使用。
- 总长度 : 包括首部长度和数据部分长度。
- 生存时间 :TTL,它的存在是为了防止无法交付的数据报在互联网中不断兜圈子。以路由器跳数为单位,当 TTL 为 0 时就丢弃数据报。
- 协议 :指出携带的数据应该上交给哪个协议进行处理,例如 ICMP、TCP、UDP 等。
- 首部检验和 :因为数据报每经过一个路由器,都要重新计算检验和,因此检验和不包含数据部分可以减少计算的工作量。
- 标识 : 在数据报长度过长从而发生分片的情况下,相同数据报的不同分片具有相同的标识符。
- 片偏移 : 和标识符一起,用于发生分片的情况。片偏移的单位为 8 字节。
1.IP 协议的作用是什么?
IP(Internet Protocol,网际协议) 是 TCP/IP 协议中最重要的协议之一,属于网络层的协议,主要作用是定义数据包的格式、对数据包进行路由和寻址,以便它们可以跨网络传播并到达正确的目的地。
2.什么是 IP 地址?IP 寻址如何工作?
每个连入互联网的设备或域(如计算机、服务器、路由器等)都被分配一个 IP 地址(Internet Protocol address),作为唯一标识符。每个 IP 地址都是一个字符序列,如 192.168.1.1(IPv4)、2001:0db8:85a3:0000:0000:8a2e:0370:7334(IPv6) 。
当网络设备发送 IP 数据包时,数据包中包含了 源 IP 地址 和 目的 IP 地址 。源 IP 地址用于标识数据包的发送方设备或域,而目的 IP 地址则用于标识数据包的接收方设备或域。这类似于一封邮件中同时包含了目的地地址和回邮地址。
网络设备根据目的 IP 地址来判断数据包的目的地,并将数据包转发到正确的目的地网络或子网络,从而实现了设备间的通信。
这种基于 IP 地址的寻址方式是互联网通信的基础,它允许数据包在不同的网络之间传递,从而实现了全球范围内的网络互联互通。IP 地址的唯一性和全局性保证了网络中的每个设备都可以通过其独特的 IP 地址进行标识和寻址。
3.NAT 网络地址转换的作用是什么?
NAT(Network Address Translation,网络地址转换) 主要用于在不同网络之间转换 IP 地址。它允许将私有 IP 地址(如在局域网中使用的 IP 地址)映射为公有 IP 地址(在互联网中使用的 IP 地址)或者反向映射,从而实现局域网内的多个设备通过单一公有 IP 地址访问互联网。
NAT 不光可以缓解 IPv4 地址资源短缺的问题,还可以隐藏内部网络的实际拓扑结构,使得外部网络无法直接访问内部网络中的设备,从而提高了内部网络的安全性。
4.VPN虚拟专用网
由于 IP 地址的紧缺,一个机构能申请到的 IP 地址数往往远小于本机构所拥有的主机数。并且一个机构并不需要把所有的主机接入到外部的互联网中,机构内的计算机可以使用仅在本机构有效的 IP 地址(专用地址)。
VPN 使用公用的互联网作为本机构各专用网之间的通信载体。专用指机构内的主机只与本机构内的其它主机通信;虚拟指好像是,而实际上并不是,它有经过公用的互联网。
7.ARP地址解析协议
1.什么是 Mac 地址?
MAC 地址的全称是 媒体访问控制地址(Media Access Control Address)。如果说,互联网中每一个资源都由 IP 地址唯一标识(IP 协议内容),那么一切网络设备都由 MAC 地址唯一标识。
2.ARP 协议有什么用?
ARP 协议,全称 地址解析协议(Address Resolution Protocol),它解决的是网络层地址和链路层地址之间的转换问题。因为一个 IP 数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但 IP 地址属于逻辑地址,而 MAC 地址才是物理地址,ARP 协议解决了 IP 地址转 MAC 地址的一些问题。
3.ARP协议工作原理
(1)每台主机都会在自己的ARP缓冲区建立一个ARP列表,以表示IP地址和MAC地址的对应关系。当源主机需要将一个数据包发送到目的主机时,会先检查自己的ARP列表中是否存在该IP地址对应的MAC地址,如果有,就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址,硬件地址,以及目的主机的IP地址。(2)网络中所有主机收到这个ARP请求之后,会检查数据包中的目的IP是否和自己的IP地址一致,如果不一致就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP列表中已经存在该IP的信息,则将其覆盖,,然后将自己的 MAC 地址写入 ARP 响应数据包中发送给源主机,告诉源主机自己是它想要找的 MAC 地址。给源主机发送一个ARP响应数据包(3)源主机收到这个ARP响应数据包之后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。
8.路由
路由器从功能上可以划分为:路由选择和分组转发。
0.路由器分组转发流程
- 从数据报的首部提取目的主机的 IP 地址 D,得到目的网络地址 N。
- 若 N 就是与此路由器直接相连的某个网络地址,则进行直接交付;
- 若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给表中所指明的下一跳路由器;
- 若路由表中有到达网络 N 的路由,则把数据报传送给路由表中所指明的下一跳路由器;
- 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;
- 报告转发分组出错。
1.路由选择协议
路由选择协议都是自适应的,能随着网络通信量和拓扑结构的变化而自适应地进行调整。
互联网可以划分为许多较小的自治系统 AS,一个 AS 可以使用一种和别的 AS 不同的路由选择协议。
可以把路由选择协议划分为两大类:
- 自治系统内部的路由选择:RIP 和 OSPF
- 自治系统间的路由选择:BGP
1. 内部网关协议 RIP
RIP 是一种基于距离向量的路由选择协议。距离是指跳数,直接相连的路由器跳数为 1。跳数最多为 15,超过 15 表示不可达。
RIP 按固定的时间间隔仅和相邻路由器交换自己的路由表,经过若干次交换之后,所有路由器最终会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器地址。
距离向量算法:
- 对地址为 X 的相邻路由器发来的 RIP 报文,先修改报文中的所有项目,把下一跳字段中的地址改为 X,并把所有的距离字段加 1;
- 对修改后的 RIP 报文中的每一个项目,进行以下步骤:
- 若原来的路由表中没有目的网络 N,则把该项目添加到路由表中;
- 否则:若下一跳路由器地址是 X,则把收到的项目替换原来路由表中的项目;否则:若收到的项目中的距离 d 小于路由表中的距离,则进行更新(例如原始路由表项为 Net2, 5, P,新表项为 Net2, 4, X,则更新);否则什么也不做。
- 若 3 分钟还没有收到相邻路由器的更新路由表,则把该相邻路由器标为不可达,即把距离置为 16。
RIP 协议实现简单,开销小。但是 RIP 能使用的最大距离为 15,限制了网络的规模。并且当网络出现故障时,要经过比较长的时间才能将此消息传送到所有路由器。
2.内部网关协议 OSPF
开放最短路径优先 OSPF,是为了克服 RIP 的缺点而开发出来的。
开放表示 OSPF 不受某一家厂商控制,而是公开发表的;最短路径优先表示使用了 Dijkstra 提出的最短路径算法 SPF。
OSPF 具有以下特点:
- 向本自治系统中的所有路由器发送信息,这种方法是洪泛法。
- 发送的信息就是与相邻路由器的链路状态,链路状态包括与哪些路由器相连以及链路的度量,度量用费用、距离、时延、带宽等来表示。
- 只有当链路状态发生变化时,路由器才会发送信息。
所有路由器都具有全网的拓扑结构图,并且是一致的。相比于 RIP,OSPF 的更新过程收敛的很快。
3.外部网关协议 BGP
BGP(Border Gateway Protocol,边界网关协议)
AS 之间的路由选择很困难,主要是由于:
- 互联网规模很大;
- 各个 AS 内部使用不同的路由选择协议,无法准确定义路径的度量;
- AS 之间的路由选择必须考虑有关的策略,比如有些 AS 不愿意让其它 AS 经过。
BGP 只能寻找一条比较好的路由,而不是最佳路由。
每个 AS 都必须配置 BGP 发言人,通过在两个相邻 BGP 发言人之间建立 TCP 连接来交换路由信息。
9.ICMP网际控制报文协议
ICMP 是为了更有效地转发 IP 数据报和提高交付成功的机会。它封装在 IP 数据报中,但是不属于高层协议。
ICMP 报文分为差错报告报文和询问报文。
10.socket
1.I/O模型
0.5种I/O模型
一个输入操作通常包括两个阶段:
- 等待数据准备好
- 从内核向进程复制数据
对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待数据到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用进程缓冲区。
Unix 有五种 I/O 模型:
- BIO(同步阻塞I/O blocking I/O)
- NIO(同步非阻塞I/O noblocking I/O)
- 多路复用I/O(也是同步的,select 和 poll)
- 信号驱动 I/O(SIGIO)
- AIO(异步非阻塞I/O)
1.阻塞/非阻塞和同步/异步
阻塞就是线程发起一个IO操作请求,比如读取数据,当内核数据还没准备就绪的时候,这时请求是即刻返回,还是在这里等待数据的就绪,如果需要等待的话就是阻塞,反之如果即刻返回就是非阻塞。
在IO模型里面如果请求方从发起IO请求到操作完成的这一段过程中都需要自己参与,那么这种我们就称为同步请求;反之,如果应用发送完IO请求后就不再参与过程了,只需要等待最终操作是否成功结果的通知,那么这就属于异步。
2.BIO、NIO 和 AIO 的区别?
BIO、NIO和AIO是Java编程语言中用于处理输入输出(IO)操作的三种不同的机制,它们分别代表同步阻塞I/O,同步非阻塞I/O和异步非阻塞I/O。
BIO(同步阻塞I/O blocking I/O):线程发起IO请求,不管内核是否准备好IO操作,从发起请求起,线程一直阻塞,直到操作完成。NIO(同步非阻塞I/O noblocking I/O):线程发起IO请求,立即返回;内核在做好IO操作的准备之后,通过调用注册的回调函数通知线程做IO操作,线程开始阻塞,直到操作完成。AIO(异步非阻塞I/O):线程发起IO请求,立即返回;内存做好IO操作的准备之后,做IO操作,直到操作完成或者失败,通过调用注册的回调函数通知线程做IO操作完成或者失败。
- BIO是一个连接一个线程。
- NIO是一个请求一个线程。
- AIO是一个有效请求一个线程
3.多路复用I/O(也是同步的)
IO多路复用是一种同步IO模型,实现一个线程可以监视多个文件句柄;一旦某个文件句柄就绪, 就能够通知应用程序进行相应的读写操作;没有文件句柄就绪时会阻塞应用程序,交出cpu。多路 是指网络连接,复用指的是同一个线程。
4.信号驱动I/O
应用进程告诉内核:当数据报准备好的时候,给我发送一个信号,对SIGIO信号进行捕捉,并且调用我的信号处理函数来获取数据报。
异步 I/O 与信号驱动 I/O 的区别在于,异步 I/O 的信号是通知应用进程 I/O 完成,而信号驱动 I/O 的信号是通知应用进程可以开始 I/O。
2.IO多路复用
IO多路复用是一种同步IO模型,实现一个线程可以监视多个文件句柄;一旦某个文件句柄就绪, 就能够通知应用程序进行相应的读写操作;没有文件句柄就绪时会阻塞应用程序,交出cpu。多路 是指网络连接,复用指的是同一个线程。
O多路复用模型的思路就是:系统提供了select、poll、epoll函数可以同时监控多个fd(文件描述符)的操作,有了这个函数后,应用线程通过调用select函数就可以同时监控多个fd,一旦某个描述符就绪(一般是读就绪或者写就绪),select函数就会返回可读/可写状态,这时询问线程再去通知想请求IO操作的线程,对应线程此时再发起IO请求去读/写数据。
文件描述符是一个非负整数,用于标识被进程打开的文件,是操作系统为了高效管理这些文件所创建的索引。
1.select和poll、epoll以及3者的区别
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。
- select的时间复杂度O(n)。select() 函数通过轮询方式来监视文件描述符的变化,它仅仅知道有I/O事件发生了,却并不知道是哪那几个流,只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的时间复杂度,同时处理的流越多,轮询时间就越长。缺点:文件描述符数量受限(通常最大为1024),每次调用需重新设置文件描述符集,在文件描述符较多的情况下效率较低,需要遍历整个描述符集合
- poll的时间复杂度O(n)。poll() 函数使用链表来管理文件描述符,解决了select中文件描述符数量限制的问题.
优点:没有文件描述符数量的限制,相比select
更灵活,无需每次重新设置文件描述符集。
缺点:虽然改进了select
的一些不足,但当文件描述符数量非常多时,性能仍然会受影响,因为仍需遍历文 件描述符数组来查找就绪的描述符。
- epoll的时间复杂度O(1)。epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动的。
2.epoll
epoll允许单个进程监控多个文件描述符(通常是网络套接字),以便在它们准备好进行读取或写入时得到通知。
- 核心组件:epoll使用三个主要系统调用:
epoll_create
、epoll_ctl
和epoll_wait
。epoll_create
用于创建epoll实例,epoll_ctl
用于注册要监视的文件描述符及其相关事件,而epoll_wait
则用于等待并收集发生的事件。
1.epoll执行流程
epoll的执行流程主要包括以下几个步骤:
- 创建epoll实例:通过调用
epoll_create
函数,在内核中创建一个epoll实例,并且建立一个内核高速缓存区,用于存储事件信息。这个过程中会建立一个红黑树和一个双向链表,双向链表用于存储准备就绪的事件。 - 注册事件:使用
epoll_ctl
函数向epoll实例中添加、修改或删除感兴趣的事件,这些事件通常是与文件描述符相关的,如读、写等。 - 事件就绪:当被监控的文件描述符上的事件发生时(如数据到达、连接建立等),内核会将这些事件加入到epoll的就绪队列中。这个过程是通过中断通知内核完成的。
- 等待事件:通过
epoll_wait
函数等待感兴趣的事件发生。这个函数会阻塞直到有事件发生或者达到预设的超时时间。在此期间,如果有多个文件描述符上的事件发生,它们都会被收集起来一并返回给用户空间处理。 - 处理事件:用户空间的程序收到
epoll_wait
返回的事件列表后,会遍历列表并针对每个就绪的事件进行处理。 - 释放资源:当不再需要epoll实例时,可以通过
close
系统调用来释放相关资源。
总的来说,epoll相比于传统的select和poll机制,能够更高效地处理大量并发连接,因为它只关注那些真正发生了事件的文件描述符,而不是轮询所有的文件描述符。此外,epoll使用内核事件表来管理事件,避免了频繁的用户空间和内核空间之间的数据拷贝,从而提高了I/O效率。
2.epoll的2种触发模式
epoll有两种触发模式——水平触发(LT)和边缘触发(ET)
- 触发条件 LT水平触发:当被监控的文件描述符状态满足某种条件(如可读、可写)时,它将不断给线程发送就绪通知。即使应用程序没有完全处理完这些操作,内核会继续通知这一状态。ET边沿触发:仅在状态发生改变时发送一次就绪通知。例如,当描述符从未就绪变为就绪状态时,epoll会通知一次,之后如果未发生状态改变,不会再发送通知。
- 数据处理 LT水平触发:不要求一次性处理完所有数据,内核将继续通知同一事件直到应用显式地处理完毕。ET边沿触发:需要及时且完整地处理数据,否则可能会错过某些事件的通知。
3.怎么用epoll实现多路复用?
以下是使用epoll
实现多路复用的基本步骤:
- 创建
epoll
实例:使用epoll_create
函数创建一个epoll
实例,并获取一个文件描述符来引用该实例。 - 注册文件描述符:使用
epoll_ctl
函数将需要监听的文件描述符添加到epoll
实例中,并指定需要监听的事件类型。 - 等待事件:使用
epoll_wait
函数阻塞等待事件发生,当有文件描述符上的事件发生时,epoll_wait
会返回触发事件的文件描述符列表。 - 处理事件:根据返回的文件描述符列表,处理相应的I/O事件。
3.select/poll/epoll各自的应用场景
select 应用场景
select 的 timeout 参数精度为微秒,而 poll 和 epoll 为毫秒,因此 select 更加适用于实时性要求比较高的场景,比如核反应堆的控制。
select 可移植性更好,几乎被所有主流平台所支持。
poll 应用场景
poll 没有最大描述符数量的限制,如果平台支持并且对实时性要求不高,应该使用 poll 而不是 select。
epoll 应用场景
只需要运行在 Linux 平台上,有大量的描述符需要同时轮询,并且这些连接最好是长连接。
需要同时监控小于 1000 个描述符,就没有必要使用 epoll,因为这个应用场景下并不能体现 epoll 的优势。
需要监控的描述符状态变化多,而且都是非常短暂的,也没有必要使用 epoll。因为 epoll 中的所有描述符都存储在内核中,造成每次需要对描述符的状态改变都需要通过 epoll_ctl() 进行系统调用,频繁系统调用降低效率。并且 epoll 的描述符存储在内核,不容易调试。
4.IO多路复用适用的场合
IO多路复用适用如下场合:
- 当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。
- 当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。
- 如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。
- 如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。
- 如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用。
- 与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。
操作系统
0.操作系统基础知识
1.操作系统主要有哪些功能?
从资源管理的角度来看,操作系统有 6 大功能:
- 进程和线程的管理:进程的创建、撤销、阻塞、唤醒,进程间的通信等。
- 存储管理:内存的分配和管理、外存(磁盘等)的分配和管理等。
- 文件管理:文件的读、写、创建及删除等。
- 设备管理:完成设备(输入输出设备和外部存储设备等)的请求或释放,以及设备启动等功能。
- 网络管理:操作系统负责管理计算机网络的使用。网络是计算机系统中连接不同计算机的方式,操作系统需要管理计算机网络的配置、连接、通信和安全等,以提供高效可靠的网络服务。
- 安全管理:用户的身份认证、访问控制、文件加密等,以防止非法用户对系统资源的访问和操作。
2.操作系统的四个特性?
并发:同一段时间内多个程序执行(与并行区分,并行指的是同一时刻有多个事件,多处理器系统可以使程序并行执行)
共享:系统中的资源可以被内存中多个并发执行的进线程共同使用
虚拟:通过分时复用(如分时系统)以及空分复用(如虚拟内存)技术把一个物理实体虚拟为多个
异步:系统进程用一种走走停停的方式执行,(并不是一下子走完),进程什么时候以怎样的速度向前推进是不可预知的
3.用户态和内核态
用户态(User Mode)和内核态(Kernel Mode)是计算机操作系统中用来描述处理器运行模式的两个术语。这两种模式主要区别在于它们对系统资源的访问权限以及在执行任务时的操作系统支持。
- 用户态(User Mode): 在用户态下运行的应用程序只能访问受限的系统资源。这意味着应用程序不能直接访问物理内存、硬件设备或者其他敏感的系统区域。用户态下的代码受到操作系统的保护和隔离,一个应用程序无法直接影响另一个应用程序或操作系统的内核。用户态是大多数应用程序运行的状态,包括你的浏览器、文字处理软件等。
- 内核态(Kernel Mode): 内核态是操作系统内核运行的状态。在这个模式下,代码可以访问所有的硬件资源,并且可以执行任何类型的指令,包括那些用于直接与硬件交互的特权指令。内核态提供了更高级别的访问权限,这使得内核能够管理内存、处理输入输出操作、调度进程等关键任务。由于其强大的控制能力,内核态下的错误可能会导致整个系统的不稳定甚至崩溃。
操作系统通过一种称为“系统调用”的机制来允许用户态的应用程序请求内核态下的服务。例如,当一个应用程序需要读取文件或者发送网络数据包时,它会发出一个系统调用请求,然后操作系统会切换到内核态来执行这个请求。完成之后,操作系统再返回到用户态继续执行应用程序。
用户态和内核态是如何切换的?
用户态切换到内核态的 3 种方式:
- 系统调用(Trap):用户态进程 主动 要求切换到内核态的一种方式,主要是为了使用内核态才能做的事情比如读取磁盘资源。系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现。
- 中断(Interrupt):当外围设备完成用户请求的操作后,会向 CPU 发出相应的中断信号,这时 CPU 会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
- 异常(Exception):当 CPU 在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
在系统的处理上,中断和异常类似,都是通过中断向量表来找到相应的处理程序进行处理。区别在于,中断来自处理器外部,不是由任何一条专门的指令造成,而异常是执行当前指令的结果。
什么是中断?有什么作用?
- 定义:中断是指CPU在执行程序时,由于系统出现了某种需要立即处理的情况,而暂停正在执行的程序,转而去执行另一段特殊程序来处理这一情况的过程。
- 工作原理:当中断发生时,CPU会保存当前执行程序的上下文(即程序计数器、寄存器等信息),然后跳转到中断服务程序去处理中断请求。处理完毕后,CPU会恢复之前保存的上下文,继续执行被中断的程序。
- 中断的作用: 中断使得计算机系统具备应对对处理突发事件的能力,提高了CPU的工作效率,如果没有中断系统,CPU就只能按照原来的程序编写的先后顺序,对各个外设进行查询和处理,即轮询工作方式,轮询方法貌似公平,但实际工作效率却很低,却不能及时响应紧急事件。
什么是缺页中断
在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中。 当所要访问的页面不在内存时,会产生一次缺页中断,此时操作系统会根据页表中的外存地址在外 存中找到所缺的一页,将其调入内存。 缺页中断的处理流程如下:
A. 在内存中有空闲物理页面时,分配一物理页帧f,转第E步;
B. 依据页面置换算法选择被替换的物理页帧f,对应逻辑页q;
C. 如果q被修改过,则把它写回外存;
D. 修改q的页表项中驻留位置为0;
E. 将需要访问的页p装入到物理页f;
F. 修改p的页表项驻留位为1,物理页帧号为f;
G. 重新执行产生缺页的指令。
4.系统调用
在我们运行的用户程序中,凡是与系统态级别的资源有关的操作(如文件管理、进程控制、内存管理等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。
这些系统调用按功能大致可分为如下几类:
- 设备管理:完成设备(输入输出设备和外部存储设备等)的请求或释放,以及设备启动等功能。
- 文件管理:完成文件的读、写、创建及删除等功能。
- 进程管理:进程的创建、撤销、阻塞、唤醒,进程间的通信等功能。
- 内存管理:完成内存的分配、回收以及获取作业占用内存区大小及地址等功能。
系统调用和普通库函数调用非常相似,只是系统调用由操作系统内核提供,运行于内核态,而普通的库函数调用由函数库或用户自己提供,运行于用户态。
系统调用过程
系统调用的过程可以简单分为以下几个步骤:
- 用户态的程序发起系统调用,因为系统调用中涉及一些特权指令(只能由操作系统内核态执行的指令),用户态程序权限不足,因此会中断执行,也就是 Trap(Trap 是一种中断)。
- 发生中断后,当前 CPU 执行的程序会中断,跳转到中断处理程序。内核程序开始执行,也就是开始处理系统调用。
- 内核处理完成后,主动触发 Trap,这样会再次发生中断,切换回用户态工作。
5.读取文件流程
读取文件的流程涉及多个步骤,包括用户空间的库函数调用、系统调用接口、虚拟文件系统(VFS)以及底层的文件系统操作等。具体如下:
- 用户程序请求:程序通过高级语言的标准库(例如C语言中的fread或read函数)发起读文件请求。
- 系统调用处理:该请求会被转化为一个系统调用(如Linux中的
read()
),这是操作系统提供给用户空间程序访问内核功能的接口。 - 文件描述符解析:系统调用根据进程提供的文件描述符在已打开文件列表中查找对应的file对象。
- VFS层处理:VFS是内核用来抽象不同文件系统的一个中间层,它通过文件路径找到对应的inode(索引节点)。
- 定位文件数据块:通过inode和指定的文件偏移量确定要读取的数据所在的页,如果这些数据不在内存中,将触发页缺失异常,从磁盘加载相应页到内存中。
- 返回数据给用户程序:一旦所需数据位于内存中,系统调用会将数据复制到用户空间提供的缓冲区,然后返回读取的字节数。
整个读取文件的流程涉及到操作系统的多个组件协同工作,确保了数据的高效和安全访问。
7.零拷贝
1.零拷贝原理
零拷贝原理是一种提高数据传输效率的优化技术,它可以显著减少在数据移动过程中所需的CPU拷贝操作和上下文切换。以下是零拷贝的关键实现方式:
- 内存映射(Memory Mapping): 使用mmap系统调用将文件或设备直接映射到进程的虚拟地址空间中,这样进程可以直接访问这些数据,而不需要额外的数据拷贝过程。
- DMA传输(Direct Memory Access): 利用DMA,设备可以不通过CPU直接与内存进行数据交换,减少了CPU的负担。
- 内核缓存(Kernel Buffering): 通过利用操作系统内核提供的缓冲机制,数据可以在用户空间和内核空间之间高效地转移。
- sendfile: 这是在Linux系统中实现零拷贝的一种特殊方法,它允许一个进程向另一个进程直接发送文件内容,无需通过中间缓冲区。
- splice: splice调用允许在内核空间中的两个文件描述符之间直接传输数据,同样避免了不必要的数据拷贝。
- Direct I/O: Direct I/O 是另一种绕过内核缓存,直接在用户空间和存储设备间传输数据的技术。
零拷贝技术的优势包括降低CPU使用率、减少内存消耗、缩短I/O操作时间等。这种技术特别适用于高性能服务器,如数据库服务器、Web服务器和文件服务器,在这些场景中,快速有效地处理大量数据的传输至关重要。
2.零拷贝主要场景
零拷贝技术主要应用于以下几种场景:
- 文件系统:在高性能文件系统中,零拷贝技术可以直接影响数据传输效率。例如,Linux的sendfile系统调用能够直接将数据从文件系统的page cache传输到网络协议栈,避免了在用户空间和内核空间之间的数据复制。
- 网络通信:在网络应用中,零拷贝技术通过减少CPU的使用率来提高网络吞吐量,这对于需要快速处理大量网络数据的应用尤为重要。
- 大数据处理:在大数据处理领域,零拷贝技术减少了数据在内存和磁盘之间的复制,从而提高了数据处理的效率。
- 数据库:数据库应用中,使用零拷贝技术可以减少数据在内存和磁盘之间的复制次数,提高查询和事务处理的效率。
- 虚拟化领域:在虚拟化技术,如KVM中,零拷贝技术可以减少虚拟机间网络数据的复制,从而提高虚拟机的网络性能。
- 分布式流处理平台:如Apache Kafka这类用于处理和存储实时数据的分布式流处理平台,也可以利用零拷贝技术来优化数据流动效率。
总的来说,零拷贝技术是一种高效的I/O操作优化技术,它在不同的应用场景中发挥着重要作用,特别是在需要快速、高效地处理大量数据的环境中,这种技术可以显著提升性能和效率。
1.并行和并发
- 并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生;
- 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件;
2.进程和线程和协程
0.什么是进程和线程和协程?
协程是一种比线程更加轻量级的一种函数。正如一个进程可以拥有多个线程一样,一个线程可以拥有多个协程。协程不是被操作系统内核所管理的,而是完全由程序所控制的,即在用户态执行。 这样带来的好处是:性能有大幅度的提升,因为不会像线程切换那样消耗资源。
进程:进程是系统进行资源分配和调度的一个独立单位,是系统中的并发执行的单位。
线程:线程是进程的一个实体,也是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,有时又被称为轻权进程或轻量级进程。
1.进程和线程的区别
- 进程是资源分配的最小单位,而线程是 CPU 调度的最小单位;
- 创建进程或撤销进程,系统都要为之分配或回收资源,操作系统开销远大于创建或撤销线程时的开销;
- 不同进程地址空间相互独立,同一进程内的线程共享同一地址空间。一个进程的线程在另一个进程内是不可见的;
- 进程间不会相互影响,而一个线程挂掉将可能导致整个进程挂掉;
2.线程和协程有什么区别呢?
线程与协程的区别:
- 上下文切换成本:线程:线程之间的上下文切换涉及到保存当前线程的状态(如寄存器和栈指针等),并恢复另一个线程的状态,这个过程需要操作系统内核的支持,因此相对昂贵。协程:协程的上下文切换发生在用户态,不需要涉及内核态与用户态之间的切换,所以它的开销要小得多。
- 资源消耗:线程:每个线程都有自己独立的栈空间,这会导致更多的内存使用,并且线程的数量通常受限于系统资源。协程:协程可以共享栈空间,甚至可以共享堆空间中的数据结构,这使得它们比线程更轻量级,可以创建的数量也更多。
- 一个线程可以有多个协程。
- 调度机制:线程是抢占式,即可以并发,而协程是非抢占式的,即一个线程中的多个协程的运行是串行的。当一个协程运行时,其他协程必须被挂起。
- 使用场景:线程:适合于需要并行处理的任务,比如多核处理器上的计算密集型任务。协程:更适合于IO密集型的任务,例如网络请求或文件读写操作,在这些场景中,协程可以避免不必要的等待时间,提高程序的整体吞吐量。
3.为什么协程比线程切换的开销小?
- 上下文切换成本: 线程:线程之间的上下文切换涉及到保存当前线程的状态(如寄存器和栈指针等),并恢复另一个线程的状态,这个过程需要操作系统内核的支持,涉及内核态和用户态之间的转换。协程:协程的上下文切换发生在用户态,不需要涉及内核态与用户态之间的切换,所以它的开销要小得多。
- 锁协程不需要多线程的锁机制,因为多个协程从属于一个线程,不存在同时写变量冲突,效率比线 程高。避免了加锁解锁的开销。
2.线程间的同步的方式有哪些?
线程同步是两个或多个共享关键资源的线程的并发执行。应该同步线程以避免关键的资源使用冲突。
下面是几种常见的线程同步的方式:
- **互斥锁(Mutex)**:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。比如 Java 中的
synchronized
关键词和各种Lock
都是这种机制。 - 读写锁(Read-Write Lock):允许多个线程同时读取共享资源,但只有一个线程可以对共享资源进行写操作。
- **信号量(Semaphore)**:它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
- 屏障(Barrier):屏障是一种同步原语,用于等待多个线程到达某个点再一起继续执行。当一个线程到达屏障时,它会停止执行并等待其他线程到达屏障,直到所有线程都到达屏障后,它们才会一起继续执行。比如 Java 中的
CyclicBarrier
是这种机制。
3.进程通信的几种方式
进程通信的几种方式包括管道、消息队列、共享内存、信号量、信号和套接字等。进程通信(IPC)是指在一个操作系统中,不同进程之间传播或交换信息的方式。这些方式有助于程序员协调不同的进程,使它们能在同一操作系统中同时运行并相互传递信息。
- 管道(Pipe)和命名管道(Named Pipe) 管道是一种半双工的通信方式,数据只能单向流动,通常用于具有亲缘关系的进程间通信。匿名管道主要用于有直接亲缘关系的进程间通信,例如父子进程之间的数据传递。命名管道(FIFO)则可以用于无直接亲缘关系的进程间,通过在磁盘上创建一个有名文件来实现进程间的通信,任何有适当权限的进程都可以通过该文件进行交互。
- 消息队列(Message Queue) 消息队列是存放在内核中的一个消息链表,允许一个进程向另一个进程发送消息数据,且不必考虑数据的格式化问题。每个消息队列都有一个唯一的标识符,进程可以通过发送和接收原语与内核通信,实现数据的异步传输。消息队列的优势在于其能够指定特定消息类型,使得接收进程可以根据自定义条件选择性地接收消息。
- 共享内存(Shared Memory) 共享内存是最快的IPC方式,它允许多个进程访问同一段物理内存。该方式通过将共享内存区域映射到进程的地址空间实现,一个进程写入的数据可以被其他进程读取。使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有用的进程间通信方式。
- 信号量(Semaphore) 信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。这种通信方式主要用于解决与同步相关的问题并避免竞争条件。常用作锁机制,以防止一个进程正在访问共享资源时,其他进程也进行访问。
- 信号 (Signal) 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。信号的主要用途是在进程之间传递少量信息,例如通知进程某个错误发生或处理某种特定的情况。
- 套接字(Socket) 套接字是一种进程间通信机制,可用于不同机器间的进程通信。套接字通过标准的UNIX文件描述符进行读写操作,支持双向通信和多种协议类型。此方法主要用于在客户端和服务器之间通过网络进行通信。套接字是支持 TCP/IP 的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
进程之间共享内存的通信方式有什么好处?
采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的 拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存 则只拷贝两次数据:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。 实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共 享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有 写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率 是非常高的。
4.进程有哪几种状态?
我们一般把进程大致分为 5 种状态,这一点和线程很像!
- **创建状态(new)**:进程正在被创建,尚未到就绪状态。
- **就绪状态(ready)**:进程已处于准备运行状态,即进程获得了除了处理器之外的一切所需资源,一旦得到处理器资源(处理器分配的时间片)即可运行。
- **运行状态(running)**:进程正在处理器上运行(单核 CPU 下任意时刻只有一个进程处于运行状态)。
- **阻塞状态(waiting)**:又称为等待状态,进程正在等待某一事件而暂停运行如等待某资源为可用或等待 IO 操作完成。即使处理器空闲,该进程也不能运行。
- **结束状态(terminated)**:进程正在从系统中消失。可能是进程正常结束或其他原因中断退出运行。
5.有了进程为什么还需要线程?
- 进程切换是一个开销很大的操作,线程切换的成本较低。
- 线程更轻量,一个进程可以创建多个线程。
- 多个线程可以并发处理不同的任务,更有效地利用了多处理器和多核计算机。而进程只能在一个时间干一件事,如果在执行过程中遇到阻塞问题比如 IO 阻塞就会挂起直到结果返回。
- 同一进程内的线程共享内存和文件,因此它们之间相互通信无须调用内核。
6.多线程相较单线程的好处
1、并发提升程序执行效率
2、提升CPU利用率,访存的时候可以切换线程来执行
3、更快的响应速度,可以有专门的线程来监听用户请求和专门的线程来处理请求。比如监听线程和工作线程是两个线程,这样监听就负责监听,工作的就负责工作,监听到用户请求马上把请求转到工作线程去处理,监听线程继续监听
7.PCB (进程控制块)是什么?包含哪些信息?
PCB(Process Control Block) 即进程控制块,是操作系统中用来管理和跟踪进程的数据结构,每个进程都对应着一个独立的 PCB。你可以将 PCB 视为进程的大脑。
当操作系统创建一个新进程时,会为该进程分配一个唯一的进程 ID,并且为该进程创建一个对应的进程控制块。当进程执行时,PCB 中的信息会不断变化,操作系统会根据这些信息来管理和调度进程。
PCB 主要包含下面几部分的内容:
- 进程的描述信息,包括进程的名称、标识符等等;
- 进程的调度信息,包括进程阻塞原因、进程状态(就绪、运行、阻塞等)、进程优先级(标识进程的重要程度)等等;
- 进程对资源的需求情况,包括 CPU 时间、内存空间、I/O 设备等等。
- 进程打开的文件信息,包括文件描述符、文件类型、打开模式等等。
- 处理机的状态信息(由处理机的各种寄存器中的内容组成的),包括通用寄存器、指令计数器、程序状态字 PSW、用户栈指针。
8.进程的调度算法有哪些?
- 先到先服务调度算法(FCFS,First Come, First Served) : 从就绪队列中选择一个最先进入该队列的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。
- 短作业优先的调度算法(SJF,Shortest Job First) : 从就绪队列中选出一个估计运行时间最短的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。
- 时间片轮转调度算法(RR,Round-Robin) : 时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。
- 多级反馈队列调度算法(MFQ,Multi-level Feedback Queue):前面介绍的几种进程调度的算法都有一定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程 。多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业(进程)迅速完成。,因而它是目前被公认的一种较好的进程调度算法,UNIX 操作系统采取的便是这种调度算法。
- 优先级调度算法(Priority):为每个流程分配优先级,首先执行具有最高优先级的进程,依此类推。具有相同优先级的进程以 FCFS 方式执行。可以根据内存要求,时间要求或任何其他资源要求来确定优先级。
9.什么是僵尸进程和孤儿进程?
- 僵尸进程:子进程已经终止,但是其父进程仍在运行,且父进程没有调用 wait()或 waitpid()等系统调用来获取子进程的状态信息,释放子进程占用的资源,导致子进程的 PCB 依然存在于系统中,但无法被进一步使用。这种情况下,子进程被称为“僵尸进程”。避免僵尸进程的产生,父进程需要及时调用 wait()或 waitpid()系统调用来回收子进程。
- 孤儿进程:一个进程的父进程已经终止或者不存在,但是该进程仍在运行。这种情况下,该进程就是孤儿进程。孤儿进程通常是由于父进程意外终止或未及时调用 wait()或 waitpid()等系统调用来回收子进程导致的。为了避免孤儿进程占用系统资源,操作系统会将孤儿进程的父进程设置为 init 进程(进程号为 1),由 init 进程来回收孤儿进程的资源。
10.怎么查看僵尸进程?
Linux 下可以使用 Top 命令查找,zombie
值表示僵尸进程的数量,为 0 则代表没有僵尸进程。
4.死锁
1. 什么是死锁?
死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象。
比如:线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方持有的资源,所以这两个线程就会互相等待而进入死锁状态。
2.死锁产生的必要条件?
死锁产生的四个必要条件:
- 互斥:一个资源每次只能被一个进程使用
- 请求与保持:一个进程因请求资源而阻塞时,不释放获得的资源
- 不剥夺:进程已获得的资源,在未使用之前,不能强行剥夺
- 循环等待:进程之间循环等待着资源
3.避免死锁的方法
避免死锁的方法:
- 互斥条件不能破坏,因为加锁就是为了保证互斥
- 一次性申请所有的资源,避免线程占有资源而且在等待其他资源
- 占有部分资源的线程进一步申请其他资源时,如果申请不到,主动释放它占有的资源
- 按序申请资源
4.解决死锁问题的方法
解决死锁问题通常涉及以下几种方法:
- 预防死锁:这是一种更为主动的方法,目的是在系统设计阶段就避免死锁的四个必要条件之一或多个成立。例如,可以设计系统以破坏循环等待条件,通过规定资源的申请顺序来避免循环等待。
- 避免死锁:与预防死锁类似,但更为灵活。它允许系统在某些情况下暂时破坏死锁的条件,例如,通过一次性申请所有必需资源来防止请求并保持条件的成立。
- 检测和恢复:这种方法涉及到实时监控系统以检测死锁的发生。一旦检测到死锁,系统将采取措施来解除死锁,如逐个撤销陷入死锁的进程,回收其资源并重新分配,直至死锁解除。
4.能写一个模拟产生死锁的代码吗?
下面通过一个实际的例子来模拟下图展示的线程死锁:
1 | class Test{ |
5.内存管理
1.内存管理方式
内存管理方式可以简单分为下面两种:
- 连续内存管理:为一个用户程序分配一个连续的内存空间,内存利用率一般不高。
- 非连续内存管理:允许一个程序使用的内存分布在离散或者说不相邻的内存中,相对更加灵活一些。
非连续内存管理存在下面 3 种方式:
- 段式管理:以段(—段连续的物理内存)的形式管理/分配物理内存。应用程序的虚拟地址空间被分为大小不等的段,段是有实际意义的,每个段定义了一组逻辑信息,例如有主程序段 MAIN、子程序段 X、数据段 D 及栈段 S 等。
- 页式管理:把物理内存分为连续等长的物理页,应用程序的虚拟地址空间也被划分为连续等长的虚拟页,是现代操作系统广泛使用的一种内存管理方式。
- 段页式管理机制:结合了段式管理和页式管理的一种内存管理机制,把物理内存先分成若干段,每个段又继续分成若干大小相等的页。
2.什么是虚拟内存?有什么用?
虚拟内存(Virtual Memory) 是计算机系统内存管理非常重要的一个技术,本质上来说它只是逻辑存在的,是一个假想出来的内存空间,主要作用是作为进程访问主存(物理内存)的桥梁并简化内存管理。
总结来说,虚拟内存主要提供了下面这些能力:
- 隔离进程:物理内存通过虚拟地址空间访问,虚拟地址空间与进程一一对应。每个进程都认为自己拥有了整个物理内存,进程之间彼此隔离,一个进程中的代码无法更改正在由另一进程或操作系统使用的物理内存。
- 提升物理内存利用率:有了虚拟地址空间后,操作系统只需要将进程当前正在使用的部分数据或指令加载入物理内存。
- 简化内存管理:进程都有一个一致且私有的虚拟地址空间,程序员不用和真正的物理内存打交道,而是借助虚拟地址空间访问物理内存,从而简化了内存管理。
- 多个进程共享物理内存:进程在运行过程中,会加载许多操作系统的动态库。这些库对于每个进程而言都是公用的,它们在内存中实际只会加载一份,这部分称为共享内存。
- 提高内存使用安全性:控制进程对物理内存的访问,隔离不同进程的访问权限,提高系统的安全性。
- 提供更大的可使用内存空间:可以让程序拥有超过系统物理内存大小的可用内存空间。这是因为当物理内存不够用时,可以利用磁盘充当,将物理内存页(通常大小为 4 KB)保存到磁盘文件(会影响读写速度),数据或代码页会根据需要在物理内存与磁盘之间移动。
3.什么是分页机制?
把内存空间划分为大小相等且固定的块,作为主存的基本单位。因为程序数据存储在不同的页面中,而页面又离散的分布在内存中,因此需要一个页表来记录映射关系,以实现从页号到物理块号的映射。
访问分页系统中内存数据需要两次的内存访问 (一次是从内存中访问页表,从中找到指定的物理块号,加上页内偏移得到实际物理地址;第二次就是根据第一次得到的物理地址访问内存取出数据)。
4.什么是分段机制?
分页是为了提高内存利用率,而分段是为了满足程序员在编写代码的时候的一些逻辑需求(比如数据共享,数据保护,动态链接等)。
分段内存管理当中,地址是二维的,一维是段号,二维是段内地址;其中每个段的长度是不一样的,而且每个段内部都是从0开始编址的。由于分段管理中,每个段内部是连续内存分配,但是段和段之间是离散分配的,因此也存在一个逻辑地址到物理地址的映射关系,相应的就是段表机制。
5.分页机制和分段机制有哪些共同点和区别?
共同点:
- 都是非连续内存管理的方式。
- 都采用了地址映射的方法,将虚拟地址映射到物理地址,以实现对内存的管理和保护
区别:
- 分页对程序员是透明的,但是分段需要程序员显式划分每个段。
- 分页的地址空间是一维地址空间,分段是二维的。
- 页的大小不可变,段的大小可以动态改变。
- 分页主要用于实现虚拟内存,从而获得更大的地址空间;分段主要是为了使程序和数据可以被划分为逻辑上独立的地址空间并且有助于共享和保护。
6.段页机制
结合了段式管理和页式管理的一种内存管理机制,把物理内存先分成若干段,每个段又继续分成若干大小相等的页。
在段页式机制下,地址翻译的过程分为两个步骤:
- 段式地址映射。
- 页式地址映射。
7.局部性原理
局部性原理是指在程序执行过程中,数据和指令的访问存在一定的空间和时间上的局部性特点。其中,时间局部性是指一个数据项或指令在一段时间内被反复使用的特点,空间局部性是指一个数据项或指令在一段时间内与其相邻的数据项或指令被反复使用的特点。
在分页机制中,页表的作用是将虚拟地址转换为物理地址,从而完成内存访问。在这个过程中,局部性原理的作用体现在两个方面:
- 时间局部性:由于程序中存在一定的循环或者重复操作,因此会反复访问同一个页或一些特定的页,这就体现了时间局部性的特点。为了利用时间局部性,分页机制中通常采用缓存机制来提高页面的命中率,即将最近访问过的一些页放入缓存中,如果下一次访问的页已经在缓存中,就不需要再次访问内存,而是直接从缓存中读取。
- 空间局部性:由于程序中数据和指令的访问通常是具有一定的空间连续性的,因此当访问某个页时,往往会顺带访问其相邻的一些页。为了利用空间局部性,分页机制中通常采用预取技术来预先将相邻的一些页读入内存缓存中,以便在未来访问时能够直接使用,从而提高访问速度。
总之,局部性原理是计算机体系结构设计的重要原则之一,也是许多优化算法的基础。在分页机制中,利用时间局部性和空间局部性,采用缓存和预取技术,可以提高页面的命中率,从而提高内存访问效率
8.页面置换算法
为什么要页面置换:
因为应用程序是分多次装入内存的,所以运行到一定的时间,一定会发生缺页。地址映射的过程中,如果页面中发现要访问的页面不在内存中,会产生缺页中断。此时操作系统必须在内存里选择一个页面把他移出内存,为即将调入的页面让出空间。选择淘汰哪一页的规则就是页面置换算法
几种页面置换算法:
最佳置换算法(理想):将当前页面中在未来最长时间内不会被访问的页置换出去
先进先出:淘汰最早调入的页面
最近最久未使用 LRU:每个页面有一个t来记录上次页面被访问直到现在,每次置换时置换t值最大的页面(用寄存器或栈实现)
时钟算法clock(也被称为最近未使用算法NRU):页面设置访问为,将页面链接为一个环形列表,每个页有一个访问位0/1, 1表示又一次获救的机会,下次循环指针指向它时可以免除此次置换,但是会把访问位置为0, 代表他下次如果碰到循环指针就该被置换了。页面被访问的时候访问位设为1。页面置换的时候,如果当前指针的访问位为0,置换,否则将这个值置为0,循环直到遇到访问位为0的页面。
改进型Clock算法:在clock算法的基础上添加一个修改位,优先替换访问位和修改位都是0的页面,其次替换访问位为0修改位为1的页面。
最少使用算法LFU:设置寄存器记录页面被访问次数,每次置换当前访问次数最少的。
6.文件系统
1.硬链接和软链接有什么区别?
在 Linux/类 Unix 系统上,文件链接(File Link)是一种特殊的文件类型,可以在文件系统中指向另一个文件。常见的文件链接类型有两种:
1、硬链接(Hard Link)
- 在 Linux/类 Unix 文件系统中,每个文件和目录都有一个唯一的索引节点(inode)号,用来标识该文件或目录。硬链接通过 inode 节点号建立连接,硬链接和源文件的 inode 节点号相同,两者对文件系统来说是完全平等的(可以看作是互为硬链接,源头是同一份文件),删除其中任何一个对另外一个没有影响,可以通过给文件设置硬链接文件来防止重要文件被误删。
- 只有删除了源文件和所有对应的硬链接文件,该文件才会被真正删除。
- 硬链接具有一些限制,不能对目录以及不存在的文件创建硬链接,并且,硬链接也不能跨越文件系统。
ln
命令用于创建硬链接。
2、软链接(Symbolic Link 或 Symlink)
- 软链接和源文件的 inode 节点号不同,而是指向一个文件路径。
- 源文件删除后,软链接依然存在,但是指向的是一个无效的文件路径。
- 软连接类似于 Windows 系统中的快捷方式。
- 不同于硬链接,可以对目录或者不存在的文件创建软链接,并且,软链接可以跨越文件系统。
ln -s
命令用于创建软链接。
2.硬链接为什么不能跨文件系统?
我们之前提到过,硬链接是通过 inode 节点号建立连接的,而硬链接和源文件共享相同的 inode 节点号。
然而,每个文件系统都有自己的独立 inode 表,且每个 inode 表只维护该文件系统内的 inode。如果在不同的文件系统之间创建硬链接,可能会导致 inode 节点号冲突的问题,即目标文件的 inode 节点号已经在该文件系统中被使用。
3.提高文件系统性能的方式有哪些?
- 优化硬件:使用高速硬件设备(如 SSD、NVMe)替代传统的机械硬盘,使用 RAID(Redundant Array of Inexpensive Disks)等技术提高磁盘性能。
- 选择合适的文件系统选型:不同的文件系统具有不同的特性,对于不同的应用场景选择合适的文件系统可以提高系统性能。
- 运用缓存:访问磁盘的效率比较低,可以运用缓存来减少磁盘的访问次数。不过,需要注意缓存命中率,缓存命中率过低的话,效果太差。
- 避免磁盘过度使用:注意磁盘的使用率,避免将磁盘用满,尽量留一些剩余空间,以免对文件系统的性能产生负面影响。
- 对磁盘进行合理的分区:合理的磁盘分区方案,能够使文件系统在不同的区域存储文件,从而减少文件碎片,提高文件读写性能。
4.常见的磁盘调度算法有哪些?
磁盘调度算法是操作系统中对磁盘访问请求进行排序和调度的算法,其目的是提高磁盘的访问效率。
一次磁盘读写操作的时间由磁盘寻道/寻找时间、延迟时间和传输时间决定。磁盘调度算法可以通过改变到达磁盘请求的处理顺序,减少磁盘寻道时间和延迟时间。
先来先服务算法(First-Come First-Served,FCFS):按照请求到达磁盘调度器的顺序进行处理,先到达的请求的先被服务。FCFS 算法实现起来比较简单,不存在算法开销。不过,由于没有考虑磁头移动的路径和方向,平均寻道时间较长。同时,该算法容易出现饥饿问题,即一些后到的磁盘请求可能需要等待很长时间才能得到服务。
最短寻道时间优先算法(Shortest Seek Time First,SSTF):也被称为最佳服务优先(Shortest Service Time First,SSTF)算法,优先选择距离当前磁头位置最近的请求进行服务。SSTF 算法能够最小化磁头的寻道时间,但容易出现饥饿问题,即磁头附近的请求不断被服务,远离磁头的请求长时间得不到响应。实际应用中,需要优化一下该算法的实现,避免出现饥饿问题。
扫描算法(SCAN):也被称为电梯(Elevator)算法,基本思想和电梯非常类似。磁头沿着一个方向扫描磁盘,如果经过的磁道有请求就处理,直到到达磁盘的边界,然后改变移动方向,依此往复。SCAN 算法能够保证所有的请求得到服务,解决了饥饿问题。但是,如果磁头从一个方向刚扫描完,请求才到的话。这个请求就需要等到磁头从相反方向过来之后才能得到处理。
循环扫描算法(Circular Scan,C-SCAN):SCAN 算法的变体,只在磁盘的一侧进行扫描,并且只按照一个方向扫描,直到到达磁盘边界,然后回到磁盘起点,重新开始循环。
边扫描边观察算法(LOOK):SCAN 算法中磁头到了磁盘的边界才改变移动方向,这样可能会做很多无用功,因为磁头移动方向上可能已经没有请求需要处理了。LOOK 算法对 SCAN 算法进行了改进,如果磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向,依此往复。也就是边扫描边观察指定方向上还有无请求,因此叫 LOOK。
均衡循环扫描算法(C-LOOK):C-SCAN 只有到达磁盘边界时才能改变磁头移动方向,并且磁头返回时也需要返回到磁盘起点,这样可能会做很多无用功。C-LOOK 算法对 C-SCAN 算法进行了改进,如果磁头移动的方向上已经没有磁道访问请求了,就可以立即让磁头返回,并且磁头只需要返回到有磁道访问请求的位置即可。