TCP握手为什么需要三次通信
TCP三步握手three way (or three message) handshake 是TCP核心知識點,很長一段時間內我無法理解為什么TCP建立連接需要三次通信,而不是兩次或者四次或者更多次。我翻了很多問答和博客,他們說的都很有道理,但是借來的火,點不亮自己的燈。隨著時間的推移終于對這個問題我有了自己的理解。
TCP握手為什么需要三次通信?
互聯網這個信道并不可靠,TCP用于在不可靠的信道中進行可靠的信息傳遞。首先要明確的是,無論通過多少次握手都無法改變信道不可靠的事實,而如何在不可靠的信道中進行可靠的信息傳遞才是要解決的問題。
A無法確認B是否收到信息的情況下要確認B收到可以通過觀察B的反饋做到。
也就是說B在規定時間內沒有反饋那么A就認定B沒有收到,A會重新發送,直到收到B的反饋。
所以在不可靠信道中交換一次信息至少需要兩次通信。
在TCP握手過程中客戶端要詢問服務端的是你可以通信嗎?服務端會回答我可以或者不可以。所以有兩次信息交換,正常需要四次通信。
A → B B → A 客戶端詢問服務端是否可以通信的信息確保傳達完成。
B → A A → B 服務端答復客戶端我可以/不可以的答復信息確保傳達完成。
中間的兩次B → A通信可以合并為一次,所以總共就變成了三次通信。
通信過程中傳遞的信息具體有什么?
A → B:能聽到嗎?能通信嗎?
B → A:能聽到,能通信(回答能通信隱含的意思就是能聽到)
B → A:我的回復收到了嗎?
A → B:收到了
中間兩次通信合并后:
A → B:能聽到嗎?能通信嗎?
B → A:能聽到,能通信(回答能通信隱含的意思就是能聽到),我的回復收到了嗎?
A → B:收到了
這樣三次通信后完成握手。
信道可靠,握手則只需要兩次通信即可完成:
A → B:能通信嗎?
B → A:能
不需要確認是否可以通信:
握手是為了交換對方是否可以通信的信息,如果無需確認對方是否可以通信則無需握手,因為沒有信息需要同步。
除了我的理解以下是收集的相關素材,都是原文摘抄,侵刪:
TCP是一種可靠的傳輸控制協議,它必須做到兩點,一是保證數據的可靠傳輸,二是盡可能提高傳輸效率,三次握手正是為了做到這兩點才出現的。
這個問題在謝希仁版《計算機網絡》里說了。三次是保證雙方互相明確對方能收能發的最低值。理論上講不論握手多少次都不能確認一條信道是“可靠”的,但通過3次握手可以至少確認它是“可用”的,再往上加握手次數不過是提高“它是可用的”這個結論的可信程度。
簡單說,讓雙方都證實對方能發收。知道對方能收是因為收到對方的因為收到而發的回應。
具體:
1:A發,B收, B知道A能發
2:B發,A收, A知道B能發收
3:A發,B收, B知道A能收
三次握手這個說法不好,其實是雙方各一次握手,各一次確認,其中一次握手和確認合并在一起
這個問題的本質是, 通過一個不完全可靠的信道, 最少需要幾次消息傳輸, 信道兩邊的人能夠對一個問題達成一致. 對于TCP來說, 無論有沒有初始
序號的要求, 想要兩邊都同意開始傳出數據, 就至少需要3次消息的交換:
0次: 顯然不行
1次: A->B, A不知道B是否同意
2次: A->B, B->A. B不知道A是否收到自己的消息, 因為信道不完全可靠
3次: A->B, B->A, A->B. 兩邊都收到了對方的ACK, 意味著各自都了解了對方的意圖, 從而可以對是否開始通信這個最簡單的問題
達成一致.
兩軍問題根本不能解釋為什么要三次握手。兩軍問題的一個結論就是,在不可信的信道上,不可能實現完全可信的通信。
No…
三次握手的要求不是源于兩邊同時傳輸數據, 你看過Two Generals’ Problem就能明白, 三次握手作為一個協議, 并不特定于
TCP, 跟兩邊同時傳輸數據也沒有關系. 請不要糾纏于什么全雙工, 半連接, syn/ack這些東西上. 至于你說的把握手協議并在第一個數據包
里發送之類的, 那只是實現時的優化, 跟"三次"問題的核心沒有關系. 實現是實現, 協議是協議, 這是兩個東西. 你單獨有個握手協議也好, 握
手包含在真正的數據包里也行, 但無論如何, 沒有至少三次握手, 任何的數據交換都是不可靠的.
所以, 這個問題的本質是, 信道不可靠, 但是通信雙發需要就某個問題達成一致. 而要解決這個問題, 無論你在消息中包含什么信息, 三次通信是理論上的最小值. 所以三次握手不是TCP本身的要求, 而是為了滿足"在不可靠信道上可靠地傳輸信息"這一需求所導致的. 請注意這里的本質需求,信道不可靠, 數據傳輸要可靠. 三次達到了, 那后面你想接著握手也好, 發數據也好, 跟進行可靠信息傳輸的需求就沒關系了. 因此,如果信道是可靠的, 即無論什么時候發出消息, 對方一定能收到, 或者你不關心是否要保證對方收到你的消息, 那就能像UDP那樣直接發送消息就可以了.
參考
總結
以上是生活随笔為你收集整理的TCP握手为什么需要三次通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: webpack联邦模块之consumes
- 下一篇: C# 设计模式,工厂方法