Posted on 2009-04-29 14:30
Prayer 閱讀(3939)
評論(1) 編輯 收藏 引用 所屬分類:
SOCKET
在HTTP應用中,存在一個問題,SERVER由于某種原因關閉連接,如KEEPALIVE的超時,這樣,作為主動關閉的SERVER一方就會進入 FIN_WAIT2狀態,但TCP/IP協議棧有個問題,FIN_WAIT2狀態是沒有超時的(不象TIME_WAIT狀態),所以如果CLIENT不關閉,這個FIN_WAIT_2狀態將保持到系統重新啟動,越來越多的FIN_WAIT_2狀態會致使內核crash。
產生原因:
1。常連接并且當連接一直處于IDLE狀態導致SERVER CLOSE時,CLIENT編程缺陷,沒有向SERVER 發出FIN和ACK包
2。APACHE1.1和APACHE1.2增加了linger_close()函數,前面的帖子有介紹,這個函數可能引起了這個問題(為什么我也不清楚)
解決辦法:
1。對FIN_WAIT_2狀態增加超時機制,這個特性在協議里沒有體現,但在一些OS中已經實現
如:LINUX、SOLARIS、FREEBSD、HP-UNIX、IRIX等
2。不要用linger_close()編譯
3。用SO_LINGER代替,這個在某些系統中還能很好地處理
4。增加用于存儲網絡連接狀態的內存mbuf,以防止內核crash
5。DISABLE KEEPALIVE