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

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报文要么完全响应完毕,要么被 丢弃。建立第二个连接的时候,不会混淆。

http://www.cnnetsun.cn/news/3285274.html

相关文章:

  • ABAC 访问控制是什么?金融机构数据访问控制的原理与实践
  • DevExpress WinForms自动表单布局,创建高度可定制用户体验(二)
  • (7-4-02)
  • (7-4-01)
  • (6-3-02)地图、树结构以及节点相关的类和方法
  • Adobe-GenP 3.0:解锁Adobe创意套件的终极解决方案
  • 3大核心技术突破:ppInk如何重新定义Windows屏幕标注体验
  • 猫抓(cat-catch):告别网页媒体下载烦恼的终极解决方案
  • (5-6-01)地图、树结构以及节点相关的类和方法
  • 【独家逆向分析】:基于1782次实验验证的Midjourney风格参考置信度模型(附GitHub开源校验工具)
  • Three.js游戏生成中AI编程的交付能力差异解析
  • 报表控件DevExpress Reporting中文教程 - 如何创建穿透钻取报表?
  • (4-2)地图、树结构以及节点相关的类和方法
  • (2-1)地图、树结构以及节点相关的类和方法
  • (1-5)
  • Grok 4.5技术解析:高效AI编程助手性能与应用实践
  • 如何在vLLM中部署Llama-3.1-8B-Instruct-FP8-KV-Quark-test:完整配置教程
  • 毕设项目 深度学习人脸性别年龄识别系统(源码+论文)
  • 3DLMM+PEGA+Seele:三维大语言模型与Agent编排实战指南
  • 云信IM UIKit组件化设计揭秘:从架构到代码的实现原理
  • FigmaCN中文汉化插件:设计师终极语言解放实战指南
  • 用了水性漆的木作,真的能杜绝甲醛隐患吗?
  • CentOS7系统安装GitLab
  • GTA5线上小助手:如何在洛圣都获得终极游戏体验的完整指南
  • Nexth中的SIWE实现:如何用Sign-In with Ethereum构建去中心化身份系统
  • 山东大学软件学院2026操作系统期末(回忆版)
  • (1)自动驾
  • 居家办公的知识管理工具链:从零散笔记到可检索的第二大脑
  • Arduino Uno R3开发板入门学习笔记
  • Java接口与抽象类的区别?