TCP連接中的TIME_WAIT狀態

1 TCP關閉時的四次握手
Tcp連接在關閉的的時候,執行的是一個四次握手的過程,下圖是客戶端發起的關閉時客戶端和服務器的狀態轉換圖

具體過程如下:
1、 客戶端發送FIN報文段,進入FIN_WAIT_1狀態。
2、 服務器端收到FIN報文段,發送ACK表示確認,進入CLOSE_WAIT狀態。
3、 客戶端收到FIN的確認報文段,進入FIN_WAIT_2狀態。
4、 服務器端發送FIN報文端,進入LAST_ACK狀態。
5、 客戶端收到FIN報文端,發送FIN的ACK,同時進入TIME_WAIT狀態,啓動TIME_WAIT定時器,超時時間設爲2MSL。
6、 服務器端收到FIN的ACK,進入CLOSED狀態。
7、 客戶端在2MSL時間內沒收到對端的任何響應,TIME_WAIT超時,進入CLOSED狀態。
從上圖中可以看出,client在發出server 端fin的ack以後,進入了time_wait的狀態,知道2MSL以後,纔會關閉。先來解釋下2MSL,max segment lifetime,最大生成時間。MSL的值在一般的實現中取30s,有些實現採用2分鐘。在TCP的狀態機中的“被動關閉”,從CLOSE_WAIT到 LAST_ACK中有一個如下的規則:當T C P執行一個主動關閉,併發回最後一個A CK,該連接必須在TIME_WAIT狀態停留的時間爲2倍的MSL。這樣可讓TCP再次發送最後的ACK以防這個ACK丟失。個規則導致一個後果就是在 這個2MSL的時間內,該地址上的鏈接(客戶端地址、端口和服務器端的地址、端口)不能被使用。比如我們在建立一個鏈接後關閉鏈接然後迅速重啓鏈接,那麼 就會出現端口不可用的情況。
2 time_wait狀態的必要性

如果不考慮報文延遲、丟失,確認延遲、丟失等情況,TIME_WAIT的確沒有存在的必要。當網絡在不理想的情況下通常會有報文的丟失延遲發生,讓我們看下面的一個特例:
客戶端進入發送收到四次握手關閉的最後一個ACK後,進入TIME_WAIT同時發送ACK,如果其不停留2MSL時間,而是馬上關閉連接,銷燬連接上的資源,當發送如下情況時,將不能正常的完成四次握手關閉:
客戶端發送的ACK在網路上丟失,這樣服務器端收不到最後的ACK,重傳定時器超時,將重傳FIN到客戶端,由於客戶端關於該連接的所有資源都釋放,收到重傳的FIN後,它沒有關於這個FIN的任何信息,所以向服務器端發送一個RST報文端,服務器端收到RST後,認爲搞連接出現了異常(而非正常關閉)。
所以,在TIME_WAIT狀態下等待2MSL時間端,是爲了能夠正確處理第一個ACK(最長生存時間爲MSL)丟失的情況下,能夠收到對端重傳的FIN(最長生存時間爲MSL),然後重傳ACK。
是否只要主動關閉方在TIME_WAIT狀態下停留2MSL,四次握手關閉就一定正常完成呢?
答案是否定的?可以考慮如下的情況,

TIME_WAIT狀態下發送的ACK丟失,LAST_ACK時刻設定的重傳定時器超時,發送重傳的FIN,很不幸,這個FIN也丟失,主動關閉方在TIME_WAIT狀態等待2MSL沒收到任何報文段,進入CLOSED狀態,當此時被動關閉方並沒有收到最後的ACK。所以即使要主動關閉方在TIME_WAIT狀態下停留2MSL,也不一定表示四次握手關閉就一定正常完成。
結論:在TIME_WAIT下等待2MSL,只是爲了盡最大努力保證四次握手正常關閉。確保老的報文段在網絡中消失,不會影響新建立的連接
考慮如下的情況,主動關閉方在TIME_WAIT狀態下發送的ACK由於網絡延遲的原因沒有按時到底(但並沒有超過MSL的時間),導致被動關閉方重傳FIN,在FIN重傳後,延遲的ACK到達,被動關閉方進入CLOSED狀態,如果主動關閉方在TIME_WAIT狀態下發送ACK後馬上進入CLOSED狀態(也就是沒有等待)2MSL時間,則上述的連接已不存在:現在考慮下面的情況,假設上述的鏈接的四元組爲(192.201.0.80:23,192.201.0.85:5555),由於連接已關閉,我們可以馬上建立一個新的連接,並且這個連接的四元組也是(192.201.0.80:23,192.201.0.85:5555),那麼當上一個連接的重傳FIN到達主動關閉方時,被新的連接所接受,這將導致新的連接被複位,很顯然,這不是我們希望看到的事情。
新的連接要建立,必須是在主動關閉方和被動關閉方都進入到CLOSED狀態之後纔有可能。所以,最有可能導致舊的報文段影響新的連接的情況是:
在TIME_WAIT狀態之前,主動關閉方發送的報文端在網絡中延遲,但是TIME_WAIT設定爲2MSL時,這些報文端必然會在網絡中消失(最大生存時間爲MSL)。被動關閉方最有可能影響新連接的報文段就是我們上面討論的情況,對方ACK延遲到達,在此之前重傳的FIN,這個報文端發送之後,TIME_WAIT的定時器超時時間肯定大於MSL,在1MSL時間內,這個FIN要麼在網絡中因爲生成時間到達而消失,要麼到達主動關閉方被這確的處理,不會影響新建立的連接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章