1. 程式人生 > >TCP為什麼要三次握手,不是兩次四次?

TCP為什麼要三次握手,不是兩次四次?

第一次握手:黃河發起呼叫,長江收到了。這時長江可以確認的是,黃河的發信機和自己的收信機是好的,否則的話他收不到黃河的呼叫;黃河能確認什麼呢?他什麼也不能確認,有可能自己的電臺除了指示燈是好的,其它都是壞的,他在對著一臺鐵疙瘩發功。

第二次握手:長江迴應,黃河收到了。這時黃河可以確認的是,自己和長江的收發信機都是好的,否則的話他收不到長江的迴應訊號。這時黃河可以說正事了嗎?還不能,雖然長江發出了迴應,但他並不能確認自己的發信機和黃河的收信機都是好的。

第三次握手:黃河對長江的迴應進行迴應。這時黃河很清楚,雙方收發信機都是好的,自己的這次迴應長江肯定能收到,這個迴應的目的只是消除長江對黃河的收信機和長江自己的發信機的擔心。然後,黃河不必等長江的再次迴應就可以說正事了。

有些讀者看到這裡,心裡會想“且慢,你憑什麼說第三次握手後,長江肯定會收到?長江剛才的狀態好,不代表後來的狀態好,俗話說人算不如天算,我看再多握幾次手會更可靠些。”這種想法有道理,幾句話還真說不清,那麼不妨先講一個與此有關的戰鬥小故事。

戰場態勢是這樣的:

駐紮在兩個山頭上的紅1團和紅2團分別有兩個營,而在山谷的藍團有三個營,若紅1團和紅2團孤軍下山作戰會失敗,而兩個團同時進攻就會勝利,對於紅方來說,問題的關鍵是要同時發起進攻。

戰鬥前的準備過程是這樣的:

紅1團團長找了個傳令兵,命令他跑到紅2團,告訴紅2團團長明早9時發起進攻。傳令兵沒有被藍團俘虜,成功地跑到了紅2團的山頭,告訴紅2團團長明早9時兩個團同時進攻。紅2團團長一邊握著傳令兵的手激動地說“太好了!我早就等著這個訊息呢!”,一邊心裡暗自核計“雖然我知道了這個訊息,但是紅1團的團長並不知道我已經知道了,誰都知道傳令兵有可能被俘,訊息很有可能傳不過來,若明天總攻前,紅1團團長不知道我已經得到了訊息,他一定不會貿然進攻的,換成我也不會”。於是,紅2團團長對傳令兵說“兄弟,你辛苦了,先抽袋煙吧,抽完後再辛苦你跑回去,告訴你們團長,說我已經得到訊息了,明天按時總攻。”

傳令兵又跑回到紅1團,僥倖又沒被藍團俘獲,他告訴紅1團團長有關紅2團團長已經獲知明早進攻的訊息,但紅1團團長明早敢發起攻擊嗎?他不敢,因為他心裡清楚,紅2團團長並不知道他(紅1團團長)已經知道了“紅2團團長已獲知明早9時發起攻擊”這個訊息,紅1團團長繼續想,如果是他本人是紅2團團長,就不會貿然攻擊,因為自己已經獲知明早9時發起攻擊這件事,對方未必知道,而有可能因為傳令兵回團時被抓,敵人反而知道了,自己貿然攻擊,有可能就會失敗。於是,紅1團團長對傳令兵說“兄弟,你辛苦了,先抽袋煙吧,抽完後再辛苦你跑一趟紅2團,告訴他們團長,就說我已經知道他已經知道了明早9點進攻這件事,讓他放心地打吧。”

寫到這裡,聰明的讀者已經猜到了,即使傳令兵再次來到紅2團,紅2團團長也不敢開戰,還是要傳令兵再次回紅1團報信,因為紅2團團長擔心紅1團團長不知道他(紅2團團長)已經知道了紅1團團長知道他(紅2團團長)知道明早9點發生攻擊的事。(此句53個字,想到松鼠們多用短句的建議,心裡嚴重疚結中……)

回到三次握手問題上,紅1團和紅2團其實就是通訊的雙方,這場永遠也達不成協議的戰鬥,說明了一個重要的通訊道理:世界上不存在完全可靠的通訊協議

“三次握手”是電臺點對點通訊的一般規則,但即使三次握手成功後,以後的通訊就能保證正常嗎?當然不能,握手成功後的裝置故障、干擾、話務員的傷亡等,無數種可能性會導致通訊失敗。三次握手成功只說明瞭之前的通訊條件和環境,而不能決定和預測之後的通訊條件和環境。根據經驗,兩個電臺之間的通訊失敗,最大的可能性是兩個電臺本身的故障,三次握手的成功排除了這種可能。以後的情況很難預測的,通訊協議只能做到儘可能的可靠,而不能做到理論上的完全可靠。

電臺通訊一定要三次握手嗎?當然不一定。潛伏者為了不暴露自己,可以只使用收信機而不發信,迴應總部時可以採用其它手段,例如在指定電線杆上貼個尋人啟示。如果電臺的發信機出了故障,也可能不經過三次握手而達成通訊,在對越自衛反擊戰中,某部的電臺發信機壞了,指揮所在沒有收到對方握手訊號的情況下,連續盲發14份報文,該部全部收到,並按指示順利地完成了任務,該電臺臺長因此榮立了二等功。

如果是兩次:

C傳送請求,S應答並分配資源 
若S的應答沒有到達C端,C認為連線未建立,而S認為建立了
S會在一段時間內保留分配的資源
如果大量C這樣請求,S會崩潰