`
flyPig
  • 浏览: 136795 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

TCP Close_Wait问题

阅读更多
生成原因
如果我们的Client程序处于CLOSE_WAIT状态的话,说明Socket是被动关闭的.
因为如果是Server端主动断掉当前连接的话,那么双方关闭这个TCP连接共需要四个packet:
Server  --->  FIN  --->  Client
Server  <---  ACK  <---  Client
这时候Server端处于FIN_WAIT_2状态,也就是传说中的半连接状态;而我们的程序处于CLOSE_WAIT状态。
Server  <---  FIN  <---  Client
这时Client发送FIN给Server,Client就置为LAST_ACK状态。
Server  --->  ACK  --->  Client
Server回应了ACK,那么Client的Socket才会真正置为CLOSED状态

既然如此,我们的程序处于CLOSE_WAIT状态,而不是LAST_ACK状态,说明还没有发FIN给Server,那么可能是在关闭连接之前还有许多数据要发送或者其他事要做,导致没有发FIN

原因分析
1. 难道Client根本不知道自己收到了FIN包
当Server调用closesocket的时候,Client正在read中,这时候有可能对方发送的FIN包我没有收到,而是由TCP代回了一个ACK包,所以我这边套接字进入CLOSE_WAIT状态.但是我在read的时候,会判断返回值是否已出错,是错误值的话就主动closesocket,这样防止没有接收到FIN包。

2. 为什么大量连接都处于CLOSE_WAIT,难道服务器端总是主动断开连接?
有一种可能就是没有重用本地地址和端口,一个端口不行,总是换另外一个来用,导致大量的端口进入CLOSE_WAIT状态。也许我们无法避免被冻结在CLOSE_WAIT状态永远不出现,但起码可以保证不会占用新的端口。加上类似的代码保证重用
sc.setReuseAddress(true);


3. 网上查到强行关闭的问题
socket.setSoLinger(boolean on,int linger)

设置SO_LINGER为0,CloseSocket的时候,不论是否有排队数据未发送或未被确认。这种关闭方式称为“强行关闭”,因为Socket的虚电路立即被reset,尚未发出的所有数据都会丢失。在远端的read都会抛出IOException.

4.最终的问题
根据分析得到,只要Client端主动调用了closeSocket,一定会发送FIN包,并改变自己的状态。因此debug程序代码,发现问题的真正所在。因为系统关闭socket是异步调用,在关闭事件执行之前,有异常抛出,导致异步EventHandlerThread死掉,然后事件被丢弃。想办法fix了这个问题,让
sc.close();
被真正执行了,一切OK.

总结
    当发起主动关闭的左边这方发送一个FIN过去后,右边被动关闭的这方要回应一个ACK,这个ACK是TCP回应的,而不是应用程序发送的,此时,被动关闭的一方就处于CLOSE_WAIT状态了。如果此时被动关闭的这一方不再继续调用closesocket,那么他就不会发送接下来的FIN,导致自己老是处于CLOSE_WAIT。这个时候如果去做read或者write,就会抛出IOException,必须成功调用closesocket,才会发送一个FIN给主动关闭的这一方,同时也使得自己的状态变迁为LAST_ACK。
分享到:
评论

相关推荐

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

    关于系统端口出现CLOSE_WAIT状态的解决方案,讲解明确清晰,值得参考

    tcp连接出现close_wait状态?_tcp_close_

    tcp连接出现close_wait状态?

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

    详细描述TCP的各个状态,初学者可以快速理解掌握tcp状态图

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

    对于服务器挂起中的CLOSE_WAIT & FIN_WAIT2 解决方案。

    TCP_CloseWaitProblem

    tcp4 0 0 127.0.0.1.50937 127.0.0.1.8383 CLOSE_WAIT 这次我们了解到的是,只有在应用程序显式调用close或终止应用程序时,才可以接收等待CLOSE_WAIT的关闭。 因此,如果您在这种CLOSE_WAIT状态下无限期地等待,...

    获取TCP,UDP服务端口号.rar

    case MIB_TCP_STATE_CLOSE_WAIT: m_PortList.SetItemText(i,2,"CLOSE-WAIT"); break; case MIB_TCP_STATE_CLOSING: m_PortList.SetItemText(i,2,"CLOSING"); break; case MIB_TCP_...

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

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

    Tcp四次挥手.png

    1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。  2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个...

    TCP三次握手和四次挥手

    1. `CLOSE_WAIT`:四次挥手两次之后的状态,这个状态就是在等待代码当中调用`socket.close`方法,来进行后续的挥手过程!正常情况下一个服务器上不应该存在大量的`CLOST_WAIT`状态,如果大量存在大概率是代码的bug,...

    TCP_IP详解卷1

    18.6.3 FIN_WAIT_2状态 186 18.7 复位报文段 186 18.7.1 到不存在的端口的连接请求 187 18.7.2 异常终止一个连接 187 18.7.3 检测半打开连接 188 18.8 同时打开 189 18.9 同时关闭 191 18.10 TCP选项 191 18.11 TCP...

    tcp三次握手四次挥手.md

    tcp三次握手四次挥手 TCP(传输控制协议)的三次握手和四次挥手是用于建立连接和释放连接的重要过程。 三次握手的过程如下: ...此时,服务器进入CLOSE_WAIT状态,而客户端进入FIN_WAIT_2状态。 3. 服务器在处理完

    TCP-IP详解卷2:实现.part1

    《TCP-IP详解》共3卷,其他卷请到我空间下载,第2卷共分两个part,请下载完两个part后在解压。本书完整而详细地介绍了TCP/IP协议是如何实现的。书中给出了约500个图例,15 000行实际操作的C代码,采用举例教学的方法...

    TCP-IP详解卷3:TCP事务协议

    10.6 tcp_close函数 89 10.7 tcp_msssend函数 90 10.8 tcp_mssrcvd函数 91 10.9 tcp_dooptions函数 96 10.10 tcp_reass函数 98 10.11 小结 99 第11章 T/TCP实现:TCP输入 101 11.1 概述 101 11.2 预处理 103 11.3 ...

    TCP/IP详解 卷3:TCP事务协议、HTTP、NNTP和UNIX域协议

    10.6 tcp_close函数 10.7 tcp_msssend函数 10.8 tcp_mssrcvd函数 10.9 tcp_dooptions函数 10.10 tcp_reass函数 10.11 小结 第11章 T/TCP实现:TCP输入 11.1 概述 11.2 预处理 11.3 首部预测 11.4 被动打开的启动 ...

    TCP-IP详解卷三

    10.6 tcp_close函数 89 10.7 tcp_msssend函数 90 10.8 tcp_mssrcvd函数 91 10.9 tcp_dooptions函数 96 10.10 tcp_reass函数 98 10.11 小结 99 第11章 T/TCP实现:TCP输入 101 11.1 概述 101 11.2 预处理 103 11.3 ...

    TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议——高清文字(china-pub经典系列)

    10.6 tcp_close函数 89 10.7 tcp_msssend函数 90 10.8 tcp_mssrcvd函数 91 10.9 tcp_dooptions函数 96 10.10 tcp_reass函数 98 10.11 小结 99 第11章 T/TCP实现:TCP输入 101 11.1 概述 101 11.2 预处理 103 11.3 ...

    TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议

    10.6 tcp_close函数 89 10.7 tcp_msssend函数 90 10.8 tcp_mssrcvd函数 91 10.9 tcp_dooptions函数 96 10.10 tcp_reass函数 98 10.11 小结 99 第11章 T/TCP实现:TCP输入 101 11.1 概述 101 11.2 预处理 103 11.3 ...

    TCP-IP详解卷3:TCP事务协议,HTTP,NNTP和UNIX域协议.rar

    10.6 tcp_close函数 89 10.7 tcp_msssend函数 90 10.8 tcp_mssrcvd函数 91 10.9 tcp_dooptions函数 96 10.10 tcp_reass函数 98 10.11 小结 99 第11章 T/TCP实现:TCP输入 101 11.1 概述 101 11.2 预处理 103 11.3 ...

    TCP/IP详解part_2

    18.6.3 FIN_WAIT_2状态 186 18.7 复位报文段 186 18.7.1 到不存在的端口的连接请求 187 18.7.2 异常终止一个连接 187 18.7.3 检测半打开连接 188 18.8 同时打开 189 18.9 同时关闭 191 18.10 TCP选项 191 18.11 TCP...

Global site tag (gtag.js) - Google Analytics