綜合解讀TCP為什麼三次握手

TheCarol發表於2020-11-15

TCP為什麼三次握手

首先可以先參考下面這篇文章參考。
TCP 為什麼三次握手而不是兩次握手(正解版)

以下都為個人理解。

結論先行:
三次握手本質目的是同步連線雙方的序列號(seq)和確認號(ack)並交換 TCP視窗大小資訊。

也可以理解為文章TCP 為什麼三次握手而不是兩次握手(正解版)中的結論

為了實現可靠資料傳輸, TCP 協議的通訊雙方, 都必須維護一個序列號, 以標識傳送出去的資料包中, 哪些是已經被對方收到的。 三次握手的過程即是通訊雙方相互告知序列號起始值, 並確認對方已經收到了序列號起始值的必經步驟
如果只是兩次握手, 至多隻有連線發起方的起始序列號能被確認, 另一方選擇的序列號則得不到確認

首先關於計算機網路書上對於為何需要第三次握手的解釋肯定是正確的理解
其中原文:

為什麼A最後還要傳送一次確認呢?這主要是防止已失效的連線請求報文突然又傳送到了B,因而產生錯誤。

然後對於“已失效的連線請求報文”,原文中是這樣定義的:

先假定一種異常情況,即A發出的第一個連線請求報文段並沒有丟失,而是在某些網路結點長時間滯留了,以致延誤到連線釋放以後的某個時間才到達B。本來這是一個早已失效的報文段。但B收到此失效的連線請求報文段後,就誤認為是A又發出一次新的連線請求。於是就向A發出確認報文段,同一建立連線。假定不採用報文握手,那麼只要B發出確認,新的連線就建立了。
由於現在A沒有發出建立連線的請求,因此不會理睬B的確認,也不會向B傳送資料。但B卻認為新的運輸連線已經建立了,並一致等待A傳送來資料。B的資源就這樣白白浪費了。

根據原文中可以得出:造成這種情況的本質就是B在沒有收到A對B剛剛傳送的報文段進行回應的情況下就建立了連線。

也就是說作者的假設是建立在不需要對第二次握手的報文段進行回應的情況上,這種情況就會導致B的資源白白浪費,所以需要第三次確認,也就是說本質上就是需要第三次握手,才不會導致錯誤情況。

那麼對於TCP 為什麼三次握手而不是兩次握手(正解版)文章中的解釋,其實和教科書上的解釋都是在解釋一個事情,我給你傳送了資訊,你不給我回應,我就不知道你是否收到資訊,那麼我就不應該繼續給你發訊息。

而TCP實現可靠的方式之一就是通過同步ack和seq來確保報文段的收發。

相關文章