CLOSE_WAIT
来源:互联网 发布:md5判断密码正确java 编辑:程序博客网 时间:2024/05/01 23:00
最近遇到的一个关于socket.close的问题,在某个应用服务器出现的状况(执行netstat -np | grep tcp):
tcp 0 0 10.224.122.16:50158 10.224.112.58:8788 CLOSE_WAIT
tcp 0 0 10.224.122.16:37655 10.224.112.58:8788 CLOSE_WAIT
tcp 1 0 127.0.0.1:32713 127.0.0.1:8080 CLOSE_WAIT
tcp 38 0 10.224.122.16:34538 10.224.125.42:443 CLOSE_WAIT
tcp 38 0 10.224.122.16:33394 10.224.125.42:443 CLOSE_WAIT
tcp 1 0 10.224.122.16:18882 10.224.125.10:80 CLOSE_WAIT
tcp 1 0 10.224.122.16:18637 10.224.125.10:80 CLOSE_WAIT
tcp 1 0 10.224.122.16:19655 10.224.125.12:80 CLOSE_WAIT
........................................
总共出现了200个CLOSE_WAIT的socket.而且这些socket长时间得不到释放.下面我们来看看为什么会出现这种大量socket的CLOSE_WAIT情况
首先我们要搞清楚的是,这个socket是谁发起的,我们可以看到122.16这台机器开了很多端口,而且端口号都很大,125.12 或者125.10上的端口都是很常见服务器端口,所以122.16上这么多CLOSE_WAIT
的socket是由122.16开启的,换句话说这台机器是传统的客户端,它会主动的请求其他机器的服务端口.
要搞清楚为什么会出现CLOSE_WAIT,那么首先我们必须要清楚CLOSE_WAIT的机制和原理.
假设我们有一个client, 一个server.
当client主动发起一个socket.close()这个时候对应TCP来说,会发生什么事情呢?如下图所示.

client首先发送一个FIN信号给server, 这个时候client变成了FIN_WAIT_1的状态, server端收到FIN之后,返回ACK,然后server端的状态变成了CLOSE_WAIT.
接着server端需要发送一个FIN给client,然后server端的状态变成了LAST_ACK,接着client返回一个ACK,然后server端的socket就被成功的关闭了.
从这里可以看到,如果由客户端主动关闭一链接,那么客户端是不会出现CLOSE_WAIT状态的.客户端主动关闭链接,那么Server端将会出现CLOSE_WAIT的状态.
而我们的服务器上,是客户端socket出现了CLOSE_WAIT,由此可见这个是由于server主动关闭了server上的socket.
那么当server主动发起一个socket.close(),这个时候又发生了一些什么事情呢.

从图中我们可以看到,如果是server主动关闭链接,那么Client则有可能进入CLOSE_WAIT,如果Client不发送FIN包,那么client就一直会处在CLOSE_WAIT状态(后面我们可以看到有参数可以调整这个时间).
那么现在我们要搞清楚的是,在第二中场景中,为什么Client不发送FIN包给server.要搞清楚这个问题,我们首先要搞清楚server是怎么发FIN包给client的,其实server就是调用了
socket.close方法而已,也就是说如果要client发送FIN包,那么client就必须调用socket.close,否则就client就一直会处在CLOSE_WAIT(但事实上不同操作系统这点的实现还不一样,
http://ahuaxuan.iteye.com/blog/657511
- CLOSE_WAIT
- CLOSE_WAIT
- CLOSE_WAIT
- CLOSE_WAIT
- CLOSE_WAIT
- CLOSE_WAIT问题解决
- CLOSE_WAIT解决方法
- CLOSE_WAIT问题解决
- TIME_WAIT,CLOSE_WAIT
- TIME_WAIT、 CLOSE_WAIT
- CLOSE_WAIT问题
- CLOSE_WAIT知识点
- 关于TCP的CLOSE_WAIT
- TIME_WAIT及CLOSE_WAIT
- CLOSE_WAIT生成的原因
- CLOSE_WAIT生成原因
- TCP的CLOSE_WAIT状态
- CLOSE_WAIT状态分析
- SAFEARRAY使用实例
- POJ 3159 Candies 差分约束 spfa+栈+邻接表
- [每日一题] 11gOCP 1z0-052 :2013-09-20 BIGFILE | SMALLFILE TABLESPACE.....................B43
- VC6 + OpenCV1.0实现图片缩放显示
- 手工冷备份脚本
- CLOSE_WAIT
- SQLPlus中的COPY指令学习
- Linux高性能服务器编程(笔记1)
- 黑马程序员_java基础加强(一) JDK1.5新特性
- 格雷码
- Polya 原理 着色问题
- hdu_3729 I'm Telling the Truth 二分图匹配
- 线程实现生产者消费者实验
- hdu_1528 Card Game Cheater 二分图匹配