【漫畫】TCP 第四次揮手時,爲啥要等待 2MSL 才進行關閉?

前情回顧:【漫畫】TCP 斷開連接爲什麼是四次揮手,不是二次揮手 / 三次揮手?

MSL 是 Maximum Segment Lifetime 英文的縮寫,中文可以譯爲 “報文最大生存時間”,他是任何報文在網絡上存活的最長時間,超過這個時間報文將被丟棄。而 2MSL 的意思就是 2 倍的 MSL 的意思。

小萌:這種情況下,那服務器會一直收不到客戶端的迴應,所以這種情況是和只進行三次揮手的情況類似的,服務器沒有收到迴應,服務器就無法知道到底客戶端有沒有收到服務器斷開的請求。

如果客戶端收到了,那還好,皆大歡喜客戶端和服務器端都斷開連接;

如果客戶端沒有收到(爲啥這麼說呢?雖然客戶端已經收到了,但是客戶端沒有迴應呀~,沒有迴應誰知道你到底收沒收到,所以服務器不知道客戶端收到沒有,就好比你自己撿了 100 塊錢,你不交給警察叔叔,那麼警察叔叔怎麼知道你撿沒撿 100 塊呢?),客戶端還一直傻傻地在那裏等着服務器繼續發送消息。

服務器無法判斷客戶端是否收到,這種情況本身就是一種不可靠的情況,堂堂號稱可靠的 TCP 的連接出現這種情況豈不是要被笑掉大牙?

喬戈裏:小萌你說得很好,也因此出現了客戶端要等待 2MSL 的情況。爲了保證客戶端最後一次揮手的報文能夠到達服務器,如果第四次揮手的報文段丟失了,服務器會超時重傳這個第三次揮手的報文段,所以客戶端不是直接進入 CLOSED,而是要保持 TIME_WAIT(等待 2MSL 就是 TIME_WAIT)就起到作用了,當再次收到服務器的超時重傳的斷開連接的第三次揮手的請求的時候,客戶端會繼續給服務器發送一個第四次揮手的報文,能夠保證對方(服務器)收到客戶端的迴應報文,最後客戶端和服務器正確的關閉連接。

喬戈裏:如果 Client(客戶端)直接 CLOSED(關閉),然後又再向 Server(服務器端)發起一個新連接,我們不能保證這個新連接與剛關閉的連接的端口號是不同的。也就是說有可能新連接和老連接的端口號是相同的。一般來說不會發生什麼問題,但是還是有特殊情況出現:假設新連接和已經關閉的老連接端口號是一樣的,如果前一次連接的某些數據仍然滯留在網絡中,這些延遲數據在建立新連接之後纔到達 Server,由於新連接和老連接的端口號是一樣的,於是,TCP 協議就認爲那個延遲的數據是屬於新連接的,這樣就和真正的新連接的數據包發生混淆了。所以 TCP 連接還要在 TIME_WAIT 狀態等待 2 倍 MSL,這樣可以保證本次連接的所有數據都從網絡中消失。

小明與女神的對話: 所處的網絡環境:如果客戶端不等待 2MSL 直接進行關閉,前一次的連接的數據還在網絡中

這個時候小明以爲他的消息會在這 2MSL 中的時間中消失(小明以爲這個 TCP 是正常的四次揮手),悄悄說了一句女神的壞話,但是悲劇的是這個小明所在的網絡環境不是可靠的沒有等待 2MSL 的網絡環境,並沒有消失,因此如果沒有 2MSL 的等待時間上一次的小明說的壞話的數據包還在網絡中。

你說好巧不巧,小明和女神重新建立了連接以後,端口號還是之前的端口號,ip 地址也沒變,於是小明和女神上一次說壞話聊天的記錄,重新送到了女神那裏。

於是女神收到了小明說的壞話,然後小明就。。。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/qTzZby4t6paYztWHMqDDBA