詼諧的談談TCP三次握手和四次揮手

CodeEvil發表於2020-12-12

這幾天面試校招生,需要考量一下他們的計算機網路基礎,就問了這個老生常談的問題,說一下TCP三次握手和四次揮手,為什麼揮手比握手要多一次?

其實這個問題幾乎所有人都能回答,甚至有的回答的很"標準",完全把課本上的答案背了下來說了一遍,甚至還知道SYN,ACK標誌位,但是這些東西對我來說沒有什麼意義,因為這些標誌位換成別的代號照樣能完成三次握手和四次揮手。其實我想要知道的就是你怎麼理解這個過程,三次握手的目的是什麼?解決了什麼問題,為什麼不採取其他方案?比如二次握手或者四次握手?這才是關鍵所在。

其實三次握手的過程就是一個讓客戶端和服務端雙方都確認自己傳送資料及接收資料能力正常的過程,這樣才能實現全雙工通訊。

我們可以來模擬一下"握手"的過程,實際上“握手”這個詞不太好理解,因為握手的場景是兩個人站在一起面對面的,雙方都能夠“坦誠相見”,不太好聯想到雙方站這麼近還需要想辦法建立連線的原因。實際上客戶端和伺服器相差可能十萬八千里,它們甚至都不確定對方是否還有電,是否還活著。

那我們就假設世界末日了,世界上只剩下兩個人小A(客戶端)和小B(服務端),他們人手一個無線電傳送/接收器,他們都不確定自己的機器是否是壞的,有可能傳送不了資料,也有可能接收不了資料,這個時候小A和小B想要保持聯絡怎麼辦?答案就是3次握手。

1:小A給小B傳送了一條訊息:"小B你在嗎?over"。-----------假設小B收到了訊息,那麼小B能夠確認小A的機器能夠傳送資料,自己的機器能夠接收資料。而小A還在焦急等待中。。啥也不知道

     ------------------------- 第一次握手結束

2:小B給小A傳送了一條訊息:"小A我能收到你訊息,太好了"。-------------假設小A收到了小B的回覆, 那麼小A能夠確認自己的機器既能發出去又能接收,小A高興的不得了。而小B不確定自己的訊息小A是否收到,因此不確定自己傳送功能是否正常,只知道自己接收訊息正常。

     -------------------------  第二次握手結束

3:小A又給小B傳送一條訊息:"小B我也能收到你的訊息,我們倆的機器都沒有問題,接下來我們可以持續保持通訊了"。-------------------假設小B收到小A的訊息,那麼他們雙方都確認了他們的機器完全正常。

    -------------------------  第三次握手結束

為什麼假設都是對方能收到訊息呢?因為如果收不到訊息,就沒有接下來的握手了,也別想建立任何連線的,因此不是每一次試圖建立TCP連線都是三次握手,而是每一次成功建立TCP連線的都是三次握手。

假如說只有2次握手,第二次握手結束,小B其實是不確認自己傳送的訊息小A是否能收到的,有可能小B訊息傳送是壞的,有可能小A的訊息接收是壞的,總之導致最後小A壓根沒收到小B回覆,如果這時小B就貿然認為建立了連線,那麼有可能他要等很久都收不到小A發的任何訊息了,因為小A並沒有收到回覆。4次握手就不用說了,根據上面的場景模擬,完全沒必要畫蛇添足。

3次握手看上去是不是也就那樣?沒有什麼高階的,其實就是一個相互確認的遊戲而已。

那麼講講四次揮手,為什麼會多一次?

假設小A和小B連續網聊了一個月,他們終於厭倦了對方,不想繼續保持聯絡,但是他們都還有最後的一些話要說(有最後的訊息要傳送),於是他們同時編輯併傳送著最後想要說的話,接下來開始4次揮手:

1:小A想要說的都傳送完了,於是給小B發了一條訊息:“小B,我想說的都發完了,你看一下你都收到了沒有,我做好準備跟你說再見了”-----------------假設小B收到小A的訊息,小B知道小A的的訊息都發完了,準備好再見了。

 ------------------------- 第一次揮手結束

2:小B回應小A了一條訊息:“好了,我知道你發完了,而且我都收到了,但是我還有些資訊沒發完,你再等我會吧”----------------------------假設小A收到了小B的訊息,此時小A確認自己傳送出去的資料小B都收到了,但是要繼續等待小A的最後幾條訊息。

 ------------------------- 第二次揮手結束

3:過了一會小B最後幾條訊息也發完了,給小A又發一條訊息:“我現在也發完了,你看看有沒有收到?收到的話我們就結束吧”-------------------------------假設小A收到了小B的訊息,此時小A確認小B的訊息也發完了,可以說再見了。

 ------------------------- 第三次揮手結束

4:小A給小B傳送一條訊息:“你發的訊息我也都收到了,那就這樣吧,再見啦~!”------------------------------------假設小B收到了小A的訊息,此時小B確認了自己傳送的訊息小A都收到了,也和自己說再見了,小B就掐斷了機器天線。

 ------------------------- 第四次揮手結束

 

所以整體來看,四次揮手相比三次握手,就是多了一次小B資料傳送完畢的確認過程,也就是第三次握手,假設小B沒有話想對小A說,只有小A給小B發訊息,那麼小A傳送完畢後,小B就無需等待,可以直接傳送我都收到啦,那就再見吧的訊息。小A和小B就可以直接結束了,這時只需要二次揮手就可以完美結束關係,可是TCP是全雙工通訊啊,雙方都要收發資料,這就直接變成4次揮手了,主要還是雙方話都太多~

希望這篇文章能幫到那個對TCP握手揮手完全迷茫的你

相關文章