`

Tcp主动关闭连接导致TIME_WAIT状态

阅读更多

          最近写了一个进程,需要通过20个线程循环600个用户获取每一个用户的xx信息,是通过socket连接oracle mdb服务器获取的,但是在本机windows上测试发现大量的TIME_WAIT状态,按照网上的说法,调了注册表的参数,但是无济于事,Socket.setReuseAddress方法也是没有效果,最后放弃了,在测试环境的unix上也是一样,但是没有去调节测试环境的参数,最后直接上了生产,生产上的参数应该是设置过的,最后复习了下这个经典的TIME_WAIT状态状态

          tcp建立连接需要3个握手,但是关闭连接需要4个握手,关闭连接后主动关闭的一方会处于time_wait状态一段时间,这个是可以设置的,好像windows最少是30s,这个time_wait状态的目的大概有两个

1。防止上一次连接中的包,迷路后重新出现,影响新连接

(经过2MSL,上一次连接中所有的重复包都会消失)
2。可靠的关闭TCP连接
在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发
fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以
主动方要处于 TIME_WAIT 状态,而不能是 CLOSED

 

         这是tcp关闭连接的client/server直接的数据交互过程

        

 

 

还有一种close_wait

在客户端主动关闭时,服务器端也要被动关闭(服务器端也要主动调用closesocket),如果服务器端不被动关闭,客户端就收不到服务器端发来 的FIN,就一直在FIN_WAIT_2了,而此时服务器端只收到客户端发来的FIN(自己只向客户端发了ACK,没有向客户端发FIN),也一直停留在 CLOSE_WAIT

 出现大量close_wait的现象,主要原因是某种情况下对方关闭了socket链接,但是我方忙与读或者写,没有关闭连接。代码需要判断socket,一旦读到0,断开连接,read返回负,检查一下errno,如果不是AGAIN,就断开连接。

解决方法
基本的思想就是要检测出对方已经关闭的socket,然后关闭它。

可以参考tomcat server 源码如何检测client 关闭了socket,server端的socket可以循环的read,一旦出现timeout异常就可以关闭了

分享到:
评论

相关推荐

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

    在 TCP 连接中,TIME_WAIT 状态是一种特殊的状态,它表示客户端已经关闭连接,但是服务器端还没有关闭连接。TIME_WAIT 状态的出现是因为客户端需要等待服务器端的确认包,以确保连接已经完全关闭。 在 TIME_WAIT ...

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

    客户端主动断开连接时,服务器端没有正确关闭连接,导致了连接保持CLOSE_WAIT状态。这也表明了编程的重要性,在编写程序时需要注意关闭连接的正确性,以避免CLOSE_WAIT状态的出现。 CLOSE_WAIT问题的解决需要确保...

    关于释放time_wait连接多的方案

    TIME_WAIT是一种TCP连接的状态,当一个TCP连接被主动关闭时,客户端会进入TIME_WAIT状态,目的是确保任何可能在网络中滞留的数据包能够被正确处理,避免这些数据包在未来的新连接中被误解释。然而,在高并发场景下,...

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

    当一个TCP连接主动关闭后,发送端会进入TIME_WAIT状态,等待一段时间(通常称为2MSL,即最大段生存期的两倍)再释放连接。在此期间,任何迟到的数据包都可以被正确识别并处理,避免了新连接与旧连接的混淆。这个状态...

    [线上问题] “服务端长连接与客户端短连接引起Nginx产生大量\"TIME_WAIT\"状态的线程”的问题分析解决

    本文讨论了在线上环境中,服务端长连接和客户端短连接配置不当导致Nginx服务器产生大量“TIME_WAIT”状态线程的问题,同时提供了问题的分析和解决方法。本文主要涉及的网络编程知识点包括长连接与短连接的定义和区别...

    减少Linux服务器过多的TIME_WAIT

    在TCP协议中,主动关闭连接的一方,在发送完对被动方FIN(finishing,结束)请求的ACK(acknowledgement,确认)后,会进入TIME_WAIT状态,并在此状态下停留2倍的MSL(最大分段生存期)时间。这是因为TCP设计者考虑...

    linux内核协议栈TCP time_wait原理、优化、副作用1

    time_wait状态只会在主动关闭连接的一方出现,即发起FIN(结束)的那端。在正常的四次挥手关闭连接流程中,这一端在最后收到ACK后会进入time_wait状态。如果开启了快速回收功能,time_wait状态的持续时间通常小于1秒...

    TCP TIME_WAIT常见解决方法-hanwei_1049-ChinaUnix博客1

    TCP TIME_WAIT状态是TCP连接生命周期中的一个重要阶段,它发生在主动关闭连接的一方(通常称为客户端)在连接关闭后等待一段时间,以确保所有在网络中可能残留的数据片段都被接收并确认。这个阶段的存在是为了避免旧...

    [服务器性能优化]Linux下高并发socket最大连接数和sysctl(time_wait)设置

    其次,`time_wait`状态是TCP连接生命周期的一部分,表示一个连接在主动关闭后进入的状态,等待足够的时间以确保所有数据已传输。默认情况下,`time_wait`状态会持续2MSL(最大报文段生存时间),这可能占用了大量...

    TCP_SYNC基础

    TIME_WAIT 状态是一个非常重要的状态,它的主要目的是等待足够的时间让 ACK 包到达服务器端,以便确保连接的关闭。如果服务器端没有收到 ACK 包,会重新发送 FIN 包,直到服务器收到 ACK 包。TIME_WAIT 状态的等待...

    探讨如何减少Linux服务器TIME_WAIT过多的问题

    TIME_WAIT状态是TCP连接生命周期中的一个阶段,它在客户端主动关闭连接后出现,服务器端的端口在一段时间内保持此状态,以便处理可能在网络中漂浮的旧数据包。这种状态对于确保连接的可靠关闭至关重要,但过多的TIME...

    Time-wait详解和解决方案.docx

    如果主动关闭方不进入`TIME_WAIT`状态而立即关闭连接,那么当被动关闭方未收到确认并重新发送FIN时,可能会干扰到一个新的连接。通过等待一段时间,可以确保这些分组在网络中消失,不会对新的连接造成影响。 2. **...

    tcp状态解析和windowsio说明

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

    tomcat-timewait-closewait.zip

    1. **Time_wait**: 当一个TCP连接的一方(通常是我们主动关闭连接的客户端)发送了FIN(结束)报文段后,它会进入Time_wait状态。在这个状态下,该方等待足够的时间确保对方收到其ACK,以完成四次挥手的最后一步。这...

    tcp-tw-reuse为什么是默认关闭的590 - 607

    TIME_WAIT状态的出现是因为TCP的四次挥手关闭连接过程中,主动关闭连接的一方(客户端)在最后一次ACK之后进入此状态。这个状态的持续时间是2倍的MSL(最大分片生存时间),其目的主要有两个: 1. 防止历史连接中的...

    TCP状态变迁图-描述各个状态之间变迁

    无论是主动关闭连接的一方还是被动关闭的一方,完成所有状态转换后最终都会回到CLOSED状态,表示TCP连接完全关闭。 TCP状态变迁图清楚地展示了这些状态的流转,有助于理解和排查网络通信中的问题。理解TCP连接的...

    10如何提升TCP四次挥手的性能?1

    TIME_WAIT状态常常成为优化的目标,因为它可能导致大量占用连接资源。然而,这个状态对于TCP的可靠性和防止旧数据包重传至关重要。TIME_WAIT状态的存在是为了确保被动方能接收到最后的ACK,并且避免旧连接的重叠问题...

Global site tag (gtag.js) - Google Analytics