当前位置: 首页 > article >正文

TCP的“四次挥手“与TIME_WAIT状态详解

一、TCP的"四次挥手"过程

客户端

  1. 建立完成状态:当客户端与服务器建立连接并完成数据传输后,客户端会发送完所有字节流。此时,携带最后一组字节流的数据段会将FIN标记位置1,标志着客户端的数据发送完毕,之后客户端进入到下一个状态。

  2. FIN_WAIT_1状态在该状态下,客户端等待服务器回复ACK确认报文。一旦收到服务器的ACK应答,客户端将进入到下一个状态。

  3. FIN_WAIT_2状态此时,客户端等待服务器发送FIN断开请求。当收到服务器的FIN断开请求后,客户端会回复ACK进行确认,并进入下一个状态。

  4. TIME_WAIT状态客户端进入此状态后,会等待2MSL(Maximum Segment Lifetime,报文最大生存时间)时间。这段时间的设置有着重要的意义,将在后续部分详细阐述。等待2MSL时间后,客户端进入下一个状态。

  5. CLOSE状态这是客户端的关闭状态,断开TCP的连接,释放掉所有TCP连接占用的资源。

服务器

  1. 建立完成状态服务器在与客户端建立连接并进行数据交互的过程中,处于建立完成状态。当收到客户端发送的FIN断开请求后,服务器将回复一个ACK确认报文,之后,服务器进入到下一个状态。

  2. CLOSED_WAIT状态在该状态下,服务器等待自身字节流的发送。当服务器自身所有字节流传递完毕后,将发送一个FIN断开请求,之后进入到下一个状态。

  3. LAST_ACK状态此时,服务器等待客户端进行最后的ACK应答。当收到客户端发送的ACK确认报文之后,服务器将进入下一个状态。

  4. CLOSE状态这是服务器的关闭状态,断开TCP的连接,释放掉所有TCP连接占用的资源。

二、为什么要有TIME_WAIT状态

TIME_WAIT状态的存在主要是为了保证TCP会话可以正常关闭。其具体原因如下:

TIME_WAIT状态用于确保TCP会话正常关闭,一是保证客户端最后一个ACK报文可靠传输,若丢失可重传;二是避免历史报文干扰新连接,2MSL时间足够让旧数据报丢弃,且在可靠性和资源占用上较平衡。 

  1. 确保最后一个ACK报文的可靠传输:在TCP连接的断开过程中,客户端发送的最后一个ACK报文可能会丢失。如果设置TIME_WAIT状态,等待2MSL时间,就可以保证有足够的时间来等待对方重传ACK报文。因为一来一回正好两个MSL时间,这样可以确保TCP会话的正常断开。

  2. 避免历史报文干扰新连接:设置2MSL时间,足以让两个方向上的数据报都丢弃。当出现新的连接时,不至于被历史报文造成数据错乱,从而保证了新连接的正确性和可靠性。

  3. 防止资源占用过大:虽然需要等待2MSL时间,但如果设置过长的时间,会导致资源占用过大。因此,2MSL是一个相对合理的时间长度,在保证可靠性和避免资源浪费之间取得了平衡。

三、设置为2MSL时间的原因

  1. 最后一个ACK报文丢失的重传机制:在TCP连接断开的过程中,客户端发送的最后一个ACK报文可能会丢失。如果设置为2MSL时间,可以保证有足够的时长等待对方重传。因为一来一回正好两个MSL时间,这样可以确保TCP会话的正常断开。

  2. 确保两个方向上的数据报都丢弃:设置2MSL时间,足以让两个方向上的数据报都丢弃。当出现新的连接时,不至于被历史报文造成数据错乱,从而保证了新连接的正确性和可靠性。

  3. 避免资源占用过大:如果设置的时间过长,会导致资源占用过大。2MSL是一个相对合理的时间长度,在保证可靠性和避免资源浪费之间取得了平衡。

综上所述,TCP的"四次挥手"过程以及TIME_WAIT状态的设置,都是为了确保TCP连接能够可靠、有序地断开,同时避免历史报文对新连接产生干扰,保证网络通信的稳定性和数据的完整性。


http://www.kler.cn/a/597055.html

相关文章:

  • Linux vim mode | raw / cooked
  • 2025:sql注入详细介绍
  • 权限维持—Linux系统Rootkit后门
  • victoriametrics 部署
  • S32k3XX MCU时钟配置
  • 【Linux】达梦数据库图形如何新建表、 插入表
  • 3. 轴指令(omron 机器自动化控制器)——>MC_SetPosition
  • RAG 技术:让大型语言模型更智能
  • LLM - CentOS上离线部署Ollama+Qwen2.5-coder模型完全指南
  • CCF-CSP认证 202206-2寻宝!大冒险!
  • 详解简单选择排序
  • LeetCode 160 Intersection Of Two Linked Lists 相交链表 Java
  • 简单实用!百度AI + Raphael AI = 免费生图
  • 第十四届蓝桥杯省赛电子类单片机学习记录(客观题)
  • [笔记.AI]多头自注意力机制(Multi-Head Attention)
  • 计划变动的坐标系-基线
  • MyBatis-Plus 自动填充:优雅实现创建/更新时间自动更新!
  • SQL之delete、truncate和drop区别
  • JavaScript基础-DOM事件流
  • 【CSS文字渐变动画】