网络部分常见问题

目录

OSI七层模型和五层模型分别是什么?每层的功能是什么?

TCP和UDP协议的特性和区别

三次握手

为什么需要三次握手,两次不行吗?

如果纯ACK不需要确认,那如果丢了怎么办

 SYN攻击是什么?

四次挥手

 四次挥手释放连接时,等待2MSL的意义?

 确认应答机制

滑动窗口机制

流量控制机制

五种高级IO模型

epoll中LT模型和ET模式的区别

 三种典型多路转接IO的优缺点,以及使用场景


OSI七层模型和五层模型分别是什么?每层的功能是什么?

五层模型分为:应用层、传输层、网络层、数据链路层和物理层。其中

  1. 应用层:各种应用软件,产生应用层数据。HTTP、FTP、DNS
  2. 传输层:负责端与端之间的数据传输。TCP、UDP
  3. 网络层:IP地址管理和路由选择,以确保它们能够从源主机到目标主机进行传输;IP协议,典型设备:路由器
  4. 数据链路层:提供点对点的数据传输服务,负责相邻设备之间的传输。以太网协议,交换机
  5. 物理层:负责在物理媒介上传输原始比特流,光电信号转换

七层模型分为:应用层、表示层、会话层、传输层、网络层、数据链路层和物理层:

  1. 表示层:数据格式的表示,基本压缩加密功能
  2. 会话层:会话层管理应用程序之间的通信会话,负责建立、维护和终止会话。

TCP和UDP协议的特性和区别

 UDP协议具有无连接、不可靠、面向数据报的特点,而TCP是面相连接、可靠传输、面向字节流的。具体来说:UDP协议双方在发送数据前不需要沟通对端是否能正常通信,只需知道对端的IP和端口就可以发送数据;而TCP协议双方在发送数据前会建立连接,确保对端能正常通信,同时沟通双方发送后续数据的细节。UDP不保证数据是可靠、有序的到达对端;而TCP保证数据可靠、有序的到达对端。UDP协议调用接口与应用层或网络层递交数据时以单条数据组织数据报(不会合并数据);而TCP协议会将数据放入对应的缓冲区,对于传输的数据没有明显的边界,对接收方而言可以按照任意字节进行接收。

三次握手

三次握手是为了确认双方的接收和发送能力是否正常,同时指定双方的初始化序列号并约定最大报文段长度MSS,为后面的可靠性传输做准备;

具体流程:

  1. 第一次握手:客户端向服务端发送一个SYN报文(链接发起数据报),此时客户端处于SYN_SENT状态。此报文syn标志位设为1,并设置客户端初始化序列号为n。
  2. 第二次握手:服务端向客户端发送一个SYN+ACK报文(连接发起并确认的数据报),此时服务端处于SYN_RCVD状态(此时操作系统为该TCP连接分配TCP缓存与变量)【服务器端在第二次握手时分配资源,客户端在第三次握手时分配资源】。此报文syn和ack标志位设为1,同时也设置服务端初始化序列号x,确认号ack=n+1;
  3. 第三次握手:客户端向服务端发送ACK报文(确认数据报),此时服务端处于ESTABLISHED状态;服务端收到ACK报文后也处于ESTABLISHED状态。此报文ack标志位设为1,同时序列号seq=n+1,确认号ack=x+1;纯ACK报文不消耗序列号,下一次发送报文还是用这个序列号。

 

Ps:MSS(最大报文段长度,可以理解为有效载荷的最大值)

IP头部+TCP头部+有效载荷/MSS <= MTU

MTU(最大传输单元):46 <= MTU <= 1500

为什么需要三次握手,两次不行吗?

 

三次握手的目的是为了确认双方的接收和发送能力是否正常,第一次握手验证了客户端的发送和服务端的接收正常,第二次握手验证了服务端的发送正常,但站在服务端的角度看并不确定客户端是否收到了SYN+ACK报文,因此并不能确认客户端的接收是否正常。所以需要第三次握手,才能得出双发的接收和发送能力正常的结论。

同时阻止重复历史连接,例如:A发送一个请求连接报文因为网络问题长时间滞留,到第二次连接通信释放连接后才到B,这是一个失效的请求连接报文,此时B以为是A发送的新的请求连接,于是发出确认字符,如果没有三次握手,该连接建立,但是A并没有发出请求连接,所以B就会一直等待A发送确认字符,这样B等了很久,白白浪费B的资源。

如果纯ACK不需要确认,那如果丢了怎么办

 此时客户端处于ESTABLISHED状态,可以像服务端发送数据,例如发的第一个数据报的类型其实是PSH+ACK,同样有确认的作用,然后让服务端连接建立完成。

 SYN攻击是什么?

服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击。客户端在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。

在 Linux/Unix 上可以使用系统自带的 netstat 命令来检测 SYN 攻击

Ps: SYN-ACK 重传次数的问题:服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传。如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。

四次挥手

  1. 第一次挥手:主动断开连接方发送FIN报文,此时主动断开连接方处于FIN_WAIT_1状态,等待被动断开连接方确认。
  2. 第二次挥手:被动断开连接方发送ACK报文,此时被动连接方处于CLOSE_WAIT状态。主动断开连接方收到确认后,进入FIN_WAIT2状态,等待被动断开连接方发送的连接释放报文。此时的TCP处于半关闭状态,主动断开连接方到被动断开连接方的连接释放。
  3. 第三次挥手:被动断开连接方没有要发送的数据时,被动断开连接方发送FIN报文,此时被动连接方处于LAST_ACK状态,等待主动连接方确认。
  4. 第四次挥手:主动断开连接方发送ACK报文,此时主动断开连接方处于TIME_WAIT状态,等待2MSL时间以确保服务器收到ACK报文后变为CLOSED状态。被动断开连接方收到确认后,变为CLOSED状态。

 

 四次挥手释放连接时,等待2MSL的意义?

 为了确保主动断开连接方第四次挥手的ACK报文能够到达被动断开连接方,等待2MSL的时候,如果由于网络等一系列原因产生了丢包,1MSL时间内被动断开连接方会超时重传FIN报文,因此等待2MSL时间以保证第四次挥手的ACK报文能够到达被动断开连接方。

 确认应答机制

 在三次握手建立连接时,连接双方会约定数据的初始序列号,在后续的数据传输时,TCP会给传输数据的每个字节编号,接收方通过确认序号,在ACK报文中告诉发送方期望下一个发送数据的序号(隐含意思就是这个序号之前的数据都收到了)。从而保证数据可靠有序的到达对端。

滑动窗口机制

由于TCP采用确认应答机制,需要等待对端的确认应答报文,如果发一个报文就要等待确认,效率太低。滑动窗口机制允许TCP发送方将发送缓冲区(环形队列)窗口内的多组数据(组成多个TCP数据包)发送到网络,并行传递而暂时不需要立即确认。

如果中间发生数据丢包,接收方会给发送方恢复3次重复的确认应答(这三个ACK的ack=丢包数据的起始序号),发送方收到后,触发快重传,重传该报文。

流量控制机制

TCP考虑传输效率问题,除了从自身发送数据量考虑,还需要考虑对方的接收能力以及网络的转发能力。因此TCP还采用流量控制机制动态改变滑动窗口的大小,从而控制发送的数据量。TCP头部16位窗口大小包含接收缓冲区的接受能力(缓冲区大小),同时发送方还维护了拥塞窗口来探测网络的转发能力,发送方根据接收方的ACK报文返回的窗口大小和自身维护的拥塞窗口大小,来动态调整滑动窗口大小。

五种高级IO模型

 

IO的过程是在内核当中的过程,分为两步:等待和拷贝数据。

阻塞IO:在内核将数据准备好之前,系统调用会一直等待。

非阻塞IO:如果内核还未将数据准备好,系统调用会直接返回,并返回EWOULDBLOCK错误码(EWOULDBLOCK 就是EAGAIN)阻塞IO需要搭配循环的方式反复尝试读写文件描述符,然而轮循对于CPU来说是巨大的浪费,只有在特定场景才使用。

信号驱动IO:内核将数据准备好的时候,使用SIGIO信号通知应用程序进行IO操作。

IO多路转接:能同时循环监听多个文件描述符的就绪状态。IO多路转接属于阻塞IO,但可以对多个文件描述符进行阻塞监听,所以效率较阻塞IO高

异步IO:由内核在数据拷贝完成后,通知应用程序处理数据(而信号驱动是告诉应用程序去拷贝数据(举例调用recv函数))。当应用程序调用aio_read时,将等待和数据拷贝的任务交给内核,而程序控制权仍然在应用进程,应用进程继续处理其他事情,是一种非阻塞的状态;当内核在数据拷贝完成后,通知应用程序去处理数据。(异步IO是拷贝好了你去处理数据吧,信号驱动IO是数据来了,你去拷贝数据吧)。

epoll中LT模型和ET模式的区别

 

epoll默认为水平触发模式,在水平触发模式下epoll监测到socket上事件就绪,可以不立即进行处理或只处理一部分,下一次调用epoll_wait时会立即返回并通知socket事件就绪,知道缓冲区数据被处理完,epoll_wait才不会立即返回。

设置epoll为边缘触发模式后,当epoll监测到socket上事件就绪时,之后立即通知一次,无论缓冲区数据是否被处理完,下一次调用epoll_wait的时候都不会立即返回。

水平模式支持阻塞读写和非阻塞读写,而边缘触发模式只支持非阻塞读写

 三种典型多路转接IO的优缺点,以及使用场景

 

select的优缺点:

优点:

  1. 跨平台,在windows和Linux平台下都可以使用。
  2. Select的超时事件可以精确到微秒

缺点:

  1. Select监控文件描述符的时候,采用轮循遍历的方式,监控的文件描述符越多,监控效率越低
  2. Select的文件描述符的个数是有上限的,Linux下最多为1024个
  3. 只是返回就绪文件描述符的事件集合,具体哪些文件描述符就绪了需要调用者使用FD_ISSET函数判断。效率低。

poll的优缺点:

优点:

  1. 提出事件结构的方式,给poll函数传递参数的时候不需要分别添加读写或异常事件集合了
  2. 事件结构数组大小可以根据程序员自己定义,监控的文件描述符没有上限的要求

缺点:

  1. 不支持跨平台
  2. 内核对事件结构数组的监控依然采用轮循遍历的方式,效率低。

epoll的优点:

  1. IO效率不随监控的文件描述符的增加而线性下降,监控效率高
  2. 返回已发生事件的事件结构数组,方便判断哪些文件描述符的事件就绪。
  3. 文件描述符的监控数量没有明确限制。
  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值