深入理解 TCP 四次挥手及相关网络问题

引言

在计算机网络中,TCP(传输控制协议) 是最为广泛应用的协议之一,尤其在提供可靠的数据传输时。我们熟知 TCP 三次握手的过程,它用于建立连接,但在连接关闭时,TCP 需要进行 四次挥手(Four-Way Handshake)来断开连接,确保双方都能正确关闭连接,释放资源。

在这篇博客中,我们将详细探讨 TCP 四次挥手 过程中的细节,分析常见问题及排查方法,帮助你深入理解这一机制。

一、TCP 的四次挥手过程

TCP 四次挥手的基本过程

四次挥手 是 TCP 协议用于断开连接的标准过程,确保双方都能释放资源并确保可靠的连接关闭。

过程如下:

第一次挥手

  • 客户端 发送 FIN 包,表示客户端没有数据要发送了,要求关闭连接。
  • 客户端进入 FIN_WAIT_1 状态。

第二次挥手

  • 服务器 收到 FIN 包后,向客户端发送 ACK 包,确认客户端关闭连接的请求。
  • 服务器进入 CLOSE_WAIT 状态。

第三次挥手

  • 服务器 发送 FIN 包,告诉客户端,服务器也没有数据发送了,准备关闭连接。
  • 服务器进入 LAST_ACK 状态。

第四次挥手

  • 客户端 收到服务器的 FIN 包后,发送 ACK 包确认。
  • 客户端进入 TIME_WAIT 状态,等待足够的时间确保服务器收到确认包。
  • 客户端进入 CLOSED 状态,连接正式关闭。

二、常见问题与分析

1 第二次和第三次挥手能否合并?

第二次和第三次挥手是可以合并的,因为它们分别是:

  • 第二次挥手:服务器向客户端确认已收到 FIN 包,并告知其准备关闭连接。
  • 第三次挥手:服务器主动向客户端发送自己的 FIN 包,通知客户端服务器也准备关闭连接。

每个阶段都需要对方确认,以确保连接断开时的可靠性和正确性。因此,通畅不可以将这两步合并。

但是如果被动关闭方没有数据要发送 并且开启了TCP延迟确认机制就可以合并

2 如果第三次挥手一直没发,会发生什么?

如果 第三次挥手FIN 包 没有被发送(即服务器没有关闭连接),客户端就无法进入 TIME_WAIT 状态,也就无法完全关闭连接。

此时,客户端会一直处于 FIN_WAIT_1FIN_WAIT_2 状态,且连接无法完全释放,可能导致连接资源泄露,服务器端的端口资源也会被占用,影响其他请求的接入。

解决方案:

  • 在 TCP 连接断开时,服务器应确保发送了第三次挥手的 FIN 包

3 第二次和第三次挥手之间,主动断开的那端能做什么?

当客户端发送了 FIN 包(第一次挥手)后,进入 FIN_WAIT_1 状态,等待服务器的确认包。在 第二次挥手第三次挥手 期间,客户端可以做以下操作:

  • 继续向应用层发送数据:虽然连接正在关闭,但应用层仍可以继续发送数据。
  • 等待 ACK 包和 FIN 包的到来,以完成连接的彻底关闭。

在这个过程中,客户端还可以进行 资源清理,例如释放缓冲区、关闭文件句柄等。

4 如果客户端发送的 FIN 包丢失,服务端的状态是什么?

如果客户端发送的 FIN 包 丢失,服务端无法收到连接断开请求。此时,客户端会超时重发 FIN 包 。服务器端的状态在这期间保持 ESTABLISHED ,直到接收到客户端的 FIN 包 ,才会进入 CLOSE_WAIT 状态,进行正常的断开过程。

通常来说,TCP 会通过 重传机制 自动解决丢包问题,确保最终连接能够顺利断开。

5 为什么第四次挥手要等 2MSL(最大报文生命周期)?

TIME_WAIT 状态要求等待 2MSL,即两个最大报文生命周期(Maximum Segment Lifetime)的时间,是为了确保:

  1. 确认包被对方收到 :客户端发送的 ACK 包 必须确保服务器收到。如果第四次挥手的 ACK 包 丢失,客户端可以重新发送。

  2. 防止老旧的数据包 :如果网络中存在老的数据包,它们可能会延迟到达。在 2MSL 的时间内,客户端能够确保所有的旧数据包被丢弃,避免重传时引起混乱。

6 服务端出现大量 TIME_WAIT 的原因

服务端出现大量 TIME_WAIT 状态,可能是以下原因:

  1. 频繁的连接创建与销毁 :如果服务端频繁地建立和断开连接,例如短连接的高频访问,可能导致大量的 TIME_WAIT 状态。

  2. 没有正确关闭连接 :如果某些连接没有在关闭时正常执行 四次挥手 ,也可能导致大量的 TIME_WAIT

  3. 网络延迟 :在高延迟网络环境中,FIN 包可能会延迟,导致 TIME_WAIT 状态的积压。

解决方案:

  • 使用 长连接(如 HTTP Keep-Alive)减少频繁连接的开销。
  • 在高并发的服务中,调整内核的 TIME_WAIT 过期时间。
  • 适当配置 TCP 回收策略

总结

TCP 协议的四次挥手过程确保了可靠的连接关闭,但其过程中的每一步都有可能受到不同因素的影响,从而导致连接无法正确断开。理解每个过程的详细步骤及常见问题,对于开发和运维人员来说是非常重要的。

总结要点:

  • 四次挥手过程保证了可靠的连接释放,且每一阶段都非常重要。
  • TIME_WAIT状态用于确保可靠性,但在高并发场景中可能带来资源浪费。
  • 合理的连接管理和排查策略能够帮助我们减少连接问题。
相关推荐
CCPC不拿奖不改名2 小时前
基于FastAPI的API开发(爬虫的工作原理):从设计到部署详解+面试习题
爬虫·python·网络协议·tcp/ip·http·postman·fastapi
ipooipoo11883 小时前
如何判断动态IP池里的IP都是纯净的吗?
服务器·网络·tcp/ip
小码吃趴菜3 小时前
TCP协议编程流程
服务器·网络·tcp/ip
今儿敲了吗4 小时前
计算机网络第三章笔记(三)
笔记·计算机网络
凌~风5 小时前
012-计算机网络实验报告完整版!
计算机网络·实验报告·网络命令
小李独爱秋5 小时前
计算机网络经典问题透视:可以通过哪些方案改造互联网,使互联网能够适合于传送音频/视频数据?
运维·服务器·网络协议·计算机网络·音视频
swan4165 小时前
SCAU期末笔记 - 计算机网络题库解析
笔记·计算机网络
不知疲倦的仄仄5 小时前
HTTP解析/版本变化/TSL
网络协议·tcp/ip·macos
上海云盾第一敬业销售5 小时前
高防IP架构解析与实践分享
网络协议·tcp/ip·架构