自己在秋招过程中遇到的计算机网络的面试题
OSI七层网络模型
DNS:应用层协议
根据域名查IP地址
DNS查询⽅式有哪些?
递归解析
局部DNS服务器⾃⼰负责向其他DNS服务器进⾏查询,⼀般是先向该域名的根域服务器查询,再由根域名服务器⼀级级向下查询。最后得到的查询结果返回给局部DNS服务器,再由局部DNS服务器返回给客户端。
迭代解析
迭代解析只是帮你找到相关的服务器⽽已,⽽不会帮你去查。⽐如说: baidu.com的服务器ip地址在192.168.4.5这⾥,你⾃⼰去查吧
IP
数据的分片和组装都是在IP层完成的,上层的传输层和下层的链路层并不关心。
传输层只负责为数据传送提供可靠性保证,当数据传送失败后,传输层的TCP协议可以组织进行数据重传
TCP
TCP连接中间会有什么操作
在TCP连接中,客户端和服务器之间会进行以下操作:
- 握手阶段:客户端向服务器发送SYN包(同步包),请求建立连接。服务器收到SYN包后,向客户端发送SYN+ACK包(同步确认包),表示可以建立连接。客户端收到SYN+ACK包后,再向服务器发送ACK包(确认包),表示连接建立成功。
- 数据传输阶段:连接建立成功后,客户端和服务器之间可以进行数据的传输。客户端向服务器发送数据包,服务器接收数据包并进行处理,然后向客户端发送响应包。客户端收到响应包后,可以再次向服务器发送数据包,以此类推。
- 断开连接阶段:当客户端或服务器不再需要连接时,可以发送FIN包(结束包)来请求断开连接。对方收到FIN包后,也发送FIN包进行响应,表示同意断开连接。当两端都收到对方的FIN包后,连接才真正关闭。
在TCP连接中可能会出现丢包、拥塞等情况,需要进行相应的处理,例如重传丢失的数据包、调整发送窗口大小等。
三次握手
一开始,客户端和服务端都处于Closed状态,服务器端主动监听某个端口,处于listen状态
- 第一次握手:第一个报文,SYN报文
- 1)客户端随机初始化序列号(client_isn),将序号填入TCP首部【序号】字段中
- 2)SYN标志位置1,表示SYN报文
- 3)把第一个SYN报文发给服务端,表示发起连接,不包含应用层数据
- 4)客户端处于SYN-SENT状态
- 第二次握手:第二个报文,SYN+ACK报文
- 1)服务端收到客户端的SYN报文后
- 2)服务端随机初始化序列号(server_isn),将序号填入TCP首部【序号】字段中
- 3)把TCP首部的【确认应答号】字段填入client_isn+1
- 4)把SYN和ACK标志位置为1,表示SYN+ACK报文
- 5)把该报文发给客户端,不包含应用层数据
- 6)服务端端处于SYN-RCVD状态
- 第三次握手:第三个报文,ACK报文
- 1)客户端收到服务端的报文后
- 2)向服务端回应最后一个应答报文,该报文TCP首部ACK标志位置为1,表示ACK报文
- 3)把TCP首部的【确认应答号】字段填入server_isn+1
- 4)把该报文发给服务端,可以携带应用层数据
- 5)客户端处于ESTABLISHED状态
- 6)服务器收到客户端的应答报文后,也进入ESTABLISHED状态
总结:
1)前两次握手是不可以携带数据的,第三次握手可以
2)一旦完成三次握手,双方都处于ESTABLISHED状态,此时连接就建立完成了,客户端和服务器可以相互发送数据
3)序列号:用来解决乱序问题
为什么是三次握手,不是两次,四次?
- 1)避免重复历史连接的初始化(主要原因)
- 1-⼀个「旧 SYN 报⽂」⽐「最新的 SYN 」 报⽂早到达了服务端;
2-那么此时服务端就会回⼀个 SYN + ACK 报⽂给客户端;
3-客户端收到后可以根据⾃身的上下⽂,判断这是⼀个历史连接(序列号过期或超时),那么客户端就会发送RST 报⽂给服务端,表示中⽌这⼀次连接。
- 1-⼀个「旧 SYN 报⽂」⽐「最新的 SYN 」 报⽂早到达了服务端;
- 2)同步双方的序列号
- 序列号是可靠传输的⼀个关键因素,它的作⽤:
1)接收⽅可以去除重复的数据;
2)接收⽅可以根据数据包的序列号按序接收;
3)可以标识发送出去的数据包中, 哪些是已经被对⽅收到的; - 四次握⼿其实也能够可靠的同步双⽅的初始化序号,但由于第⼆步和第三步可以优化成⼀步,所以就成了三次握⼿
⽽两次握⼿只保证了⼀⽅的初始序列号能被对⽅成功接收,没办法保证双⽅的初始序列号都能被确认接收。
- 序列号是可靠传输的⼀个关键因素,它的作⽤:
- 3)避免资源浪费
- 两次握⼿会造成消息滞留情况下,服务器重复接受⽆⽤的连接请求 SYN 报⽂,⽽造成重复分配资源。
**「两次握⼿」:⽆法防⽌历史连接的建⽴,会造成双⽅资源的浪费,也⽆法可靠的同步双⽅序列号;
「四次握⼿」:三次握⼿就已经理论上最少可靠连接建⽴,所以不需要使⽤更多的通信次数 **
四次挥手
第一次挥手:
客户端打算关闭连接,此时会发送⼀个 TCP ⾸部 FIN 标志位被置为 1 的报⽂,也即 FIN 报⽂,之后客户端进⼊ FIN_WAIT_1 状态。
第二次挥手:
服务端收到该报⽂后,就向客户端发送 ACK 应答报⽂,接着服务端进⼊ CLOSED_WAIT 状态。
客户端收到服务端的 ACK 应答报⽂后,之后进⼊ FIN_WAIT_2 状态。
第三次挥手:
等待服务端处理完数据后,也向客户端发送 FIN 报⽂,之后服务端进⼊ LAST_ACK 状态
第四次挥手:
客户端收到服务端的 FIN 报⽂后,回⼀个 ACK 应答报⽂,之后进⼊ TIME_WAIT 状态
服务器收到了 ACK 应答报⽂后,就进⼊了 CLOSED 状态,⾄此服务端已经完成连接的关闭。
客户端在经过 2MSL ⼀段时间后,⾃动进⼊ CLOSED 状态,⾄此客户端也完成连接的关闭
针对 TCP 应该如何 Socket 编程?
服务端和客户端初始化 socket ,得到⽂件描述符;
服务端调⽤ bind ,将绑定在 IP 地址和端⼝;
服务端调⽤ listen ,进⾏监听;
服务端调⽤ accept ,等待客户端连接;
客户端调⽤ connect ,向服务器端的地址和端⼝发起连接请求;
服务端 accept 返回⽤于传输的 socket 的⽂件描述符;
客户端调⽤ write 写⼊数据;服务端调⽤ read 读取数据;
客户端断开连接时,会调⽤ close ,那么服务端 read 读取数据的时候,就会读取到了 EOF ,待处理完数据后,服务端调⽤ close ,表示连接关闭。
超时重传:
每当遇到⼀次超时重传的时候,都会将下⼀次超时时间间隔设为先前值的两倍。两次超时,就说明⽹络环境差,不宜频繁反复发送
快速重传:
快速重传的⼯作⽅式是当收到三个相同的 ACK 报⽂时,会在定时器过期之前,重传丢失的报⽂段。
SACK重传机制:
在 TCP 头部「选项」字段⾥加⼀个 SACK 的东⻄,它可以将缓存的地图发送给发送⽅,发送⽅就可以知道哪些数据收到了,哪些数据没收到,只重传丢失的数据
D-SACK 重传机制:
其主要使⽤了 SACK 来告诉「发送⽅」有哪些数据被重复接收了
D-SACK 有这么⼏个好处:
- 可以让「发送⽅」知道,是发出去的包丢了,还是接收⽅回应的 ACK 包丢了;
- 可以知道是不是「发送⽅」的数据包被⽹络延迟了;
- 可以知道⽹络中是不是把「发送⽅」的数据包给复制了
接收窗⼝和发送窗⼝的⼤⼩是相等的吗?
答:并不是完全相等,接收窗⼝的⼤⼩是约等于发送窗⼝的⼤⼩的。
因为滑动窗⼝并不是⼀成不变的。当接收⽅的应⽤进程读取数据的速度⾮常快的话,这样的话接收窗⼝可以很快的就空缺出来。新的接收窗⼝⼤⼩,是通过 TCP 报⽂中的 Windows 字段来告诉发送⽅。那么这个传输过程是存在时延的,所以接收窗⼝和发送窗⼝是约等于的关系。
TCP流量控制
滑动窗口
流量控制主要是可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量。
实现的方式,接收方会有一个接收缓冲区,如果内核接收到了数据,没有被应用读取的话,接收窗口就会收缩,然后会在tcp报文携带接收窗口的大小,发送方收到后,就会控制的发送流量。
TCP拥塞控制
什么是拥塞控制
网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏。在计算机网络中数位链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源。
TCP的四种拥塞控制算法
1.慢开始
一开始向网络注入的报文段少,然后根据接受方的反馈动态调整窗口大小,一般是2倍调整
2.拥塞避免
判断可能会出现拥塞, 线性增长窗口大小
3.快重传
1-尽快进行重传,而不等超时计数器超时再重传
2-收到3个连续的重复确认,立即重传
3-网络出现拥堵,拥塞窗口大小调整为1
4.快恢复
收到3个连续的重复确认后,快速恢复网络的传输效率,增大窗口的大小,避免启动慢开始算法
UDP
适合实时性要求高的场景
介绍一下TCP的三次握手和四次挥手
三次握手
1)(SYN):客户端发送SYN同步标志包,客户端请求建立连接,此时,客户端进入SYN_SENT状态
2)(SYN+ACK):服务端收到后客户端请求后,发送SYN和ACK包,服务器进入SYN_RECEIVED状态
3)(ACK):客户端收到服务器响应后,发送ACK标志的数据包,双方进入ESTABLISHED状态
四次挥手
1)(FIN):客户端发送FIN包给服务器,此时客户端进入FIN_WAIT1状态
2)(ACK):服务器收到客户端请求后,发送ACK标志数据包,服务器进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态
3)(FIN):服务器也发送FIN数据包,服务器进入LAST_ACK状态, 客户端仍然保持在FIN_WAIT_2状态。
4)(ACK):客户端收到服务器终止请求后,向服务器发送一个ACK数据包,客户端进入TIME_WAIT状态,
服务器收到客户端确认请求后,进入CLOSED状态
总结
在TIME_WAIT状态,客户端等待一段时间(通常为2倍的最长报文段寿命,即2MSL),以确保服务器收到最后一个ACK,并在必要时重传。完成等待时间后,客户端进入CLOSED状态,连接终止。
修正后的四次挥手过程中,客户端的状态顺序为:FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED。
介绍一下拥塞控制和流量控制
流量控制主要关注数据发送方和接收方之间的数据传输速率,以确保接收方能够有效处理接收到的数据。通过流量控制,发送方可以根据接收方的处理能力和可用缓冲区空间来控制数据发送的速率,避免数据丢失或缓冲区溢出。
拥塞控制和流量控制在网络中起着不同的作用:
- 拥塞控制是为了保护整个网络免受拥塞的影响,防止网络性能下降和数据丢失。它通过动态调整数据传输速率和窗口大小来适应网络负载,以确保网络的稳定性和可靠性。
- 流量控制是为了保护接收方免受数据过载的影响,确保接收方能够有效处理接收到的数据。它通过发送方和接收方之间的协商和反馈机制,调整数据发送速率和窗口大小,以保证接收方能够及时处理数据,避免数据丢失或缓冲区溢出。
拥塞控制的不足可能导致网络拥塞,从而影响流量控制的效果。流量控制的不足可能导致接收方无法及时处理数据,进而引发拥塞。
TCP的最大负载和最小负载有何意义
在TCP(传输控制协议)中,最大负载和最小负载是指TCP报文段中所携带的数据的大小的范围。最大负载表示一个TCP报文段中可以携带的最大数据量,而最小负载表示一个TCP报文段中可以携带的最小数据量。
这些值的意义如下:
- 最大负载:
- 网络应用程序通常将数据分割成较小的块,并使用TCP传输。最大负载定义了TCP报文段的最大数据量,这对应于网络应用程序一次性传输的最大数据量。
- 最大负载的限制由TCP协议和底层网络的最大传输单元(MTU)决定。MTU是指在网络中可以传输的最大数据块的大小。
- 确定最大负载的大小对于性能和吞吐量的评估很重要。较大的最大负载可以提高数据传输的效率,减少传输的开销。然而,如果数据块过大,可能会增加延迟和丢包的风险。
- 最小负载:
- 最小负载定义了TCP报文段的最小数据量,即报文段中必须包含的最小数据量。这是由TCP协议规定的,确保TCP连接的正常运行。
- 最小负载的大小通常很小,例如,在TCP报文段中至少要包含一个字节的数据。这个字节可以是控制信息、应用层协议的头部或其他必要的信息。
- 最小负载的定义是为了确保TCP连接的可靠性和稳定性,以及确保传输的数据按照正确的顺序传递。即使没有有效的应用层数据,TCP报文段仍然需要包含一些必要的信息。
最大负载和最小负载的定义对于TCP协议的实现和网络应用程序的设计都很重要。它们有助于限制数据块的大小,以适应网络传输的特性和要求,并确保TCP连接的正常运行。同时,根据具体的网络环境和应用需求,合理地设置最大负载和最小负载可以优化数据传输的效率和性能。
TCP 如何保证可靠?
- 应用数据的分段与重组:TCP 将应用层数据分割为合适大小的数据段,并在接收端将这些数据段重新组装成完整的应用数据。这样可以确保即使网络传输过程中发生丢包或乱序,TCP 也能正确重组数据,保证应用层接收到的数据与发送端一致。
- 序列号与确认机制:TCP 在每个数据段上添加序列号和确认号,用于标识数据段的顺序和确认收到的数据。接收端通过确认号告知发送端自己已成功接收到哪些数据段,发送端在接收到确认后才会发送下一批数据。如果发送端在一定时间内没有收到确认,则会重新发送相应的数据段,确保数据的可靠传输。
- 超时与重传机制:TCP 使用超时与重传机制来处理丢失的数据段。如果发送端发送了一个数据段但没有收到确认,它会假定该数据段丢失,然后在一定时间内等待确认。如果超过一定时间还没有收到确认,发送端会重新发送该数据段。接收端在接收到重复的数据段时会丢弃重复的数据。
- 流量控制与滑动窗口:TCP 使用滑动窗口机制来进行流量控制。发送端和接收端都有一个滑动窗口大小,用于限制发送和接收的数据量。接收端可以根据自身处理能力和可用缓冲区大小来调整滑动窗口的大小,告知发送端可以发送多少数据。这样可以避免发送端发送过多的数据导致接收端无法及时处理,从而实现流量控制和可靠性。
- 拥塞控制:TCP 通过拥塞控制算法来避免网络拥塞,并确保数据的可靠传输。拥塞控制算法根据网络的拥塞程度动态调整发送端的发送速率。当网络拥塞时,发送端会减小发送速率,防止进一步加剧拥塞。拥塞控制算法包括慢启动、拥塞避免和快重传等机制。
介绍一下OSI七层协议,各层协议都有哪些
应用层:DNS、 HTTP、 FTP
提供网络应用程序与用户之间的接口,实现特定的网络功能。
表示层: ASCII、JPEG、MPEG
处理数据的表示和编码,确保不同系统间的数据格式兼容性
会话层: SSH 、 TLS
建立、管理和终止会话(连接)
传输层:TCP,UDP
提供端到端的数据传输服务,确保数据可靠传输
网络层:IP、 ICMP
处理数据包的路由和转发,为数据包选择合适的路径
数据链路层: Ethernet、 Wi-Fi
提供可靠的数据传输,通过帧将数据分割成数据块
物理层:USB、光纤、RS-232
负责传输比特流,处理物理接口和传输媒介
TCP粘包和消息头
什么是粘包
1)数据大小不固定,多个小数据在接收端合并成一个大的
2)数据发送速率不同,接受端混合数据
3)发送接收的时候使用操作系统缓冲区
怎么解决粘包
1)定长消息
2)消息头部标识:根据头部划分消息
3)分割符分割消息
4)每个消息加上唯一的序列号,接收端使用序列号辨别
跨域问题
前后端分离的项目中,前端服务跑在8080端口,后端服务跑在9002端口,那么前端请求后端接口就会出现跨域问题,主要由于浏览器的同源策略隔离
1)使用Nodejs 代理,对8080端口下的前端请求进行代理,同时接受9002端口下的服务端响应
对称加密和非对称加密
对称加密:发送方和接收方使用相同的密钥来加密和解密数据,速度快,不安全AES,DES
非对称加密:使用一对密钥,公钥和私钥,公钥用于加密,私钥用于解密,速度慢,安全,发送方只需要知道接收方的公钥,而不需要知道私钥,rsa和ECC
UDP如何像TCP那样保证实时性
1)数据包的大小控制:TCP通常1500,UDP自己设计
2)抗丢包的设计,重复包的处理
3)实现自己的拥塞控制,可以通过调整发送速率或采用自适应的机制来适应网络状况。
4)差错处理,FEC前向纠错,FEC冗余包设计,超时重传,NACK机制
5)应用层协议设计,包括一些特定的压缩算法、数据包合并或其他优化。
HTTP报文的结束符是什么?HTTP报文格式
HTTP报文中的头部字段之间使用回车换行符(\r\n)分隔,报文头部和主体之间有一个空行(即两个回车换行符 \r\n\r\n)来表示头部的结束和主体的开始。HTTP 报文不需要显式的结束符来标志结束。
请求报文格式
:::info
请求方法 URL HTTP版本
请求头
空行
消息体
:::
响应报文格式
:::info
HTTP版本 状态码
响应头
空行
响应体
:::
三次握手
刚开始是closed状态客户端
1)客户端主动发送SYN包,进如SYN_SEND状态,
2)服务端收到包之后,回复ACK+SYN包,进入SYN_RECEIVED
3)客户端收到后,回复ACK
都确认对方请求后,三次握手连接建立,最终进入ESTABLISHED状态
前两次握手是不可以携带数据的,第三次握手可以
四次挥手
刚开始是ESTABLISHED状态
1)客户端发送连接断开的请求FIN包,进入FIN_WAIT_1状态
2)服务端收到后回复ACK,进入CLOSED_WAIT状态,此时还可以向客户端发送数据
客户端收到服务端发的ACK之后,进入FIN_WAIT2状态
3)服务端发完数据后,也发起了请求断开连接请求FIN,服务端进入LSAT_ACK状态
4)客户端收到后回复ACK,进入TIME_WAIT状态
服务端收到ACK后,进入CLOSED状态
客户端等待2MSL自动进入CLOSED状态,为了处理延迟包
流程控制和拥塞控制的区别
流量控制是端到端的,根据接收方的能力调整发送发送方的窗口
拥塞控制是全局的,根据整个网络的拥塞情况调整拥塞窗口
其实最终取了一个最小值
TCP和UDP客户端和服务端的过程
服务端:
1)创建套接字socket
2)绑定套接字bind
3)监听套接字listen
4)接受套接字accept
5) 开始收发
客户端:
1)创建套接字socket
2)绑定套接字bind
3)TCP:connect连接
UDP直接发
4)关闭套接字
三次握手
第一次握手:你向朋友打电话并说:“喂,我想和你通话,你能听到我说话吗?”这是你发起通话的请求,并等待朋友的回应。
第二次握手:朋友接听电话后,听到你的请求并回答:“是的,我能听到你说话,我们可以通话。”这是朋友回应你的请求,并表示愿意与你进行通话。
第三次握手:你收到朋友的回应后,再次回答:“好的,我们可以开始通话了。”这是你确认朋友的回应,并表示你准备好与朋友进行通话。
1)客户端发起SYN包,随机一个初始序列号
2)服务器收到后,发送ACK和SYN响应包,在客户端发送的序列号上+1,然后服务器发送随机的初始序列号
3)客户端收到ACK和SYN包后,回复一个ACK包,在服务器的序列号上+1
两次握手可以吗
不行
**客户端并没有确认服务器的初始序列号,因此连接的建立并不可靠 **
如果有恶意主机发送具有相同初始序列号的SYN包给服务器 , 服务器将无法区分是客户端发送的请求还是恶意主机发送的请求,从而可能导致连接建立错误。
如果网络情况非常好百分百不会发生拥塞,不会重传SYN,不会有历史连接的问题,可以两次握手吗?
不可以
在仅使用两次握手的情况下,攻击者可以伪造客户端请求并向服务器发送伪造的SYN包。服务器将接受该请求并发送确认包给攻击者,导致建立了一条无意义的连接。这种情况下,服务器将浪费资源和处理能力,而攻击者可以利用这种方式来进行拒绝服务攻击。
如何防止SYN攻击
1)端口过滤
2)利用防火墙,路由器过滤
3)加强TCP/IP协议栈
什么时候用tcp什么时候用udp
tcp:需要安全性,数据不丢,数据有序,数据量大分片传输
udp:需要实时性,数据量小,节省带宽
此时此刻的视频面试用的udp还是tcp
两者结合的RUDP,既有UDP的实时性,又有TCP的可靠性
udp丢包会有什么现象?
- 图像和声音的断续或卡顿
- 数据乱序
- 视频和音频质量下降
- 数据传输延迟
- 数据丢失
http和https的区别
- 安全性:
- HTTP是明文传输协议,数据在传输过程中不进行加密。这意味着数据可以被攻击者窃听和篡改,存在安全风险。
- HTTPS使用SSL(Secure Socket Layer)或TLS(Transport Layer Security)协议对数据进行加密传输。通过使用证书和密钥,HTTPS确保数据的机密性和完整性,提供更高的安全性。
- 端口号:
- HTTP使用默认的端口号80进行通信。
- HTTPS使用默认的端口号443进行通信。
- 证书:
- HTTPS需要使用数字证书来验证服务器的身份。证书由可信任的证书颁发机构(CA)签发,用于确保通信双方的身份验证和数据的完整性。
- HTTP不需要使用证书,通信双方的身份验证和数据的完整性无法得到保证。
- 使用场景:
- HTTP适用于对数据安全性要求不高的场景,如公开信息的传输,例如网页浏览、普通的数据传输等。
- HTTPS适用于对数据安全性要求较高的场景,如登录页面、支付页面、敏感信息传输等。
证书是绿色的是什么意思?
通常指的是浏览器地址栏中显示的网站安全标识。这个标识通常是一个绿色的锁形状或绿色的字母“https”,表示当前网站正在使用HTTPS协议进行安全加密通信。
自己随便编一个证书可以吗?需要去什么地方注册
不可以自己随意编写一个证书。证书的发行需要由可信任的证书颁发机构(CA)进行。证书颁发机构是经过认可和信任的第三方机构,负责验证和确认网站身份,并为其签发数字证书
百度搜索www.baidu.com到页面出现百度,这中间发生了什么
1)首先DNS通过这个域名解析到IP地址,本地缓存有直接返回,否则向上层DNS服务器发出查询请求
2)递归查询会依次向根域名服务器、顶级域名服务器(.com),权威域名服务器(baidu.com)发送查询请求,直到找到对应的IP地址
3)建立TCP连接,与目标服务器80( HTTP默认端口**)**端口建立连接
4)发送HTTP请求, 请求中的资源路径为 “/”,表示请求首页
5)服务器处理请求:服务器会查找并返回对应的资源
6)浏览器接受响应并开始渲染页面, 会解析HTML、CSS和JavaScript,并加载页面所需的资源
7)所有资源都加载完毕,用户就能看到百度的页面了
baidu.com默认用什么端口
HTTP的默认端口是80 , HTTPS使用的默认端口号是443
tcp四次挥手,可以合并为三次吗,一定可以吗
被动关闭方在接收到主动关闭方的FIN报文后,立即发出自己的FIN报文
在合并为三次挥手时,需要确保:
- 数据传输已经完成,双方都没有数据需要发送。
- 能够保证合并挥手不会导致乱序的问题,确保对方能够正确处理这种情况。
- 对方能够正确处理快速的关闭连接,而不依赖于等待TIME_WAIT状态的确认
接收/发送窗口,拥塞控制
窗口都是用来管理缓冲区的概念
接收窗口的大小表示接收方愿意接受的数据量
发送窗口的大小表示发送方可以发送的数据量
拥塞控制:拥塞控制通过动态调整发送窗口的大小来控制数据的发送速率
I/O多路复用
I/O多路复用(I/O Multiplexing)是一种高效处理多个I/O任务的机制,它允许一个单独的线程同时监听多个文件描述符(sockets或其他I/O事件),并在其中任何一个文件描述符就绪时进行相应的I/O操作。I/O多路复用的主要目的是提高系统的并发性和效率,减少对线程和进程的依赖
epoll
select最大连接数1024,poll能多一点,都是基于轮询的方式
epoll是基于事件驱动的,事件来了来通知