`
qqchinaok
  • 浏览: 218272 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

CLOSE_WAIT和TIME_WAIT

    博客分类:
  • java
阅读更多
    tcp状态转移要点<br>tcp协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源 
客户端tcp状态迁移:<br>closed->syn_sent->established->fin_wait_1->fin_wait_2->time_wait->closed<br>服务器tcp状态迁移:<br>closed->listen->syn收到->established->close_wait->last_ack->closed<br>当客户端开始连接时,服务器还处于listening,客户端发一个syn包后,他就处于syn_sent状态,服务器就处于sys收到状态,然后互相确认进入连接状态established.
 
1、listening状态<br> 服务启动后首先处于侦听(listening)状态。
2、established状态<br> established的意思是建立连接。表示两台机器正在通信。
<span style="color: #ff0000;">3、close_wait</span>
对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成close_wait 此时我方要调用close()来使得连接正确关闭
<span style="color: #ff0000;">4、time_wait</span>
我方主动调用close()断开连接,收到对方确认后状态变为time_wait,缺省为240秒。tcp协议规定time_wait状态会一直持续2msl(即两倍的分段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。处于time_wait状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情况下,尽量不要主动断开连接,以减少time_wait状态造成的资源浪费。
目前有一种避免time_wait资源浪费的方法,就是关闭socket的linger选项。但这种做法是tcp协议不推荐使用的,在某些情况下这个操作可能会带来错误
 
断开连接的时候, 当发起主动关闭的左边这方发送一个fin过去后,右边被动关闭的这方要回应一个ack,这个ack是tcp回应的,而不是应用程序发送的,此时,被动关闭的一方就处于close_wait状态了。如果此时被动关闭的这一方不再继续调用closesocket,那么他就不会发送接下来的fin,导致自己老是处于close_wait。只有被动关闭的这一方调用了closesocket,才会发送一个fin给主动关闭的这一 方,同时也使得自己的状态变迁为last_ack。
出现大量close_wait的原因很简单,就是某一方在网络连接断开后,没有检测到这个错误,没有执行closesocket,导致了这个状态的实现,这在tcp/ip协议的状态变迁图上可以清楚看到。同时和这个相对应的还有一种叫time_wait的。<span style="color: #ff0000;">一端的socket调用close后,另一端的socket没有调用close</span>
另外,把socket的so_linger设置为0秒拖延(也就是立即关闭)在很多时候是有害处的。 <br>还有,把端口设置为可复用是一种不安全的网络编程方法
当主动关闭的一方发送fin到被动关闭这边后,被动关闭这边的tcp马上回应一个ack过去,同时向上面应用程序提交一个error,导 致上面的socket的send或者recv返回socket_error,正常情况下,如果上面在返回socket_error后调用了closesocket,那么被动关闭的者一方的tcp就会发送一个fin过去,自己的状态就变迁到last_ack
虚线和实线分别对应服务器端(被连接端)和客户端端(主动连接端)。 结合上图使用netstat -na命令即可知道到当前的tcp连接状态。一般listen、established、time_wait是比较常见。
分析:
这个问题主要因为tcp的结束流程未走完,造成连接未释放。现设客户端主动断开连接,流程如下
client 消息 server
close()<br>------ fin -------><br>fin_wait1 close_wait<br><----- ack -------<br>fin_wait2 <br>close()<br><------ fin ------ <br>time_wait last_ack
------ ack -------> <br>closed<br>closed
如上图所示,由于server的socket在客户端已经关闭时而没有调用关闭,造成服务器端的连接处在“挂起”状态,而客户端则处在等待应答的状态上。此问题的典型特征是:<span style="color: #ff0000;">一端处于fin_wait2 ,而另一端处于close_wait</span>
于基于tcp的http协议,关闭tcp连接的是server端,这样,server端会进入time_wait状态,可 想而知,对于访问量大的web server,会存在大量的time_wait状态,假如server一秒钟接收1000个请求,那么就会积压240*1000=240,000个time_wait的记录,维护这些状态给server带来负担。当然现代操作系统都会用快速的查找算法来管理这些time_wait,所以对于新的tcp连接请求,判断是否hit中一个time_wait不会太费时间,但是有这么多状态要维护总是不好。
  http协议1.1版规定default行为是keep-alive,也就是会重用tcp连接传输多个request/response,一个主要原因就是发现了这个问题。还有一个方法减缓time_wait压力就是把系统的2*msl时间减少,因为240秒的时间实在是忒长了点,对于windows,修改注册表,在hkey_local_machine\ system\currentcontrolset\services\ tcpip\parameters上添加一个dword类型的值tcptimedwaitdelay,一般认为不要少于60,不然可能会有麻烦。
 
0
10
分享到:
评论

相关推荐

    TCP的状态兼谈Close_Wait和Time_Wait的状态

    在TCP正常关闭连接的过程中,主动关闭的一方(发起FIN的一方)会经历FIN_WAIT1、FIN_WAIT2和TIME_WAIT状态,而被动关闭的一方(接收FIN的一方)则会经历CLOSE_WAIT、LAST_ACK和CLOSED状态。Close_Wait状态表示被动...

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

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

    TCP状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题解决

    在 TCP 连接中,客户端和服务器端都可以处于不同的状态,例如 ESTABLISHED、CLOSE_WAIT、FIN_WAIT_1、FIN_WAIT_2、TIME_WAIT 等 trạng thái。 CLOSE_WAIT 状态是 TCP 连接中的一种状态,它表示服务器端已经收到了...

    close_wait_0306 close_wait_0306 close_wait_0306 close_wait_0306

    文件"close_wait_0306.chm"和"close_wait_0306"可能是关于这个问题的文档或日志文件,它们可能包含了更详细的错误信息、堆栈跟踪或连接状态的历史记录。CHM文件是Microsoft的帮助文件格式,通常包含软件的文档或技术...

    CLOSE_WAIT错误详解

    在TCP/IP协议栈中,CLOSE_WAIT是一个非常关键的连接状态,它涉及到客户端和服务器之间的通信。这个状态在处理网络连接时可能出现的问题时尤其重要。本文将深入探讨CLOSE_WAIT错误的含义、原因以及如何解决。 首先,...

    系统调优,你所不知道的TIME_WAIT和CLOSE_WAIT1

    系统调优时,理解和处理TIME_WAIT和CLOSE_WAIT状态是关键。TIME_WAIT是为了保证TCP的可靠性,但过多的TIME_WAIT会占用资源。CLOSE_WAIT则可能指示应用程序或系统的问题。解决这些问题需要深入理解TCP连接生命周期,...

    tcp连接出现close_wait状态?_tcp_close_

    TCP连接有多种状态,包括LISTEN、SYN_SENT、SYN_RECEIVED、ESTABLISHED、CLOSE_WAIT、FIN_WAIT_1、FIN_WAIT_2、TIME_WAIT等。每个状态都代表了连接的不同生命周期阶段。Close_Wait是服务器端接收到客户端的FIN( ...

    TIME_WAIT.rar_C-means_linux 网络状态_linux c wait_tcp_unix 网络编程

    在处理TCP连接时,需要特别关注close()函数的使用,因为它可能直接影响到TIME_WAIT状态的处理。 `c-means`可能是指一种基于C语言的聚类算法,虽然在这个上下文中没有直接关联,但如果你正在学习C语言编程,并试图将...

    Linux大量TIME_WAIT解决办法.docx

    标题和描述所提到的"Linux大量TIME_WAIT解决办法"主要是针对这种情况提供的一系列解决方案。以下是一些关键知识点: 1. **TIME_WAIT状态**: 在TCP四次挥手断开连接的过程中,完成FIN交换后的双方会进入TIME_WAIT...

    tomcat-timewait-closewait.zip

    标题 "tomcat-timewait-closewait.zip" 暗示了这个压缩包可能包含与Tomcat服务器在处理TCP连接时遇到的“Time_wait”和“Close_wait”状态相关的问题和解决方案。这两个术语是TCP/IP协议栈中的关键概念,尤其在高...

    TCP_SYNC基础

    客户端:CLOSED -&gt; FIN_WAIT_1 -&gt; FIN_WAIT_2 -&gt; TIME_WAIT -&gt; CLOSED 服务器:CLOSED -&gt; LISTEN -&gt; ESTABLISHED -&gt; CLOSE_WAIT -&gt; LAST_ACK -&gt; CLOSED TIME_WAIT 状态 TIME_WAIT 状态是一个非常重要的状态,它的...

    Netstat命令详解如何关闭TIME_WAIT连接如何查看nginx的访问流量[归类].pdf

    4. 关闭 TIME_WAIT 连接:使用 netstat -ant | grep TIME_WAIT | awk '{print $2}' | xargs kill -9 命令可以关闭 TIME_WAIT 连接。 网络连接状态详解: 网络连接状态可以分为 12 种可能的状态,前面 11 种是按照 ...

    关于使用libcurl的注意事项 - blade2001的专栏 - 博客频道 - CSDN1

    同时,可以调整系统的TCP参数,减少CLOSE_WAIT和TIME_WAIT状态的超时时间。 ```c curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1); ``` 2. 初始化libcurl的正确时机: 在多线程应用程序中,应当在主线程中调用`...

    [Socket]CLOSEWAIT.rar_Help!

    2. **超时设置**:设置合理的TIME_WAIT和CLOSE_WAIT超时时间,避免资源长时间占用。 3. **异常处理**:完善服务器端的异常处理机制,确保在出现异常时能正确关闭连接。 4. **资源管理**:使用连接池可以有效管理...

    linux 下tcp参数优化

    本文将详细介绍 Linux 下 TCP 参数的优化,包括 CLOSE_WAIT 状态的生成原因、proc/sys/net/ipv4/ 中各项参数的意义和调整方法。 CLOSE_WAIT 状态的生成原因 CLOSE_WAIT 状态是 TCP 连接中一种常见的状态。当服务器...

    tcp连接状态详解 描述了tcp协议常用的命令

    它可以由多个状态转移到达,包括 FIN_WAIT_2、CLOSING 和 FIN_WAIT_1 状态。TIME_WAIT 状态的存在是为了确保 TCP 连接的可靠终止和允许老的重复分节在网络中消逝。 了解 TCP 连接状态是非常重要的,因为它可以帮助...

    tcp状态解析和windowsio说明

    主动关闭可能会经过FIN_WAIT_1、FIN_WAIT_2、TIME_WAIT状态,而被动关闭则经历CLOSE_WAIT、LAST_ACK状态。在处理TIME_WAIT状态时,需要注意避免端口冲突,可以使用SO_REUSEADDR选项来允许立即重用套接字地址,或者...

    四次挥手中收到乱序的FIN包如何处理542 - 557

    客户端和服务器之间的 TCP 连接,在关闭连接时,需要经历四个阶段:FIN_WAIT_1、CLOSE_WAIT、FIN_WAIT_2 和 TIME_WAIT。其中,FIN_WAIT_2 状态是指客户端已经发送了 FIN 报文,并等待服务器的确认响应。 现在,假设...

    c++《网络编程》服务器

    导致客户TCP发送一个FIN给服务器,服务器则以一个ACK响应,此时服务器处于CLOSE_WAIT状态,客户端处于FIN_WAIT_2状态。服务器接收到FIN,子进程中止。子进程中止内核关闭所有子进程打开的描述符导致服务器向客户端...

Global site tag (gtag.js) - Google Analytics