1. 程式人生 > >TCP四次揮手客戶端連線關閉連結為什麼要等待2MSL?

TCP四次揮手客戶端連線關閉連結為什麼要等待2MSL?

MSL(maximun segment Lifetime): 報文的最大生存時間, 是任何報文在網路上生存的最大時間。

如果client直接closed, 那麼由於IP協議的不可靠性或者是其它的網路原因, 導致Server沒有收到客戶端最後回覆的ACK。那麼伺服器就會在超時之後繼續傳送FIN,此時由於客戶端已經CLOSED了,就找不到與重發的FIN對應的連線,最後Server就會收到RST(表示復位、用來異常的關閉連線)而不是ACK。 Server就會以為是連線錯誤把問題報告給高層。這樣的情況雖然不會造成資料丟失,但是卻導致TCP不符合可靠連線的要求。所以,Client不是直接進入CLOSED,而是要保持TIME_WAIT,當再次受到FIN的時候,能夠保證對方收到ACK,最後正確的關閉連線。

如果client直接closed,然後又向server發起了一個新連線,我們不能保證這個新連線和剛關閉的連線的埠號是不同的。假設新連線和已經關閉的老埠號是一樣的,如果前一次滯留的某些資料仍然在網路中,這些延遲資料會在新連線建立後到達Server,所以socket就認為那個延遲的資料是屬於新連線的,資料包就會發生混淆。所以client要在TIME_WAIT狀態等待2倍的MSL,這樣保證本次連線的所有資料都從網路中消失。