1. 程式人生 > >TCP為什麼要3次握手和4次揮手時等待2MSL

TCP為什麼要3次握手和4次揮手時等待2MSL

和TCP三次同步握手不一樣的是,TCP關閉連線用四次握手來實現,即A--->B Fin, B--->A ACK, B--->A Fin, A--->B ACK,為什麼要這樣?

A--->B Fin, B--->A ACK ,A屬於主動關閉方,收到B的ACK後,A到B的方向連線關閉,即half shutown ,這時A不能再發送資料了。

這種狀態下B還是可以單向傳送資料的,B的資料傳送完畢,也做關閉動作了:

B--->A Fin, A--->B ACK

B收到ACK,關閉連線。但是A無法知道ACK是否已經到達B,於是開始等待?等待什麼呢?假如ACK沒有到達B,B會為FIN這個訊息超時重傳 timeout retransmit ,那如果A等待時間足夠,又收到FIN訊息,說明ACK沒有到達B,於是再發送ACK,直到在足夠的時間內沒有收到FIN,說明ACK成功到達。這個等待時間至少是:B的timeout + FIN的傳輸時間,為了保證可靠,採用更加保守的等待時間2MSL。

MSL,Maximum Segment Life,這是TCP 對TCP Segment 生存時間的限制。

TTL, Time To Live ,IP對IP Datagram 生存時間的限制,255 秒,所以 MSL一般 = TTL = 255秒

A發出ACK,等待ACK到達對方的超時時間 MSL,等待FIN的超時重傳,也是MSL,所以如果2MSL時間內沒有收到FIN,說明對方安全收到FIN。