Posted on 2009-04-11 13:49
Prayer 阅读(5420)
评论(0) 编辑 收藏 引用 所属分类:
SOCKET
当某一个节点的socket处于CLOSE_WAIT时,表示它收到了来自socket远端节点的FIN请求,并向远端节点发送了ACK。这个时候,该socket就会处于CLOSE_WAIT状态。接下来,正常情况应该是使用该socket的应用负责发出关闭这个socket的命令,然后这个socket向远端节点发出FIN,并进入正常关闭程序,直到socket完全关闭。如果这里提到的应用程序没有关闭socket,那么该socket就会一直出于CLOSE_WAIT状态,直至应用程序关闭或者系统重启。 下面的流程详细描述了整个socket的关闭过程。
client server
<ESTABLISHED> <ESTABLISHED>
--> client sends <FIN> -->
<FIN_WAIT_1>
<CLOSE_WAIT>
<-- server sends <ACK> <--
<FIN_WAIT_2>
<LAST_ACK>
<-- server sends <FIN> <--
<TIME_WAIT>
--> client sends <ACK> -->
<CLOSED>
<CLOSED>
因此,当发现某个socket长时间处于CLOSE_WAIT状态,应该联系应用程序的工程师进行分析。从AIX的角度,我们可以对应用程序和系统的一些参数进行设置,以减小socket处于CLOSE_WAIT的时间。要做到这一点,首先需要在应用程序的socket属性里通过setsockopt函数设置SO_KEEPALIVE属性,然后修改系统的tcp_keepidle参数。默认的tcp_keepidle参数的值是14400,以半秒为单位,也就是2小时。修改方法如下:
# no -p -o tcp_keepidle=1200
http://www-900.ibm.com/cn/support/viewdoc/detail?DocId=2811018J20000