TCP的TIME_WAIT与CLOSE_WAITE状态

2023-10-24 13:40
文章标签 tcp 状态 close time wait waite

本文主要是介绍TCP的TIME_WAIT与CLOSE_WAITE状态,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

主动关闭的Socket端会进入TIME_WAIT状态,并且持续2MSL时间长度,MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间将在网络中消失。MSL在RFC 1122上建议是2分钟,而源自berkeley的TCP实现传统上使用30秒,因而,TIME_WAIT状态一般维持在1-4分钟
    TIME_WAIT状态存在的理由:
1)可靠地实现TCP全双工连接的终止
    在进行关闭连接四路握手协议时,最后的ACK是由主动关闭端发出的,如果这个最终的ACK丢失,服务器将重发最终的FIN,因此客户端必须维护状态信息允许它重发最终的ACK。如果不维持这个状态信息,那么客户端将响应RST分节,服务器将此分节解释成一个错误(在java中会抛出connection reset的SocketException)。因而,要实现TCP全双工连接的正常终止,必须处理终止序列四个分节中任何一个分节的丢失情况,主动关闭的客户端必须维持状态信息进入TIME_WAIT状态。

2)允许老的重复分节在网络中消逝  
    TCP分节可能由于路由器异常而“迷途”,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个原来的迷途分节就称为lost duplicate。在关闭一个TCP连接后,马上又重新建立起一个相同的IP地址和端口之间的TCP连接,后一个连接被称为前一个连接的化身(incarnation),那么有可能出现这种情况,前一个连接的迷途重复分组在前一个连接终止后出现,从而被误解成从属于新的化身。为了避免这个情况,TCP不允许处于TIME_WAIT状态的连接启动一个新的化身,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个TCP连接的时候,来自连接先前化身的重复分组已经在网络中消逝。

新的SCTP协议通过在消息头部添加验证标志避免了TIME_WAIT状态。


*TIME_WAIT* 

当一个socket进程结束后,相应的socket仍会保持TIME_WAIT状态4分钟。这样的目的是为了保证那些因某些原因在网络上传送很慢的包在这个scoket完全关闭之前到达。
这样后来使用同样的socket的进程不会收到本应发给前一个使用该socket的进程的数据包。
相关参数:
tcp_keepalive_interval 
tcp_ip_abort_interval
tcp_close_wait_interval *
*FIN_WAIT_2* 
当server收到一个关闭TCP连接的请求时,它会发一个设置了FIN位的packet给client。client会回应一个设置了ACK位的packet。然后,client会发送一个设置了FIN位的packet给server,server回应一个ACK,这个连接应关闭了。server接收到client的ACK,然后开始等待client的FIN包的状态就是FIN_WAIT_2。
在FIN_WAIT_2状态,server不会往client发送数据和控制信息,它只是等待client的FIN包。
相关参数:
tcp_fin_wait_2_flush_interval 系统将会flush 
out处于FIN_WAIT_2状态的TCP连接的间隔,理论上最小值为6750ms。


*CLOSE_WAIT* 

TCP连接总处于CLOSE_WAIT状态是由于当TCP没有开始协议中的CLOSE阶段。
TCP连接中CLOSE_WAIT状态的发生是当server没有收到应用程序的CLOSE,但应用程序已经终止了。这可能是一个有问题的应用程序在关闭窗口并结束之后发出了FIN包。有时候是当Solaris系统缺少kernal,tcp,ip,libnsl 
或 rpcbind等patch造成。
CLOSE_WAIT状态意味着连接的另一端已经关闭了(被动关闭处于CLOSE_WAIT状态,而本地端仍在等待应用程序关闭。一个不确定的TCP连接指示着存在应用一级的bug。
在收到一个从远端发来的FIN之后,收到应用程序发出的CLOSE之前,TCP连接将从ESTABLISHED状态变为CLOSE_WAIT状态, 
after从CLOSE_WAIT-> 
LAST_ACK的转换是在应用程序发出CLOSE时发生的。在转换过程中,TCP会安排(schedule)发送一个FIN,这个FIN将在保留的数据之后发出,如果接收端已经关闭了窗口可能会被延迟。

另外附一个TCP连接与释放截图:





这篇关于TCP的TIME_WAIT与CLOSE_WAITE状态的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/275551

相关文章

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

MySQL 中的服务器配置和状态详解(MySQL Server Configuration and Status)

《MySQL中的服务器配置和状态详解(MySQLServerConfigurationandStatus)》MySQL服务器配置和状态设置包括服务器选项、系统变量和状态变量三个方面,可以通过... 目录mysql 之服务器配置和状态1 MySQL 架构和性能优化1.1 服务器配置和状态1.1.1 服务器选项

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon