Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

当某一个节点的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

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理