`
pengtyao
  • 浏览: 401034 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

close_wait状态的产生原因及解决

阅读更多
最近需要上线的逻辑server由于需要与大量的后台server交互,今天突然发现有大量的close_wait产生,于是仔细研究了一下:
首先我们知道,如果我们的服务器程序处于CLOSE_WAIT状态的话,说明套接字是被动关闭的!
因为如果是CLIENT端主动断掉当前连接的话,那么双方关闭这个TCP连接共需要四个packet:
Client ---> FIN  ---> Server
Client <--- ACK  <--- Server
这时候Client端处于FIN_WAIT_2状态;而Server 程序处于CLOSE_WAIT状态。
Client <--- FIN  <--- Server
这时Server 发送FIN给Client,Server 就置为LAST_ACK状态。
Client ---> ACK  ---> Server
Client回应了ACK,那么Server 的套接字才会真正置为CLOSED状态。


Server 程序处于CLOSE_WAIT状态,而不是LAST_ACK状态,说明还没有发FIN给Client,那么可能是在关闭连接之前还有许多数据要发送或者其他事要做,导致没有发这个FIN packet。
通常来说,一个CLOSE_WAIT会维持至少2个小时的时间(这个时间外网服务器通常会做调整,要不然太危险了)。如果有个流氓特地写了个程序,给你造成一堆的CLOSE_WAIT,消耗
你的资源,那么通常是等不到释放那一刻,系统就已经解决崩溃了。
只能通过修改一下TCP/IP的参数,来缩短这个时间:修改tcp_keepalive_*系列参数有助于解决这个问题。
但是实际上,还是主要是因为我们的程序代码有问题,通常是如下问题:
比如被动关闭的是客户端。。。

当对方调用closesocket的时候,你的程序正在

int nRet = recv(s,....);
if (nRet == SOCKET_ERROR)
{
// closesocket(s);
return FALSE;
}


很多人就是忘记了那句closesocket,这种代码太常见了。

我的理解,当主动关闭的一方发送FIN到被动关闭这边后,被动关闭这边的 TCP马上回应一个ACK过去,同时向上面应用程序提交一个ERROR,导 致上面的SOCKET的send或者recv返回SOCKET_ERROR,正常情况下,如果上面在返回SOCKET_ERROR后调用了 closesocket,那么被动关闭的者一方的TCP就会发送一个FIN过去,自己的状态就变迁到LAST_ACK.

转载请注明出处.http://www.vimer.cn
分享到:
评论

相关推荐

    CLOSE_WAIT网络连接无法释放问题解决

    1. CLOSE_WAIT状态的定义和产生原因 2. CLOSE_WAIT状态的解决方法 3. TCP连接的结束流程 4. 使用netstat -na命令查看TCP连接状态 5. 编程的重要性在于确保正确关闭连接 延伸阅读: * CLOSE_WAIT状态的详细解释 * ...

    Close_Wait问题相关资料

    下面将详细讲解Close_Wait状态、产生原因、诊断方法及解决方案。 1. **TCP连接生命周期**: - TCP连接有建立(SYN/SYN+ACK/ACK)、数据传输、关闭等阶段,其中"四次挥手"用于关闭连接。Close_Wait是在四次挥手的第...

    Floodlight TCP连接异常原因分析

    如果应用层未能及时关闭连接,TCP连接将长时间保持在CLOSE-WAIT状态,从而可能导致资源占用过多。 3. **Floodlight中的TCP异常分析** 在测试场景中,模拟大量vswitch的上线和下线导致了Floodlight控制器上的TCP...

    sem.rar_in_linux semaphore

    在Linux操作系统中,信号量(Semaphore)是一种非常重要的同步机制,用于解决多个进程之间的并发访问问题,特别是资源的共享和保护。本篇文章将深入探讨Linux中的信号量,并围绕标题"sem.rar_in_linux semaphore"和...

    python基础超强总结

    Python Python深拷贝和浅拷贝的区别 Python的内存管理机制(垃圾回收+内存池) ⼀、引用计数 ⼆、垃圾回收 三、内存池机制 ...S 为什么TIME_WAIT状态需要经过OMSL才能返回到CLOSE状态? TCP VS UDP ⼀、TCP/IP网络

    渗透面试资料 渗透测试 安服 的面试题目

    服务器接收到FIN包后,发送ACK确认,进入CLOSE_WAIT状态。 3. 服务器发送FIN包,进入LAST_ACK状态。 4. 客户端发送ACK包,进入TIME_WAIT状态。 **TCP为何需要三次握手?** - 防止已失效的连接请求报文突然又传送...

    C++面试题1.pdf

    但在此期间,服务器端可能还需要继续接收数据,因此它不会立刻发送自己的FIN报文,这时服务器端处于CLOSE_WAIT状态。 - **原因**:通常出现在服务器端处理请求时未能及时发送FIN报文的情况。可能是由于服务器端程序...

    BEA Tuxedo on hp-ux Tuning

    - `tcp_close_wait_interval`:控制连接关闭后套接字处于TIME_WAIT状态的时间。设置过短可能会导致连接复用问题,而设置过长则可能导致端口资源浪费。 - `tcp_ip_abort_interval`:用于定义处于ESTABLISHED状态的...

    内存IO磁盘网络问题分析

    - **原因分析**:TCP状态如`CLOSE_WAIT`表示客户端已经完成发送,等待关闭连接。 - **解决策略**: - 优化客户端代码,及时关闭不再使用的连接。 - 使用`netstat`或`ss`命令检查连接状态。 #### 三、网络问题...

    Hadoop集群监控与Hive高可用-向磊.pdf

    - **TCPSession超时问题**:长时间运行的查询可能会导致TCPSession进入CLOSE_WAIT状态,可以通过调整HAProxy中的超时设置来缓解此问题。 - **Hive日志问题**:频繁的健康检查可能会产生大量Hive日志,可以通过增加...

    后台开发核心技术面试集锦

    - **TIME_WAIT状态(2MSL)** - 进入此状态是为了确保上一个连接的所有数据都已经正确送达对方,并且避免旧的连接请求报文段干扰新的连接。 - **TCP可靠传输** - 采用确认应答机制、重传机制以及错误检测等技术来...

    C++教程网视频:linux网络编程

    - **TIME_WAIT与SO_REUSEADDR**:TIME_WAIT状态用于避免旧的重复报文到达;SO_REUSEADDR允许复用地址。 - **SIGPIPE**:当远程主机关闭连接时,继续发送数据将触发SIGPIPE信号。 ##### socket编程(八) - **五种I...

    阿里Java最新版面试集锦

    - 第二次挥手:服务器接收到FIN后发送ACK报文作为应答,此时服务器进入CLOSE_WAIT状态。 - 第三次挥手:服务器发送FIN报文请求断开连接。 - 第四次挥手:客户端接收FIN后发送ACK报文应答,客户端进入TIME_WAIT...

    操作系统实验六 死锁问题实验

    这个实验的目标是让学生深入理解死锁的产生,以及学习如何解决死锁问题。 实验报告中提到了使用管程和条件变量作为解决死锁的机制。管程是一种高级的进程同步工具,由英国计算机科学家C.A.R. Hoare提出,它提供了一...

    查看数据库锁和解锁方法

    数据库锁主要用于解决并发控制问题,通过加锁来保证数据的一致性。根据锁的作用范围和粒度不同,可以分为多种类型: 1. **行级锁**:作用于单个记录或行上。 2. **表级锁**:作用于整个表上。 3. **页级锁**:作用...

    华为编程开发规范与案例

    上面的问题解决起来很容易,只需在第一行代码中增加一个判断条件即可,如下:  for(i=0; i&lt;pSysHead-&gt;dbf_coun && i &lt; MAX_DB_NUM; i++) // MAX_DB_NUM=127 这样就保证了循环变量i的值在正常范围内,从而避免了...

    有关线程知识

    一个进程可以有多个线程,而这些线程共享进程的资源(如内存空间),但每个线程都有自己独立的栈空间和寄存器状态。 #### Posix与System V线程模型 Posix(Portable Operating System Interface)和System V是两种...

    net学习笔记及其他代码应用

    答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 40.接口是否可...

    百度2014校园招聘笔试面试汇总

    - **僵尸进程产生的原因及解决方法(10分)** - **僵尸进程产生的原因**:当父进程调用`wait()`或`waitpid()`来回收子进程的资源时,如果子进程已经结束,但父进程没有正确处理,则子进程会变成僵尸状态。 - **...

Global site tag (gtag.js) - Google Analytics