Posted on 2009-04-11 13:49
Prayer 閱讀(5433)
評論(0) 編輯 收藏 引用 所屬分類:
SOCKET
當某一個節(jié)點的socket處于CLOSE_WAIT時,表示它收到了來自socket遠端節(jié)點的FIN請求,并向遠端節(jié)點發(fā)送了ACK。這個時候,該socket就會處于CLOSE_WAIT狀態(tài)。接下來,正常情況應(yīng)該是使用該socket的應(yīng)用負責發(fā)出關(guān)閉這個socket的命令,然后這個socket向遠端節(jié)點發(fā)出FIN,并進入正常關(guān)閉程序,直到socket完全關(guān)閉。如果這里提到的應(yīng)用程序沒有關(guān)閉socket,那么該socket就會一直出于CLOSE_WAIT狀態(tài),直至應(yīng)用程序關(guān)閉或者系統(tǒng)重啟。 下面的流程詳細描述了整個socket的關(guān)閉過程。
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>
因此,當發(fā)現(xiàn)某個socket長時間處于CLOSE_WAIT狀態(tài),應(yīng)該聯(lián)系應(yīng)用程序的工程師進行分析。從AIX的角度,我們可以對應(yīng)用程序和系統(tǒng)的一些參數(shù)進行設(shè)置,以減小socket處于CLOSE_WAIT的時間。要做到這一點,首先需要在應(yīng)用程序的socket屬性里通過setsockopt函數(shù)設(shè)置SO_KEEPALIVE屬性,然后修改系統(tǒng)的tcp_keepidle參數(shù)。默認的tcp_keepidle參數(shù)的值是14400,以半秒為單位,也就是2小時。修改方法如下:
# no -p -o tcp_keepidle=1200
http://www-900.ibm.com/cn/support/viewdoc/detail?DocId=2811018J20000