首页 > 其他分享 >TCP连接状态是TIME_WAIT的场景解析

TCP连接状态是TIME_WAIT的场景解析

时间:2024-10-25 12:01:08浏览次数:1  
标签:状态 TCP TIME 客户端 FIN 连接 WAIT

在 Tomcat 处理网络请求时,TIME_WAIT 状态通常是 TCP 连接关闭过程中的一个阶段。这个状态主要与 TCP 的四次挥手(Four-Way Handshake)有关。以下是在 Tomcat 处理网络请求时,连接状态变为 TIME_WAIT 的具体情况:

四次挥手过程

1.客户端发送 FIN 包:

  • 客户端完成数据传输后,主动调用 close() 关闭连接,发送一个 FIN 包给服务器。
  • 客户端进入 FIN_WAIT_1 状态。

2.服务器接收 FIN 包并发送 ACK:

  • 服务器收到客户端的 FIN 包,发送一个 ACK 包确认收到。
  • 服务器进入 CLOSE_WAIT 状态。
  • 客户端收到服务器的 ACK 包后,进入 FIN_WAIT_2 状态。

3.服务器发送 FIN 包:

  • 服务器也完成数据传输后,调用 close() 关闭连接,发送一个 FIN 包给客户端。
  • 服务器进入 LAST_ACK 状态。

4.客户端接收 FIN 包并发送 ACK:

  • 客户端收到服务器的 FIN 包,发送一个 ACK 包确认收到。
  • 客户端进入 TIME_WAIT 状态。
  • 服务器收到客户端的 ACK 包后,进入 CLOSED 状态。

5.客户端等待一段时间:

  • 客户端在 TIME_WAIT 状态下等待一段时间(通常是 2MSL,即两倍的最大报文段生存时间),以确保服务器收到了最后一个 ACK 包。
  • 如果在这段时间内没有收到服务器的重传请求,则客户端进入 CLOSED 状态。

具体情况

1.客户端主动关闭连接:当客户端主动调用 close() 函数关闭连接时,客户端会进入 FIN_WAIT_1 状态,并最终进入 TIME_WAIT 状态。

2.服务器被动关闭连接:当服务器被动关闭连接(即服务器收到客户端的 FIN 包后调用 close() 函数)时,服务器不会进入 TIME_WAIT 状态。只有客户端会进入 TIME_WAIT 状态。

 

为什么需要 TIME_WAIT 状态?

  • 确保最后一个 ACK 包被收到:如果服务器没有收到客户端的最后一个 ACK 包,服务器会重传 FIN 包。TIME_WAIT 状态确保客户端能够响应这种重传。
  • 防止旧的重复包干扰新的连接:TIME_WAIT 状态可以防止旧的重复包干扰新的连接。TCP 连接由四元组(源 IP、源端口、目标 IP、目标端口)唯一标识,等待 2MSL 时间可以确保旧的重复包在网络中消失,从而避免混淆新的连接。

在 Tomcat 中的具体表现

  • 客户端请求处理完毕:当客户端请求处理完毕并且客户端主动关闭连接时,客户端的连接会进入 TIME_WAIT 状态。
  • 服务器端处理完毕:当服务器端处理完请求并且服务器调用 close() 函数关闭连接时,服务器端的连接会进入 CLOSED 状态,而客户端的连接会进入 TIME_WAIT 状态。

示例
假设有一个简单的 HTTP 请求和响应过程:

1.客户端发起请求:

  • 客户端发送 HTTP 请求到 Tomcat 服务器。
  • 建立 TCP 连接,双方进入 ESTABLISHED 状态。

2.Tomcat 处理请求并响应:

  • Tomcat 接收请求并处理,然后发送响应。
  • 双方仍然处于 ESTABLISHED 状态。

3.客户端关闭连接:

  • 客户端完成数据接收后,调用 close() 函数关闭连接。
  • 客户端发送 FIN 包,进入 FIN_WAIT_1 状态。
  • Tomcat 收到 FIN 包,发送 ACK 包,进入 CLOSE_WAIT 状态。
  • 客户端收到 ACK 包,进入 FIN_WAIT_2 状态。

4.Tomcat 关闭连接:

  • Tomcat 完成所有处理后,调用 close() 函数关闭连接。
  • Tomcat 发送 FIN 包,进入 LAST_ACK 状态。
  • 客户端收到 FIN 包,发送 ACK 包,进入 TIME_WAIT 状态。
  • Tomcat 收到 ACK 包,进入 CLOSED 状态。
  • 客户端在 TIME_WAIT 状态下等待 2MSL 时间后,进入 CLOSED 状态。


通过这种方式,TIME_WAIT 状态确保了 TCP 连接的可靠关闭,并防止旧的重复包干扰新的连接。

标签:状态,TCP,TIME,客户端,FIN,连接,WAIT
From: https://www.cnblogs.com/auv2009/p/18502228

相关文章

  • 【ModbusTCP与Profibus DP双向互转说明】
        Profibusdp和ModbusTCP均为工业通信协议。ModbusTCP为串行通讯协议,已成为工业领域通讯协议的业界标准。Modbus是现在国内工业领域应用最多的协议,不只PLC设备,各种终端设备,比如水控机、水表、电表、工业秤、各种采集设备。而Profibus为自动化技术的现场总线标准,广泛......
  • TCP连接的状态
    TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP连接的状态可以通过一个状态机来描述,这个状态机定义了TCP连接从建立到关闭过程中可能经历的各种状态。一、状态状态名称描述触发条件CLOSED表示没有连接。这是初始状态。无LISTEN服务......
  • 鸿蒙网络编程系列35-通过数据包结束标志解决TCP粘包问题
    1.TCP数据传输粘包简介在本系列的第6篇文章《鸿蒙网络编程系列6-TCP数据粘包表现及原因分析》中,我们演示了TCP数据粘包的表现,如图所示:随后解释了粘包背后的可能原因,并给出了解决TCP传输粘包问题的两种思路,其中一种就是指定数据包结束标志,本节将通过一个示例演示这种思路......
  • PbootCMS后台自动清理缓存runtime文件夹
    PbootCMS后台自动清理缓存进入后台管理:登录PbootCMS后台管理系统。配置自动清理缓存:进入“系统设置”->“缓存管理”。找到“自动清理缓存”选项,设置自动清理的时间间隔。保存设置。详细步骤方式一:通过后台清理缓存登录后台:打开浏览器,输入你的PbootCMS后......
  • 【保姆级IDF】ESP32使用WIFI作为AP模式TCP通信:连接客户端+一对多通信
    #1024程序员节|征文#Tips:抛砖引玉,本文记录ESP32学习过程中遇到的收获。如有不对的地方,欢迎指正。1.前言    关于ESP32的WIFI这部分基础知识,在网上可以找到许多,包括TCP协议、套接字等等,博主之前的文章也有介绍,在此本文不再赘述,直接讲清楚标题功能如何实现,并说明......
  • [Flink SQL] FlinkCdcSqlJob启动时因MYSQL serverTimeZone而报错:`The MySQL server ha
    1问题描述FlinkCdcSqlJob启动时报错...Causedby:org.apache.flink.table.api.ValidationException:TheMySQLserverhasatimezoneoffset(0secondsaheadofUTC)whichdoesnotmatchtheconfiguredtimezoneAsia/Shanghai.Specifytherightserver-time-z......
  • [Go] 如何妥善处理 TCP 代理中连接的关闭
    如何妥善处理TCP代理中连接的关闭相比较于直接关闭TCP连接,只关闭TCP连接读写使用单工连接的场景较少,但通用的TCP代理也需要考虑这部分场景。背景今天在看老代码的时候,发现一个TCP代理的核心函数实现的比较粗糙,收到EOF后直接粗暴关闭两条TCP连接。funcConnCat(u......
  • qt5multimedia播放rtsp延迟高
    Qt5Multimedia在Liunux平台已实现对Gstreamer的支持,近期在RK3588平台,使用Qt5Multimedia播放RTSP流时,遇到延迟高问题(3s左右),查看API,Qt5Multimedia无法向Gstreamer传递参数。解决办法:重新编译qt5multimedia;修改qt5multimedia/src/gsttools/qgstreamerplayersession.cppGstE......
  • net.ipv4.tcp_tw_recycle = 1会导致什么问题产生
    net.ipv4.tcp_tw_recycle=1在Linux系统中启用时,会导致一系列问题,特别是在涉及NAT(网络地址转换)和负载均衡的环境中。以下是该设置可能导致的几个主要问题:1.NAT环境下的连接问题在NAT环境中,多个客户端可能通过同一个公网IP地址访问服务器。当tcp_tw_recycle启用时,服务器可能......
  • 通过 PowerShell 添加网络打印机并创建一个标准 TCP/IP 端口,您可以使用 Add-PrinterPo
    通过PowerShell添加网络打印机并创建一个标准TCP/IP端口,您可以使用Add-PrinterPort和Add-Printercmdlet。以下是一个详细的示例,演示了如何创建TCP/IP端口并添加网络打印机。步骤创建TCP/IP端口添加打印机示例代码powershellCopyCode#设置打印机的IP地址和......