Posted on 2009-04-11 13:49
Prayer 閱讀(5440)
評論(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