TCP的CLOSE_WAIT状态
来源:互联网 发布:php大牛简历 编辑:程序博客网 时间:2024/04/29 17:13
1 在客户端主动关闭时,服务器端也要被动关闭(服务器端也要主动调用closesocket),如果服务器端不被动关闭,客户端就收不到服务器端发来的FIN,就一直在FIN_WAIT_2了,而此时服务器端只收到客户端发来的FIN(自己只向客户端发了ACK,没有向客户端发FIN),也一直停留在CLOSE_WAIT
出现大量close_wait的现象,主要原因是某种情况下对方关闭了socket链接,但是我方忙与读或者写,没有关闭连接。代码需要判断socket,一旦读到0,断开连接,read返回负,检查一下errno,如果不是AGAIN,就断开连接。
解决方法
基本的思想就是要检测出对方已经关闭的socket,然后关闭它。
1.代码需要判断socket,一旦read返回0,断开连接,read返回负,检查一下errno,如果不是AGAIN,也断开连接。(注:在UNP 7.5节的图7.6中,可以看到使用select能够检测出对方发送了FIN,再根据这条规则就可以处理CLOSE_WAIT的连接)
2.给每一个socket设置一个时间戳last_update,每接收或者是发送成功数据,就用当前时间更新这个时间戳。定期检查所有的时间戳,如果时间戳与当前时间差值超过一定的阈值,就关闭这个socket。
3.使用一个Heart-Beat线程,定期向socket发送指定格式的心跳数据包,如果接收到对方的RST报文,说明对方已经关闭了socket,那么我们也关闭这个socket。
4.设置SO_KEEPALIVE选项,并修改内核参数
参考
http://blog.chinaunix.net/u/12592/showart_2059174.html
- TCP的CLOSE_WAIT状态
- TCP的CLOSE_WAIT状态
- TCP close_wait 状态的解释
- 研究TCP的close_wait状态
- TCP close_wait 状态的解释
- TCP close_wait 状态的解释
- tcp中close_wait状态出现的原因
- TCP状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题
- TCP状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题
- TCP状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题
- TCP状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题
- TCP状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题
- TCP状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题
- TCP的CLOSE_WAIT和TIME_WAIT状态
- TCP状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题
- TCP状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题
- TCP状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题
- TCP状态SYN_RECV , CLOSE_WAIT
- mysql foreign key ... references ... on delete cascade
- 金山二十年长青的七种武器(2008-11-17 09:05:11)[转雷军新浪博客]
- NET-密码强度的验证
- DB2存储过程(Merge关键字的使用)
- 获取来电时的电话号码
- TCP的CLOSE_WAIT状态
- CA-NFS:2009存储界的一篇雄文
- 利用Axis2开发WebService(1)---安装配置Axis2
- 使用PLSQL Developer时,“ORA-12154: TNS:无法解析指定的连接标识符”问题的一个解决办法
- USE_HASH
- 自己动手写iPhone wap浏览器之预备篇
- sp公司彩信网络测试报告
- JavaScript实现报表展示
- [转]常用图形学名词解释