客戶端在接受到服務器的結束報文(FIN)後,不會直接進入CLOSE狀態,而是轉移到TIME_WAIT狀態。這個狀態客戶端連接要等待一段長爲2MSL時間,才能完全關閉。MSL是TCP報文段在網絡中的最大生存時間,RFC文檔建議2min。
TIME_WAIT狀態存在的原因有2點:
1)可靠地終止TCP連接。
2)保證讓遲來的TCP報文段有足夠的時間被識別並丟棄。
第一點很好理解,2端關閉過程都有發起(FIN)和收到應答(ACK)。
對於第二點,反過來思考,如果不存在TIME_WAIT狀態,應用程序能夠立即建立一個和剛關閉的連接相似的連接(四元組相同),新連接可以稱爲原連接的化身。化身連接有可能收到屬於原連接的遲到報文。顯然,這些數據屬於髒數據,不應該收到。
堅持2MSL時間TIME_WAIT狀態能夠確保網絡上兩個傳輸方向上尚未被接收到的、延遲的TCP報文完都消失(被路由器丟失)。