八股文-0905

知识列表

  1. 如何保证UDP数据包传输的有序性
  2. 为什么连接的时候需要三次握手,关闭的时候却是四次握手
  3. 为什么要三次握手,不能两次吗
  4. 长连接是如何维持的,心跳机制,如果一直想要连接怎么办
  5. 第一次握手可以传输数据吗
  6. 超时重传如何实现?超时重传怎么确定
  7. TCP CLOSE_WAIT 状态还能收到报文吗
  8. 两个服务器之间可以同时建立多条TCP连接吗?怎么实现
  9. Linux内核收包流程
  10. 本机向本机发送请求,IP 填 127.0.0.1 和网卡 ip 地址有区别吗
  11. TCP粘包,如何解决
  12. 滑动窗口过大怎么样,过小怎么样
  13. 什么是流控制?如何在TCP中实现
  14. Nagle
  15. UDP
  16. TIME_WAIT状态时间为什么是2MSL?
  17. MTU
  18. IPV4与IPV6
  19. NAT
  20. IP分片
  21. ICMP
  22. 防止ARP攻击
  23. TCP 的序列号机制

1.如何保证UDP数据包传输的有序性

  1. 序列号机制发送方,在发送数据包时,为每个数据包添加一个唯一的序列号,序列号从0开始,每发送一个数据包序列号+1接收方,接收到数据包后,检查序列号以确定数据包的顺序。如果数据包按序到达,则将其交给应用层处理;如果数据包乱序,则将其存入重排序缓冲区,等待缺失的数据包到达后再按序处理

2.重排序缓冲区序

接收方:维护一个重排缓冲区,用于缓存乱序到达的数据包,接收方会检查数据包的序列号,将其插入到正确的位置,如果发现有缺失的数据包,则等待缺失的数据包到达后再按序处理

3.ACK确认机制

接收方:在接收到数据包后,发送一个ACK确认包给发送方,包含已成功的最高序列号。发送方根据ACK确认包判断哪些数据已被接收,哪些数据包需要重传

4.丢包重传机制

发送方:如果在一定时间内没有收到接收方的ACK确认包,则认为数据包可能丢失,发送方会重传未确认的数据包,以确保接收方能够接收到所有的数据包

2.为什么连接的时候需要三次握手,关闭的时候却是四次握手

三次握手是为了建立连接,确保双方都有能力进行数据传输,防止历史的重复连接的请求。确保双方都知道对方的初始序列号,以便后续的数据传输能够正确的进行序列控制和确认。

四次挥手是为了可靠地关闭连接,确保双方都能完成各自的数据传输和处理,并释放资源

(1)三次握手的原因:

1)防止重复连接:通过三次握手,双方都能确认对方已经准备好通信,防止历史的重复连接请

求影响当前连接。

2)确保双方都能接收和发送:三次握手确保双方都能接收和发送数据,建立可靠的全双工连接。

(2)四次挥手的原因:

1)半关闭状态:TCP 连接是全双工的,双方都可以独立关闭自己的发送和接收通道。四次挥手

可以实现这种半关闭状态,确保双方都能完成各自的数据传输。

2)可靠释放资源:通过四次挥手,确保双方都能可靠地释放连接资源,避免资源泄露和重复释

放的问题。

3.为什么要三次握手,不能两次吗

三次握手确保客户端和服务器都知道的连接,并且确认彼此的接收和发送能力。

两次握手无法确保双方都确认了连接的存在和彼此的状态,可能导致旧的连接请求被误认为新的连接

(1)三次握手的必要性:

1)第一次握手:客户端发送一个 SYN 包到服务器,表示希望建立连接,并告诉服务器客户端

的初始序列号。

2)第二次握手:服务器收到 SYN 包后,回复一个 SYN+ACK 包,表示同意建立连接,并告诉

客户端服务器的初始序列号和确认客户端的序列号。

3)第三次握手:客户端收到 SYN+ACK 包后,再发送一个 ACK 包给服务器,表示确认收到服

务器的 SYN 包,连接建立。

(2)两次握手的问题:

1)旧连接请求问题:如果使用两次握手,旧的连接请求(可能因为网络延迟而滞留的 SYN 包)

可能被误认为是新的连接请求,从而导致连接状态的不一致。

2)确认机制不足:两次握手无法确保双方都确认了连接的存在。例如,客户端发送 SYN 包后

崩溃重启,服务器可能仍然认为连接存在,而客户端已经不再维护这个连接。

(3)三次握手的优点:

1)确认双方状态:三次握手能够确保双方都确认了彼此的接收和发送能力,确保连接的可靠性。

2)避免旧连接误判:通过三次握手,可以避免旧的连接请求被误认为是新的连接。

4.长连接是如何维持的,心跳机制,如果一直想要连接怎么办

  1. 保持长连接的方法:
    1. 定期发送心跳包:设置定时器,定期发送心跳包,保持连接活跃
    2. 连接超时检测:设置合理的超时时间,检测连接状态,及时进行重连操作
    3. 资源管理:确保系统资源合理分配,避免长时间保持大量连接导致资源耗尽
  2. 长连接的维持: 1)应用场景:长连接广泛应用于需要频繁通信的场景,如即时通讯、在线游戏、实时数据传输等。2)保持连接:通过长连接,可以减少连接建立和关闭的开销,提高通信效率。3)资源管理:在保持长连接的同时,需要合理管理系统资源,避免长时间保持大量连接导致资源耗尽。
  3. 心跳机制
    1. 心跳包(PING):客户端和服务器之间定期发送心跳包,以检测连接状态,确保连接在空闲依然保持活跃
    2. 心跳回应(PONG):接收方收到心跳包,立即发送心跳回应,通知发送方连接状态正常
    3. 超时检测:如果发送方未能在规定时间内接收到心跳回应,则认为连接已断开,进行重连操作

5.第一次握手可以传输数据吗

  1. 第一次握手不能传输数据的原因:
    1. 连接未完全建立:在第一次握手时,连接尚未建立,服务器还未确认客户端的连接请求
    2. 缺乏确认机制:在第一次握手时,客户端无法确定服务器是否已收到SYN包,无法保证数据的可靠传输
    3. 安全性考虑:如果在第一次握手时传输数据,可能导致旧的连接请求(例如网络延迟导致的滞留SYN包)被误认为新的连接,造成数据传输混乱
  2. 数据传输的时机: 1)第三次握手之后:数据传输通常在第三次握手之后进行,因为只有此时连接才被完全建立,双方都确认了彼此的接收和发送能力。 2)连接建立:在三次握手完成后,客户端和服务器之间的连接被正式建立,数据可以在此基础上进行可靠传输。

6.超时重传如何实现?超时重传怎么确定

1)超时重传:在 TCP 协议中,如果发送方在预定的时间内没有收到接收方的确认(ACK),

则会认为数据包可能丢失,并重传该数据包。

2)超时重传时间(RTO):重传超时时间是根据往返时间(RTT)的测量和估计来确定的。通

过动态调整 RTO,TCP 能够适应网络状况的变化,确保可靠传输。

(1)RTT 测量和 RTO 计算:

1)RTT 测量:在发送数据包并接收到 ACK 后,测量往返时间(RTT)。

2)SRTT 计算:使用加权平均算法计算平滑 RTT 估计值(SRTT)。

3)RTT 方差计算:计算 RTT 的变化幅度(RTT_variance)。

4)RTO 计算:根据 SRTT 和 RTT_variance 计算重传超时时间(RTO)。

(2)超时重传的实现:

1)发送数据包:发送数据包并启动计时器。

2)等待 ACK:在预定时间内等待 ACK 确认。

3)超时重传:如果未收到 ACK,在 RTO 超时时间到达后重传数据包,并重新启动计时器。

(3)动态调整 RTO:

1)RTT 变化:随着网络状况变化,RTT 和 RTT_variance 会动态变化。

2)调整 RTO:根据最新的 RTT 测量和估计,动态调整 RTO,以适应当前的网络状况。

7.TCP CLOSE_WAIT 状态还能收到报文吗

CLOSE_WAIT状态表示一方已收到对方的FIN包(关闭请求),并发送了ACK包(确认关闭),等待自身的应用层决定何时关闭。在CLOSE_WAIT状态下,仍然可以接受数据。TCP连接在接收到FIN包并回复ACK包后,仍然可以接收数据,直到应用层调用close关闭连接

(1)CLOSE_WAIT 状态:

当 TCP 连接中的一方(如客户端)发送 FIN 包请求关闭连接,另一方(如服务器)在接收到 FIN

包后,会发送 ACK 包确认收到关闭请求,并进入 CLOSE_WAIT 状态。在 CLOSE_WAIT 状态下,接

收方的连接并未完全关闭,仍然可以接收来自发送方的数据包。

(2)继续接收数据:

虽然接收方已进入 CLOSE_WAIT 状态,但连接的发送方向仍然可以发送数据包。接收方可以继

续处理这些数据,直到应用层决定关闭连接。接收方在处理完所有数据并调用 close()关闭连接后,

会发送 FIN 包请求关闭连接。

(3)连接完全关闭:

当接收方的应用层调用 close()关闭连接后,会发送 FIN 包给发送方,表示自己也准备关闭连接。

发送方接收到 FIN 包后,发送 ACK 包确认关闭请求,连接完全关闭,双方进入 CLOSED 状态

8.两个服务器之间可以同时建立多条TCP连接吗?怎么实现

可以:两台服务器之间可以同时建立多条 TCP 连接

方法:通过使用不同的端口号或同一端口的多个套接字(socket)来实现。每个 TCP 连接都是

由四元组(源 IP 地址、源端口号、目的 IP 地址、目的端口号)唯一标识的。

(1)TCP 连接的唯一性:

1)每个 TCP 连接由四元组唯一标识,即源 IP 地址、源端口号、目的 IP 地址、目的端口号。只

要这四个元素中有一个不同,就可以建立新的 TCP 连接。

2)两台服务器之间可以通过使用不同的端口号来建立多条独立的 TCP 连接。

(2)多条 TCP 连接的实现方法:

1)使用不同的端口号:可以在服务器 A 和服务器 B 上分别使用不同的端口号来建立多条连接。

2)使用同一端口的多个套接字:可以在同一个端口上创建多个套接字,每个套接字对应一个独

立的 TCP 连接

9.Linux内核收包流程

(1)网卡接收数据包:

步骤 1:网卡接收到从网络传来的数据包,并将其存储在网卡的接收缓冲区中。

(2)DMA 传输:

步骤 2:网卡通过 DMA(Direct Memory Access)将数据包直接传输到系统内存中,避免 CPU

参与数据传输,提高效率。

(3)中断通知:

步骤 3:网卡通过 PCIe 总线生成硬件中断,通知 CPU 有数据包到达,CPU 通过桥接/内存控制

器接收中断信号。

(4)软中断处理:

步骤 4 和步骤 5:CPU 响应中断,执行硬件中断处理程序,硬件中断处理程序触发软中断

(NET_RX_SOFTIRQ),软中断处理程序继续处理数据包。

(5)内核网络协议栈处理:

步骤6:软中断处理程序将数据包从内存缓冲区(RingBUF)中取出,保存到skb(socket buffer)中。

(6)数据包队列:

步骤 7:内核网络协议栈进一步处理数据包,将其放入对应 socket 的接收队列中(data 被放到

socket 接收队列)。

(7)唤醒用户进程:

步骤 8:内核唤醒等待数据的用户进程,用户进程从 socket 接收队列中读取数据进行处理。

10.本机向本机发送请求,IP 填 127.0.0.1 和网卡 ip 地址有区别吗

127.0.0.1(本地回环地址):数据包在内核网络栈中被处理,经过回环接口(Loopback Interface),不会通过物理网卡(NIC)发送,用于测试和本地通信

网卡IP地址(本机的实际IP地址):数据包通过内核网络栈被处理,并经过物理网卡(NIC)发送和接收,走完整的网络栈路径,用于正常网络通信

(1)127.0.0.1(本地回环地址)

回环接口(Loopback Interface):当应用程序使用127.0.0.1发送请求时,数据包会被路由到回环接口,回环接口是在软件层面模拟的网络接口,专门用于本地通信

内核处理:数据包不会离开内核网络栈,而是直接在内核中被处理并回送给发送方。数据包不经过物理网卡(NIC),因此不消耗网络带宽

测试和本地通信:127.0.0.1常用于网络应用的本地测试和调试,因为它不依赖实际的网络硬件

(2)网卡IP地址(本机的实际IP地址)

物理网卡(NIC):当应用程序使用本机的实际IP地址发送请求时,数据包会被路由到物理网卡,网卡会根据MAC地址处理数据包,经过物理网络接口发送和接收

完整的网络栈路径:数据包会走完整的网络栈路径:包括物理层,数据链路层和网络层。数据包会真正通过物理网卡发送和接收,可能会在网络上产生负载

正常的网络通信:使用本机的实际IP地址进行通信时,数据包的处理方式和其他设备的通信时相同。

11.TCP粘包,如何解决

TCP粘包:由于TCP是面向流的协议,所以发送的数据没有边界,接收方可能在一次读取操作中接收到多个发送方的数据包,导致数据粘在一起

解决方法:

  1. 定长消息,每个消息固定长度,接收方按固定长度读取数据
  2. 分隔符:在每个消息之间添加特殊字符作为分隔符,接收方按分隔符拆分数据。
  3. 消息头标识长度:在每个消息前添加一个消息头,消息头包括该消息的长度,接收方根据长度读取完整消息

12.滑动窗口过大怎么样,过小怎么样

(1)滑动窗口机制
  1. 发送窗口:发送方维护一个窗口,表示可以发送但尚未确认的数据范围
  2. 接收窗口:接收方维护一个窗口,表示可以接收的数据范围
  3. 窗口大小:发送方根据接收方的接收窗口大小调整发送窗口大小,确保数据在接收方缓冲区内能够被正确接收
(2)滑动窗口过大的情况
  1. 优点:在高带宽,低延迟的网络环境下,较大的滑动窗口可以允许发送方不等待ACK确认的情况下发送更多的数据,充分利用带宽,减少传输时间
  2. 缺点:在高延迟或高丢包率的网络环境中,较大的滑动窗口可能导致大量未确认的数据堆积,一旦发生丢包或错误,需要重传的数据量大,浪费带宽,导致网络阻塞
(3)滑动窗口过小的情况

1)优点:高延迟或高丢包率的网络环境中,较小的滑动窗口可以限制未确认数据的数量,减

少重传的数据量,降低网络拥塞的风险。

2)缺点:高带宽、低延迟的网络环境中,较小的滑动窗口限制了发送方的数据传输速率,频

繁等待 ACK 确认,导致带宽利用率低,传输效率下降。

13.什么是流控制?如何在TCP中实现

TCP中的流控制:
  1. 接收窗口:接收方维护一个接收窗口,表示当前可以接收的数据量大小
  2. 窗口大小通告:接收方在发送ACK报文时,通知发送方当前的接收窗口大小
  3. 发送方调整发送速度:发送方根据接受方的窗口大小,调整数据的发送速度,避免发送数据超过接收方的处理能力
流控制的目的
  1. 防止溢出:防止发送方发送数据过快,导致接收方的缓冲区溢出
  2. 确保稳定:确保网络传输的稳定性,提高传输效率

14.Nagle

Nagle算法的目的:
  1. 减少小包:通过将小数据包合并成大包发送,减少网络中包的数量
  2. 提高效率:减少每个包的协议开销,提高传输效率,减少网络拥塞
Nagle算法的工作原理

发送策略:当发送方有小数据包需要发送时,如果前一个数据包的ACK未收到,新的小数据包会被缓冲,等待前一个包的ACK到达或缓冲区积累到足够大的数据量再发送

Nagle算法的缺点
  1. 增加延迟:在实时性要求高的应用中,如在线游戏,即时通讯等,Nagle算法的延迟会影响用户体验
  2. 应用场景的选择:根据应用需要,可以选择关闭Nagle算法,通过设置TCP_NODELAY选项来禁用

15.UDP

UDP特性
  1. 无连接:UDP是无连接的,不需要建立连接即可发送数据
  2. 不可靠:UDP不保证数据包的顺序和完整性,可能会发送丢包,重复包和乱序
UDP实现可靠的方法
  1. ACK确认:接收方接收到数据包后,发送ACK确认,发送方根据ACK判断是否需要重传
  2. 超时重传:发送方在发送数据后启动计时器,如果在规定时间内未收到ACK,则进行重传
  3. 序列号:为每个数据包添加序列号,接收方根据序列号判断数据包的顺序,进行重排序
  4. FEC(前向纠错):冗余数据,在数据包中添加冗余数据,通过冗余数据进行错误检测和纠正,确保数据的完整性
UDP常见的应用场景
  1. 视频流媒体传输:UDP适合视频流媒体传输,因为丢失少量数据包不会显著影响视频质量,而低延迟是关键
  2. 实时语音通信:语音通话要求低延迟和实时性,UDP 可以满足这些要求,即使有少量数据包丢失也不影响通话质量。
  3. 在线游戏:多人在线游戏需要低延迟和快速响应,UDP 的无连接特性使其适合此类应用
  4. 简单请求-响应:如 DNS 查询,使用 UDP 进行简单的请求和响应操作,速度快且效率高
  5. 网络广播:如 DHCP,使用 UDP 可以方便地向多个设备发送广播消息。

16.TIME_WAIT状态时间为什么是2MSL?

在TCP协议中,当一方主动关闭连接时,会进入TIME_WAIT状态,MSL是一个TCP报文段在网络中可以存在的最长时间。TIME_WAIT状态是2MSL的原因:

  1. 确保被动关闭方收到ACK: 当主动关闭方发送最后一个ACK报文时,这个ACK报文可能会丢失,如果被动关闭方没有收到这个ACK,它会重新发送FIN报文段;主动关闭方必须等待一段时间,以确保它能够接收到这个可能重发的FIN报文段,并再次发送ACK确认;如果没有2MSL的等待时间,主动关闭方可能会在重新发送的FIN报文段到达时无法处理,从而导致连接不正常关闭
  2. 确保旧的报文段在网络中消失在2MSL时间内,网络中的所有旧的,重复的报文段都会超时并丢弃,确保了下一次新的连接不会受到前一个连接的旧报文段,从而避免了数据混乱和连接错误;如果不等待 2MSL,新的连接可能会收到前一个连接遗留的报文段,这会导致数据混乱和协议错误。

17.MTU

MTU是最大传输单元,指网络层协议数据包在数据链路层的 最大传输字节数,典型值为1500字节(以太网)

MTU的重要性

MTU的大小直接影响网络的效率和性能,如果数据包大于MTU,必须进行分片传输,分片传输会增加额外的开销,并可能导致重组的负担,过小的MYU会导致数据包增加网络负担

处理MTU的方法
  1. 路径MTU发现(Path MTU Discovery,PMTUD)路径MTU发现是一个动态确认路径上最小MTU的过程,通过发现路径上的所有路由器的MTU大小,确定最小的MTU以避免分片工作原理:发送带有DF(Don’t Fragment)标志的数据包,如果某个路由器无法转发这个数据包,它会丢弃该数据包并返回一个ICMP:需要分片但设置了DF标志的消息,源主机根据此消息调整了MTU的大小,直到找到合适的MTU优点:动态调整 MTU,避免不必要的分片,提高网络效率。缺点:依赖于 ICMP 消息,某些网络环境下 ICMP 消息可能被过滤或丢弃,导致路径MTU 发现失败
  2. 手动调整MTU手动设置网络接口中的MTU值以匹配网络环境,优点:简单,缺点:不灵活,需要对网络环境足够了解
  3. MSS调整TCP协议中使用MSS(Maximum Segment Size)来指定传输层能够发送的最大数据段大小,MSS通常设置为MTU减去TCP/IP头部的大小在建立TCP连接时,通过TCP握手过程协商MSS,确保数据段不会超过接收端的MTU,避免分片优点:在TCP层面进行控制,适用于TCP连接,缺点:仅适用于TCP连接
  4. 使用较小的MTU值1)描述:为网络接口配置较小的 MTU 值,以确保所有路径上的 MTU 都大于等于该值,避免分片。2)适用场景:在不确定路径 MTU 的情况下,可以设置保守的 MTU 值,以确保数据包不会被分片。3)优点:简单易行,能够避免分片。4)缺点:可能降低网络传输效率,增加数据包数量

18.IPV4与IPV6

  1. 地址空间:IPV4是32位地址,约43亿个地址,面临地址耗尽的问题,IPV6是128位地址,支持约340万 亿亿个,解决地址耗尽问题
  2. 安全性:IPV4无内置安全性,依赖外部协议IPsec提供安全性,内置IPsec协议,提供更好的安全性
  3. NAT支持:IPV4广泛支持NAT,IPV6无需
  4. IPv6:支持自动配置、多播、任播,更高效的路由和报头格式

19.NAT

网络地址转换(NAT):在路由器或防火墙上,将私有网络地址转换为公有网络地址,允许多个设备共享一个公有IP地址

NAT作用:解决IPV4地址耗尽问题,通过网络地址转换,多个设备共享一个IP地址,缓解IPV4地址短缺,提高网络安全性,隐藏内部网络结构,防止外部攻击

20.IP分片

IP分片是将大于MTU的数据包分割成多个小包传输,在接收方重新组装成完整的数据包

需要IP分片的原因:适应不同MTU,不同网络设备可能有不同的MTU,分片确保数据包能够通过所有网络设备;避免数据包丢弃,如果数据包过大而无法通过某个网络设备,分片可以避免数据包被丢弃

21.ICMP

ICMP(互联网控制消息协议)是一种网络层协议,用于在IP主机和路由器之间传递控制消息和错误报告,ICMP是IP协议的一部分,主要用于报告网络连接中的错误和进行网络诊断

ICMP 协议的作用

(1)错误报告

1)网络不可达(Destination Unreachable):当路由器或主机无法到达目标网络或主机

时,会发送此类型的 ICMP 消息,以通知源主机。

2)时间超时(Time Exceeded):当数据包在网络中传输的时间超过了生存时间(TTL)字

段规定的最大值时,会发送此类型的 ICMP 消息,以通知源主机。

3)参数问题(Parameter Problem):当路由器或主机在处理数据包时发现问题(如 IP 头

部字段错误),会发送此类型的 ICMP 消息,以通知源主机。4)重定向(Redirect):当路由器发现有更好的路径到达目标主机时,会发送此类型的

ICMP 消息,以建议源主机改用更好的路径。

(2)诊断工具

1)Ping:Ping 命令使用 ICMP 的回显请求(Echo Request)和回显应答(Echo Reply)

消息来测试主机之间的连通性。源主机发送回显请求消息,目标主机收到后发送回显应答消息,源

主机通过计算往返时间来评估网络连通性和延迟。

2)Traceroute:Traceroute 命令使用 ICMP 时间超时消息来跟踪从源主机到目标主机的路

径。源主机发送 TTL 逐渐递增的 IP 数据包,每经过一个路由器,TTL 减 1,当 TTL 减到 0

时,路由器会返回时间超时的 ICMP 消息。源主机根据返回的 ICMP 消息确定路径上的每个路由

器。

22.防止ARP攻击

(1)静态 ARP 表:

手动设置映射:在网络设备上手动设置固定的 IP 地址和 MAC 地址映射,防止 ARP 欺骗。

(2)ARP 防护工具:

检测和阻止:使用 ARP 防护工具,如 arpwatch,实时监控网络中的 ARP 流量,检测和阻止

ARP 攻击。

(3)交换机端口安全:

限制 MAC 地址:启用交换机的端口安全功能,限制每个端口可以学习的 MAC 地址数量,防

止 ARP 欺骗。

(4)网络入侵检测系统(NIDS):

监控网络流量:使用 NIDS 实时监控网络流量,检测和防止网络中的 ARP 攻击

23.TCP 的序列号机制

(1)TCP 序列号机制的概念:

1)序列号(Sequence Number):每个 TCP 数据包都包含一个序列号,用于标识数据包的

顺序,确保数据包按正确顺序组装。

2)确认号(Acknowledgment Number):每个 TCP 数据包都包含一个确认号,表示接收

方期望接收到的下一个数据包的序列号,用于确认已接收到的数据。

(2)序列号机制的作用:

1)数据包排序:通过序列号,接收方可以按正确顺序组装数据包,即使数据包顺序错乱。

2)丢包检测:通过确认号,发送方可以检测到数据包是否丢失,并进行重传,确保数据包的

可靠传输