電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 74|回復: 0
收起左側(cè)

為什么TCP需要3次握手而不是2次?

[復制鏈接]

359

主題

359

帖子

3318

積分

四級會員

Rank: 4

積分
3318
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-11-9 11:45:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
關(guān)注+星標公眾,不錯過精彩內(nèi)容

來源 | 碼農(nóng)的荒島求生

今天來聊聊為什么TCP需要3次握手而不是2次。假設有一條河,河的上下游有兩個人,這兩個人只能借助這條河交流信息:

岸邊有很多葉子,因此它們把信息寫到岸邊的葉子上:

并假設上游的葉子會飄向下游,下游的葉子會飄向上游。

但由于水流的作用,同一個方向葉子先出發(fā)的有可能后到(亂序),也有可能沉到水里(丟失)。也就是說假如a發(fā)了四片葉子,每片葉子上寫兩個字,記錄的是“碼農(nóng)的荒島求生”,a依次把【碼農(nóng)】【的荒】【島求】【生】放到河里,這四片葉子到達b后可能變成了【島求】【碼農(nóng)】 【生】 【的荒】(亂序),也有可能丟了一片葉子,變成了【的荒】 【碼農(nóng)】 【生】(亂序+數(shù)據(jù)丟失):

那么在這種情況下該怎么讓b知道a想說的其實是“碼農(nóng)的荒島求生”呢?很簡單,只要兩種機制:編號以及確認。編號針對與亂序問題,確認機制針對的是丟失問題。a放到河里的任意一片葉子都帶上一個編號,這些編號依次遞增,b收到葉子后根據(jù)編號重組起來,這樣即使葉子到達的順序是亂的b也能根據(jù)編號恢復信息:

亂序問題解決了,葉子丟失問題依靠確認機制:b收到每一片葉子后會回復一個收到,并附帶接收葉子的編號+1,也就是期待a發(fā)出的下一片葉子的編號:

這樣a在接收到【3 收到】后就確信b已經(jīng)收到了【2 的荒】,如果a在一定時間內(nèi)沒有收到【3 收到】那么就會重新拿起一片葉子再次發(fā)送【2 的荒】。

可以看到利用這種重傳機制確保即使葉子可能沉到水里也能把信息發(fā)給b。有了編號和確認機制,即使在河流這種不可靠的介質(zhì)中a也可以把信息可靠的傳遞給b。當然b也可以利用這種機制把消息可靠的發(fā)送給a。由于需要對每片葉子進行編號,因此a向b發(fā)送消息之前必須把葉子的初始編號告訴b,又因為b也可以向a發(fā)送消息,因此雙方在通信之前必須知道對方葉子的初始編號,這樣才能正確的進行葉子收到后的確認以及對葉子根據(jù)編號進行重排。

于是ab雙方協(xié)定,聊天發(fā)起方先把編號告訴聊天接收方,聊天接收方收到發(fā)起方編號后也把自己的編號告訴發(fā)起方。依然假設a先發(fā)起通信,a先發(fā)送了一片葉子,寫著“SYN X”,SYN表示這是一片告訴你我的初始編號的葉子(在TCP中SYN是synchronization的簡寫,表示同步,但作用和這里一樣),X表示自己的初始編號。

根據(jù)之前提到的確認機制,b在收到需要對這片葉子進行確認,于是b發(fā)送一片葉子:“ACK X+1”,表示“我確認已經(jīng)接收到了你的葉子,期待接收X+1號葉子”(在TCP中ACK是acknowledge的簡寫,表示確認,作用和這里一樣)。

不要忘了,b也要把自己的編號告訴a,于是b緊接著又發(fā)送了一片葉子“SYN Y”,表示“這是一片告訴你我的初始編號的葉子,我的初始編號是Y”:

同樣的a收到后也要進行確認,于是a發(fā)送一片葉子:“ACK Y+1”,表示“我確認已經(jīng)接收到了你的葉子,期待接收你Y+1號葉子”。

就這樣經(jīng)過最少四片葉子,a和b就能知道對方的初始編號是多少,注意看這里:

可以看到這兩片葉子都是b發(fā)向a的,因此這兩片葉子的信息可以合并在一起,這樣就可以少發(fā)送一片葉子:

可以看到,雙方至少需要發(fā)送3片葉子才能知道對方的初始編號,而如果只發(fā)送兩片葉子沒辦法保證這一點。------------ END ------------

●專欄《嵌入式工具●專欄《嵌入式開發(fā)》●專欄《Keil教程》●嵌入式專欄精選教程
關(guān)注公眾號回復“加群”按規(guī)則加入技術(shù)交流群,回復“1024”查看更多內(nèi)容。

點擊“閱讀原文”查看更多分享。
回復

使用道具 舉報

發(fā)表回復

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表