Linux 網路編程之TIME_WAIT狀態
剛剛開始看TCP socket的4次握手終止流程圖的時候,對於最後的TIME_WAIT狀態不是很理解.現在在回過頭來研究,發現TIME_WAIT狀態是一個很微妙狀態.之所以設計TIME_WAIT狀態的原因有2個原因:
- 使得TCP的全雙工系統串連能夠可靠的終止.
- 使得串連終止後網路上任然殘餘的發送給該串連的資料被丟棄而不至於被新串連接收.
在具體詳解這兩個原因之前,我們需要理解MSL(maxinum segment lifetime)這個概念.
每一個TCP 都必須有一個MSL值.這個值一般是2分鐘,但也不是固定的,不同的系統不一樣.無論是否出錯或者串連被斷開,總之,一個資料包在網路上能停留的最大時間是MSL.也就是說MSL是資料包的生命週期時間.操作這個時間,該資料包將會被丟棄而不被發送.而TIME_WAIT狀態持續的時間是MSL的兩倍,也就是2MSL時間.
TCP的可靠終止需要經過4次握手終止.如所示:首先,client 主動close,導致FIN發送給server,server接收到FIN後,給client回複一個ACK,之後,server會關閉和client的串連,即向client發送一個FIN,client接收到FIN之後,會發送一個ACK給server.此時client就進入TIME_WAIT狀態.如果server沒有收到ACK,server會重新發送一個FIN資訊給client,client會重發ACK,server然後繼續等待client發送一個ACK.這樣保證了雙方的可靠終止.2端都知道對方已經終止了.那麼,在這個TIME_WAIT時間中,可以重發ACK,如果client沒有收到FIN資訊,則TCP會向server發送一個RST資訊,這個資訊會被server解釋成error.
- 串連終止後網路上任然殘留的發送到該串連的資料被丟棄而不至於被新串連接收.
舉個例子:
在10.12.24.48 port:21和206.8.16.32 port:23(不必關心哪一端是server哪一端是client)之間建立了一個TCP串連A.然後此連結A被close掉了.然後此時又在10.12.24.48 port:21和206.8.16.32 port:23(不必關心哪一端是server哪一端是client)之間建立了一個新的TCP串連B.很可能A和B串連是有不同的應用程式建立的.那麼,當我們close掉A之後,網路上很有可能還有屬於A串連兩端的資料m正在網路上被傳送.而此時A被close掉了,重建立立了B串連,由於A和B串連的地址和連接埠都是一樣的.這樣,m資料就會被最終發送到B串連的兩端.這樣就造成了混亂,B接收到了原本資料A的資料.處於TIME_WAIT狀態的串連會禁止新的同樣的串連(如A,B)串連被建立.除非等到TIME_WAIT狀態結束,也就是2MSL時間之後.其中,一個MSL時間是為了網路上的正在被發送到該連結的資料被丟棄,另一個MSL使得應答資訊被丟棄.這樣,2MSL之後,保證重建立立的所得到的資料絕對不會是發往就串連的資料.
著作權申明:
轉載文章請註明原文出處http://blog.csdn.net/feiyinzilgd/archive/2010/09/19/5894446.aspx
並請聯絡譚海燕本人或者前往譚海燕個人首頁留言