1. 程式人生 > >TCP IP之TIME_WAIT狀態

TCP IP之TIME_WAIT狀態

     前段時間碰到一個伺服器掛死問題,原因是由於伺服器上的TCP連線數過多導致程式無法新建SOCKET連線,最後該問題解決了。中間在定位問題的時候檢視但是作業系統上的TCP連線數,有幾百個連線處於TIME_WAIT狀態,這個TIME_WAIT到底是表示什麼意思呢?

    於是重新查看了下TCP協議,終於理清了,這裡記錄一下。下面的是TCP IP的狀態變遷圖:

   

       從中可以看得出,TCP在建議一個連線後到處於TIME_WAIT狀態有三種情況,但無論是那種情況一定是發起了主動關閉,並且已經收到了對方的FIN,這時候進入了TIME_WAIT 狀態。TIME_WAIT狀態的時間是2倍的MSL(最大生存時間),在TIME_WAIT狀態TCP連線實際上已經斷掉,但是該插口又不能被新的連線例項使用。這種情況一般都是程式中建立了大量的短連線,而作業系統中可以使用埠使用做了限制,那麼非常容易出現連線數佔滿的異常(比如java中的java.net.SocketException No buffer space available (maximum connections reached

?異常)。可以通過修改TcpTimedWaitDelay的值縮短TIME_WAIT狀態時間。

       那麼為什麼需要TIME_WAIT狀態呢?一個重要的原因就是防止回給對方FIN的ACK丟失。由於服務端並不會對該ACK做確認,因此只能等待一段時間寄希望於服務端收到,如果服務端沒有收到對其FIN的確認會繼續發一個FIN,這樣客戶端還有機會繼續回一個ACK。另外一個原因是防止上一次連線中遲到的資料包影響新的連線,而在TIME_WAIT狀態中這些包會被丟棄。