io模型
有哪些网络io模型?哪些网络操作可以是异步的?
常见的网络 IO 模型有:同步阻塞 IO,同步非阻塞 IO,多路复用 IO 和异步 IO。
异步网络操作包括:连接请求,数据发送和数据接收。(不确定)
select/poll/epoll
select/poll与epoll区别
-
select 和 poll 是两个系统调用,用于监视多个文件描述符,以检查它们是否准备好 I/O。
epoll 是 select 和 poll 的更高效替代方案,在 Linux 内核 2.6 中引入。它使用事件驱动方法监视文件描述符,提供更好的可扩展性和性能。 -
select、poll 和 epoll 主要的区别如下:
可扩展性:select 和 poll 对监视的文件描述符数量有限制,而 epoll 可以监视数以千计的文件描述符。
性能:epoll 比 select 和 poll 更快,特别是在监视大量文件描述符时。
监视模式:select 和 poll 的监视模式有限,而 epoll 提供多种监视模式,包括边缘触发和级别触发。
总体来说,epoll比select和poll更高效,更灵活,资源消耗更小,是一种更优秀的I/O多路复用机制。
- 其他补充(select和epoll对比):
原理不同:select是阻塞式的,每次调用都会重新遍历所有文件描述符;而epoll是非阻塞式的,它内部使用红黑树维护所有的文件描述符,每次调用只需要遍历发生变化的文件描述符。
效率不同:select的效率较低,因为它每次调用都需要重新遍历所有文件描述符;而epoll的效率较高,因为它内部使用红黑树维护所有的文件描述符,每次调用只需要遍历发生变化的文件描述符。
支持的文件描述符数量不同:select支持的文件描述符数量有限制,在不同的操作系统中限制不同;而epoll支持的文件描述符数量没有限制。
支持的事件类型不同:select支持读、写、异常事件;而epoll支持读、写、异常、边沿触发、水平触发等多种事件。
TUP/UDP
TCP三次握手,四次挥手,发送的包名,状态图,对应的POSIX API
-
TCP三次握手:
第一次握手:客户端发送SYN(Synchronize)请求,表示请求建立连接。
第二次握手:服务器收到请求后,发送SYN+ACK(Synchronize+Acknowledgment)应答,表示同意建立连接。
第三次握手:客户端收到应答后,发送ACK(Acknowledgment)确认,表示建立连接完成。 -
TCP四次挥手:
第一次挥手:客户端发送FIN(Finish)请求,表示请求结束连接。
第二次挥手:服务器收到请求后,发送ACK(Acknowledgment)应答,表示收到请求。
第三次挥手:服务器发送FIN(Finish)请求,表示请求结束连接。
第四次挥手:客户端收到请求后,发送ACK(Acknowledgment)确认,表示结束连接完成。 -
发送的包名:
SYN(Synchronize)请求
SYN+ACK(Synchronize+Acknowledgment)应答
ACK(Acknowledgment)确认
FIN(Finish)请求 -
状态图:
1.三次握手过程中,客户端和服务端的状态变化如下:
客户端:CLOSED -> SYN_SENT -> ESTABLISHED
服务端:CLOSED -> LISTEN -> SYN_RCVD -> ESTABLISHED
2.四次挥手过程中,客户端和服务端的状态变化如下:
客户端:ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED
服务端:ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED -
对应的POSIX API:
socket():创建套接字。(创建一个通信端点,为连接做准备)
bind():绑定套接字
listen():监听套接字。(服务器监听连接请求)
accept():接收连接请求。(服务器接受连接请求)
connect():发起连接请求。(客户端发起连接请求)
send()/recv():发送/接收数据
close():关闭套接字。(关闭连接)
TCP链接建立和断开的过程,状态转移
-
TCP 链接建立和断开的过程如下:
1.建立连接:
客户端发送 SYN 报文,表示请求建立连接。
服务端收到 SYN 报文,回复 ACK 和 SYN 报文,表示同意建立连接。
客户端收到 ACK 和 SYN 报文,回复 ACK 报文,表示确认连接建立。
2.断开连接:
一方发送 FIN 报文,表示请求断开连接。
另一方收到 FIN 报文,回复 ACK 报文,表示同意断开连接。
发送 FIN 报文的一方再次回复 ACK 报文,表示确认连接断开。 -
TCP 连接状态转移如下:
CLOSED:未建立连接状态。
SYN_SENT:客户端已发送 SYN 报文,等待服务端回复。
SYN_RCVD:服务端已收到 SYN 报文,等待客户端回复 ACK。
ESTABLISHED:连接建立成功,可以进行数据传输。
FIN_WAIT_1:客户端已发送 FIN 报文,等待服务端回复 ACK。
FIN_WAIT_2:服务端已回复 ACK,等待服务端发送 FIN。
TIME_WAIT:等待足够时间以确保所有数据已传达,然后进入 CLOSED 状态。
CLOSE_WAIT:服务端已发
SYN Flood攻击,防御措施
-
SYN Flood 攻击(SYN洪水攻击、半开连接攻击):这是一种 DDoS 攻击,利用 TCP 连接序列(“三次握手”)的弱点,向目标系统发送大量 SYN 请求,使其无法处理合法请求。(攻击者将可击垮目标服务器计算机上的所有可用端口,导致目标设备在响应合法流量时表现迟钝乃至全无响应。)
-
首包丢弃和源认证两种手段结合,对于防御SYN Flood(特别是不断变换源IP和源端口的虚假源攻击)非常有效。
通常情况下客户端发送SYN报文后如果在一定时间没有收到服务器的SYN-ACK应答,客户端会重新发送SYN报文。Anti-DDoS系统会丢弃掉收到的第一个SYN报文。SYN Flood攻击时,黑客发送的绝大多数是变源的SYN报文,所有的SYN报文对于Anti-DDoS系统来说都是首包,都将被直接丢弃。如果客户端重传了SYN报文,Anti-DDoS系统再对该报文进行源认证。如此一来,大大减少了Anti-DDoS系统代答的压力。 -
补充:源认证和首包丢弃
源认证
Anti-DDoS系统拦截客户端发送的SYN报文,代替服务器向客户端发送SYN-ACK报文,如果客户端不应答,则认为该客户端为虚假源;如果客户端应答,则Anti-DDoS系统认为该客户端为真实源,并将其IP地址加入白名单,在一段时间允许该源发送的所有SYN报文通过,也不做代答。
首包丢弃
如果Anti-DDoS系统代替服务器应答了所有的SYN Flood攻击报文,那么性能瓶颈仅仅是从服务器转移到了Anti-DDoS系统而已。一旦Anti-DDoS系统的系统资源耗尽,攻击依旧会透传到服务器,而且大量反弹的SYN-ACK报文也会对网络造成一定的压力。Anti-DDoS系统利用首包丢弃来解决这个问题
TCP和UDP区别?TCP如何保证可靠性?对方是否存活(心跳检测)?
-
TCP和UDP区别:
TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层协议。它保证数据的可靠传输,并且提供流量控制和拥塞控制。
UDP(User Datagram Protocol)是一种无连接的、不可靠的、基于数据包(报文)的传输层协议。它不保证数据的可靠传输,没有流量控制和拥塞控制。
其他补充:
TCP是面向连接的协议,保证数据的可靠传输。UDP是面向无连接的协议,不保证数据的可靠性。
TCP是流式协议,把数据分成多个数据报,并且保证每个数据报都能到达对方。UDP是数据报协议,不保证数据的顺序。
TCP的传输速度比UDP慢,因为TCP需要处理更多的握手和确认信息。
TCP是适用于需要长连接的应用,如文件传输、电子邮件等。UDP是适用于需要快速传输的应用,如语音、视频等。 -
TCP如何保证可靠性:
除了三次握手保证可靠性外;
通过确认机制,确保数据能够到达对方。
通过重传机制,确保数据能够准确传输。
通过滑动窗口机制,确保数据能够快速传输。
或者回答(推荐):
数据校验:通过数据校验确保数据的完整性。
流量控制:通过滑动窗口机制避免接收方缓存溢出。
重传机制:如果发送方发现数据丢失,会重传丢失的数据。
拥塞控制:通过慢启动、拥塞避免等算法避免网络拥塞。 -
对方是否存活(心跳检测):
可以通过发送心跳消息来检测对方是否存活。如果一段时间内没有收到心跳消息,则判断对方不存在。这样可以确保连接的实时性。(心跳检测通常由应用层实现,不是TCP协议的一部分。)
TCP中的流量控制原理
TCP 中的流量控制是通过维护发送窗口来实现的。发送窗口是一个数字,表示发送方可以发送的最大字节数。接收方根据自己的缓存情况通过 ACK 报文告诉发送方可以接收的数据量。发送方根据接收到的 ACK 报文动态调整发送窗口,以保证数据不会被缓存过多。
TCP的拥塞控制原理?实现拥塞控制的主要算法有哪些?
-
TCP 的拥塞控制原理是通过监测网络中数据包丢失和延迟情况来评估网络拥塞程度,并调整发送窗口大小来降低网络拥塞。
(或者:通过监测网络状况,动态调整发送窗口,以保证网络的有效利用,避免网络拥塞。) -
常见的 TCP 拥塞控制算法有(4种):
快速重传:当发现数据包丢失时,快速重传算法立即重新发送丢失的数据包。
快速恢复:当发现数据包丢失时,快速恢复算法通过减小发送窗口大小来降低网络拥塞。
慢启动:慢启动算法通过慢慢增加发送窗口大小来确保网络稳定。
拥塞避免:拥塞避免算法通过监测网络状况,并在发现拥塞时减小发送窗口大小,以降低网络拥塞。
UDP能保证数据包顺序吗?
UDP怎么实现TCP的拥塞控制?
-
不能。UDP是面向无连接的协议,不像TCP那样有确认机制和重传机制,所以不保证数据的顺序。UDP数据报的接收顺序可能与发送顺序不同,因为UDP不保证数据的可靠性。
如果需要保证数据包的顺序,可以使用TCP协议。或者如果需要保证数据包的顺序,需要在应用层自己处理。 -
UDP不支持拥塞控制,因为它是一种无连接的协议。如果需要拥塞控制,可以使用TCP或者在应用层上实现自己的拥塞控制算法。
TCP的timeout状态含义,怎么避免timeout?TIME-WAIT()状态下的等待时间是多少?为什么(即TIME_WAIT的作用)?
四次挥手中,TIME-WAIT状态是在哪一步?
-
TCP timeout 状态:在传输数据时,如果一段时间内未收到对方的 ACK 确认,则认为该数据已经丢失,将重新发送该数据。(指在数据传输过程中,由于网络故障或其他原因,导致TCP连接失效,而进入超时状态。)
-
避免 timeout:
增加 timeout 时间,但这会增加网络的延迟。
增加数据的重发次数,但这会增加网络的流量。
使用更高效的网络协议,如 TCP-SACK、TCP-FACK 等。 -
TIME-WAIT 状态下的等待时间是 2 MSL(Maximum Segment Lifetime),通常为 2 分钟(TCP协议规定,在TIME-WAIT状态下,系统需要等待2倍的最大报文生存时间)。该状态等待时间是为了确保发送方的最后一个数据包已经被对方接收,避免未接收的数据包被误判为新的数据包。
-
TIME-WAIT状态是在四次握手的第四步。
计算机网络结构
OSI七层?TCP/IP五层?
-
OSI 七层模型:
物理层:描述网络的物理设备,如网络接口卡、电缆等。
数据链路层:负责数据的传输和错误检测。
网络层:负责数据的路由和网络地址分配。
传输层:负责数据的传输,并且提供可靠的数据传输服务。
会话层:负责数据传输的同步和管理。
表示层:负责数据的编码和解码。
应用层:负责应用程序与网络间的通信。 -
TCP/IP 五层模型:
物理层:与 OSI 模型的物理层相同。
数据链路层:与 OSI 模型的数据链路层相同。
网络层:与 OSI 模型的网络层相同。
传输层:与 OSI 模型的传输层相同。
应用层:合并了 OSI 模型的会话层、表示层和应用层。
计算机网络的七层结构、五层结构、四层结构?
http、tcp分别属于哪一层?
计算机网络体系结构分为3种:OSI体系结构(七层),TCP/IP体系结构(四层),五层体系结构。
- OSI体系结构(七层): 概念清楚,理论也比较完整,但是它既复杂又不实用。
- TCP/IP体系结构(四层):TCP/IP是一个四层体系结构,得到了广泛的运用。
- 五层体系结构:为了方便学习,折中
OSI体系结构
和TCP/IP体系结构
,综合二者的优点,这样既简洁,又能将概念讲清楚。
HTTP 属于应用层,是一种应用层协议,负责在 Web 上进行数据传输。
TCP 属于传输层,是一种传输层协议,负责提供可靠的数据传输服务。
http与https的区别?https的加密方式?
- HTTP 和 HTTPS 的区别:
1.安全性:HTTP 是明文传输,不安全;HTTPS 则使用 SSL/TLS 加密,提供安全性。
2.端口号:HTTP 的默认端口号是 80;HTTPS 的默认端口号是 443。
3.证书:HTTPS 需要使用数字证书,证明网站的合法性。 - HTTPS 加密方式:
HTTPS 使用 SSL/TLS 协议进行加密,其中 SSL(Secure Sockets Layer)是一种网络安全协议,TLS(Transport Layer Security)是 SSL 的继任者。
它们使用对称加密、非对称加密和散列算法等技术,保证数据在传输过程中不被窃取和篡改。
HTTP状态码有哪些
- HTTP 状态码分为 5 个类别:
1xx:信息性状态码,表示接收到请求并继续处理。
2xx:成功状态码,表示请求已成功处理。常见的有 200 OK、201 Created 等。
3xx:重定向状态码,表示需要进一步操作以完成请求。常见的有 301 Moved Permanently、302 Found 等。
4xx:客户端错误状态码,表示客户端请求有语法错误或请求无法实现。常见的有 400 Bad Request、401 Unauthorized 等。
5xx:服务器错误状态码,表示服务器无法完成对请求的处理。常见的有 500 Internal Server Error、503 Service Unavailable 等。
- 常见的 HTTP 状态码:
200 OK:请求成功。
201 Created:请求成功,并创建了新的资源。
204 No Content:请求成功,但没有返回任何内容。
301 Moved Permanently:请求的资源已永久移动到新位置。
302 Found:请求的资源临时移动到新位置。
304 Not Modified:请求的资源未改变,可以使用缓存。
400 Bad Request:请求错误,请求包含语法错误。
401 Unauthorized:请求未授权,需要用户验证。
403 Forbidden:请求被禁止,禁止访问。
404 Not Found:请求的资源不存在。
500 Internal Server Error:服务器内部错误。
GET 和 POST的区别?本质区别?
-
本质区别
GET 和 POST是HTTP协议中的两种请求方法,GET 和POST 方法没有本质区别,仅报文格式不同。GET请求用于获取资源,而POST请求用于向服务器发送数据,如用户输入。
GET:GET 是一种用于从服务器检索数据的 HTTP 方法。当您在网页浏览器中输入 URL 时,浏览器会向服务器发送一个 GET 请求,请求指定的资源。
POST:POST 是另一种用于向服务器发送数据以进行处理的 HTTP 方法。与 GET 不同,POST 请求可以在请求体中包含数据,这允许进行更复杂的操作,例如提交表单。 -
区别:
get比post更快(原因见下)
post发送的数据更大(get有url长度限制)
post能发送更多的数据类型(get只能发送ASCII字符)
post更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中) -
为什么get比post更快?
1.post请求包含更多的请求头
2.最重要的一条,post在真正接收数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据
3.get会将数据缓存起来
子网掩码的作用?
子网掩码是一个32位地址,是与IP地址结合使用的一种技术。 它的主要作用有两个,一是用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。 二是用于将一个大的IP网络划分为若干小的子网络。 使用子网是为了减少IP的浪费。
常见的网络协议有哪些?
说一下DNS协议常见网络协议
-
常见的网络协议
TCP/IP
HTTP
FTP
SMTP
DNS
DHCP
IPsec
SSL/TLS -
DNS是一种可以将域名和IP地址相互映射的以层次结构分布的数据库系统。DNS系统采用递归查询请求的方式来响应用户的查询,为互联网的运行提供关键性的基础服务
网络编程
socket函数介绍? socket编程介绍? socket 基础 API 的使用?
-
socket 函数是用于创建网络套接字的函数,套接字是网络编程的基础。
-
socket 编程是一种网络编程方式,用于在两台计算机之间进行通信。它通过使用套接字实现,以通过网络发送和接收数据。
-
基础 socket API 包括:
socket():创建套接字
bind():将套接字与特定的 IP 地址和端口号绑定
listen():监听套接字,等待连接请求
accept():接受客户端连接请求
connect():连接到服务器套接字
send():向连接的客户端发送数据
recv():从连接的客户端接收数据
close():关闭套接字
这些 API 函数通常用于创建网络客户端和服务器程序。
reactor模式和preactor模式区别
-
(答案一)Reactor模式是基于同步I/O的,而Proactor模式基于异步I/O相关的。
在Reactor模式中,事件分离者等待某个事件或者可应用或个操作的状态发生(比如文件描述符可读写,或者是socket可读写),等待后,分离者就把这个事件传给事先注册的事件处理函数或者回调函数,由后者来做实际的读写操作。
而在Proactor模式中,事件处理者(或者代由事件分离者发起)直接发起一个异步读写操作(相当于请求),而实际的工作是由操作系统来完成的。发起时,需要提供的参数包括用于存放读到数据的缓存区,读的数据大小,或者用于存放外发数据的缓存区,以及这个请求完后的回调函数等信息。事件分离者得知了这个请求,它默默等待这个请求的完成,然后转发完成事件给相应的事件处理者或者回调。
这种异步模式的典型实现是基于操作系统底层异步API的,所以我们可称之为“系统级别”的或者“真正意义上”的异步,因为具体的读写是由操作系统代劳的。 -
(答案二)Reactor 模式和 Proactor 模式是两种不同的 I/O 多路复用技术。
Reactor 模式:在 Reactor 模式中,程序等待事件的到来,并在事件到达时执行相应的处理。它是一种同步 I/O 模型,因为它只能在事件到达时执行处理。
Proactor 模式:Proactor 模式是一种异步 I/O 模型,它允许程序在不等待事件到达的情况下继续执行。在 Proactor 模式中,操作系统通知程序事件已完成,而不是等待程序询问事件的状态。
总的来说,Reactor 模式适用于单线程环境,而 Proactor 模式适用于多线程环境。