news 2026/7/11 11:00:15

tcp连接状态TIME_WAIT和CLOSE_WAIT

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
tcp连接状态TIME_WAIT和CLOSE_WAIT

常用的三个状态是:ESTABLISHED 表示正在通信,TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关闭。

TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,
如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。
网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。

在众多TCP状态中,最值得注意的状态有两个:CLOSE_WAIT和TIME_WAIT。

TIME_WAIT 是主动关闭链接时形成的,等待2MSL时间,约4分钟。主要是防止最后一个ACK丢失。由于TIME_WAIT 的时间会非常长,因此server端应尽量减少主动关闭连接。

CLOSE_WAIT 是被动关闭连接是形成的。根据TCP状态机,服务器端收到客户端发送的FIN,则按照TCP实现发送ACK,因此进入CLOSE_WAIT状态。但如果服务器端不执行close(),就不能由CLOSE_WAIT迁移到LAST_ACK,则系统中会存在很多CLOSE_WAIT状态的连接。此时,可能是系统忙于处理读、写操作,而未将已收到FIN的连接,进行close。此时,recv/read已收到FIN的连接socket,会返回0。

为什么需要 TIME_WAIT 状态?
client主动断开连接,假设server未收到最终的ACK,server将重发FIN,client必须维护TCP状态以便可以重发最终的ACK,否则会发送RST,结果server认为发生错误。
TCP实现必须可靠地终止连接的两个方向(全双工关闭),client必须进入 TIME_WAIT 状态,因为client可能面 临重发最终ACK的情形。

为什么 TIME_WAIT 状态需要保持 2MSL 这么长的时间?
如果 TIME_WAIT 状态保持时间不足够长(比如小于2MSL),第一个连接就正常终止了。
第二个拥有相同相关五元组的连接出现,而第一个连接的重复报文到达,干扰了第二个连接。
TCP实现必须防止某个连接的重复报文在连接终止后出现,所以让TIME_WAIT状态保持时间足够长(2MSL),连接相应方向上的TCP报文要么完全响应完毕,要么被 丢弃。建立第二个连接的时候,不会混淆。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/11 10:56:49

ABAC 访问控制是什么?金融机构数据访问控制的原理与实践

引言ABAC(Attribute-Based Access Control,基于属性的访问控制)是一种根据用户属性、资源属性、环境属性等多维条件实时判定数据访问权限的技术模式。金融机构的数据访问场景远比"谁有什么角色、角色有什么权限"的静态模型复杂——…

作者头像 李华
网站建设 2026/7/11 10:56:43

DevExpress WinForms自动表单布局,创建高度可定制用户体验(二)

使用DevExpress WinForms的表单布局组件可以创建高度可定制的应用程序用户体验,从自动安排UI控件到按比例调整大小,DevExpress布局和数据布局控件都可以让您消除与基于像素表单设计相关的麻烦。P.S:DevExpress WinForms拥有180组件和UI库&…

作者头像 李华
网站建设 2026/7/11 10:55:11

Adobe-GenP 3.0:解锁Adobe创意套件的终极解决方案

Adobe-GenP 3.0:解锁Adobe创意套件的终极解决方案 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 在数字创意领域,Adobe Creative Cloud系列…

作者头像 李华