TCP 3次握手 4次揮手

衣舞晨風發表於2018-02-13

3次握手的目的

三次握手的目的:是為了確認雙方都有收發資料的能力。

第一次: A->B,證明A有發訊息的能力。

第二次: ->B && B->A,證明B有收訊息,並且有發訊息的能力。

第三次: A->B,證明A有收訊息的能力。

二次握手達不到目的,四次多餘。

需4次揮手原因

由於TCP的半關閉特性,TCP連線時雙全工(即資料在兩個方向上能同時傳遞),因此,每個方向必須單獨的進行關閉。這個原則就是:當一方完成它的資料傳送任務後就能傳送一個FIN來終止這個方向上的連線。當一端收到一個FIN後,它必須通知應用層另一端已經終止了那個方向的資料傳送。即收到一個FIN意味著在這一方向上沒有資料流動了。

目的:保證伺服器與客戶端都能完全的接收對方傳送的資料。

經典的“兩軍通訊”問題

假設場景是這樣的:
在山的兩頭是紅軍1和紅軍2,山上是藍軍,紅軍1和2都不是藍軍的對手,想打敗藍軍只有一起動手。那麼紅軍1和2如何通訊才能確定雙方在同一個時間動手呢?

紅軍1的傳令軍成功偷偷越過大山告訴紅軍2,明天早上中午十二點一起動手;
紅軍2表示贊同,但是紅軍1並不確定紅軍2是否收到了訊息,貿然動手必定失敗,所以紅軍2的傳令軍越過大山告訴紅軍1收到了訊息;

但是這時候紅軍2並不確定傳令軍是否成功到達紅軍1告訴紅軍1收到了訊息,不敢獨自動手,所以紅軍1只好再次派出傳令軍,告訴紅軍2我們知道你們收到訊息了;

問題又來了,紅軍1不知道傳令是否成功,只有等待紅軍2的確認並不敢動手,紅軍2也只能再次派出傳令軍。。。

最後陷入了一個死迴圈,那麼根本問題就暴露了:永遠都不能完美的達成協議,而這正是一個一個重要的通訊道理:世界上不存在完全可靠的通訊協議。

從通訊時間成本空間成本以及可靠度來講,選擇了“三次握手”作為點對點通訊的一般規則。

關於建立連線時的三次握手大家可能還有個問題:
三次握手真的可靠嗎?
當然不可靠,任意次的握手都是不可靠的,握手成功只能說明握手時的通訊是正常的,並不能保證握手後的通訊是正常的,例如不穩定的網路環境,這些都是可能的。握手只能保證儘可能的可靠,而不可能保證理論上的絕對可靠。

本文整理自:
https://www.zhihu.com/question/24853633/answer/115379350

https://www.zhihu.com/question/24853633/answer/254420399?utm_source=wechat_session&utm_medium=social

個人微信公眾號:
這裡寫圖片描述

作者:jiankunking 出處:http://blog.csdn.net/jiankunking

相關文章