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