為什麼TCP鏈結要三次握手而不是兩次握手 雅虎

2021-07-15 18:43:41 字數 2314 閱讀 4142

第三次握手——革命鬥爭中的通訊故事

在革命戰爭影片中,經常會看到英勇的解放軍戰士揹著步話機在喊「長江長江,我是黃河,聽到請回答。」很明顯,這是呼號為黃河的一方想找呼號為長江的另一方說事,為了保證影片的節奏,導演往往把後面的聯絡過程省略了,其實後面還有兩步,長江聽到黃河的呼叫後要回答「黃河黃河,我是長江,我聽到了你,請回答。」這叫做第二次握手。黃河聽到長江的呼叫後還要回答「長江長江,我是黃河,我聽到了你,現在請你收報」,這是第三次握手,三次握手成功後,才能在電台裡傳送工作報文。為什麼必須三次握手後才能工作呢?聽我慢慢道來。

《英雄兒女》

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

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

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

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

戰場態勢是這樣的:

駐紮在兩個山頭上的紅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就會在一段時間內保留分配的資源。

如果有大量這樣的請求,s會崩潰。

TCP為什麼要三次握手?

在 計算機網路 一書中其中有提到,三次握手的目的是 為了防止已經失效的連線請求報文段突然又傳到服務端,因而產生錯誤 這種情況是 一端 client a發出去的第乙個連線請求報文並沒有丟失,而是因為某些未知的原因在某個網路節點上發生滯留,導致延遲到連線釋放以後的某個時間才到達另一端 server b。...

為什麼TCP連線要三次握手?

因為網路層是不可靠的。雙方在通訊的時候,就算是 tcp 連線,在網路層都有可能丟包,只不過是傳輸層有處理丟包的策略。若 tcp 連線是兩次握手,那麼突然來了乙個已失效的客戶端連線請求報文,伺服器會把這次失效的連線當成正常的連線對待。謝希仁版計算機網路中給出的例子如下 client 發出的第乙個連線請...

TCP為什麼要進行三次握手

今天無意中想起了這個問題,談談我的理解。先上圖 先約定兩個名字。a代表連線建立的發起方 客戶端 b代表連線建立的接收方 服務端 tcp連線是在實際通道中是全雙工的,即邏輯上分成兩個通道,乙個是a b,另乙個b a。要在不可靠的通道上建立起可靠的連線,那麼必須保證兩個通道是可靠的。而三次握手的過程就是...