|
關(guān)注+星標(biāo)公眾號(hào),不錯(cuò)過(guò)精彩內(nèi)容
dmh4wtbwvdx640119516143.gif (429.76 KB, 下載次數(shù): 10)
下載附件
保存到相冊(cè)
dmh4wtbwvdx640119516143.gif
2024-11-10 07:03 上傳
來(lái)源 | 碼農(nóng)的荒島求生
今天來(lái)聊聊為什么TCP需要3次握手而不是2次。假設(shè)有一條河,河的上下游有兩個(gè)人,這兩個(gè)人只能借助這條河交流信息:
x0cgi0jlnwu640119516243.png (47.02 KB, 下載次數(shù): 8)
下載附件
保存到相冊(cè)
x0cgi0jlnwu640119516243.png
2024-11-10 07:03 上傳
岸邊有很多葉子,因此它們把信息寫(xiě)到岸邊的葉子上:
3amofxdfgat640119516343.png (82.54 KB, 下載次數(shù): 7)
下載附件
保存到相冊(cè)
3amofxdfgat640119516343.png
2024-11-10 07:03 上傳
并假設(shè)上游的葉子會(huì)飄向下游,下游的葉子會(huì)飄向上游。
0t52loecmuo640119516443.png (72.91 KB, 下載次數(shù): 10)
下載附件
保存到相冊(cè)
0t52loecmuo640119516443.png
2024-11-10 07:03 上傳
但由于水流的作用,同一個(gè)方向葉子先出發(fā)的有可能后到(亂序),也有可能沉到水里(丟失)。也就是說(shuō)假如a發(fā)了四片葉子,每片葉子上寫(xiě)兩個(gè)字,記錄的是“碼農(nóng)的荒島求生”,a依次把【碼農(nóng)】【的荒】【島求】【生】放到河里,這四片葉子到達(dá)b后可能變成了【島求】【碼農(nóng)】 【生】 【的荒】(亂序),也有可能丟了一片葉子,變成了【的荒】 【碼農(nóng)】 【生】(亂序+數(shù)據(jù)丟失):
emtfy0r4gea640119516543.png (84.62 KB, 下載次數(shù): 9)
下載附件
保存到相冊(cè)
emtfy0r4gea640119516543.png
2024-11-10 07:03 上傳
那么在這種情況下該怎么讓b知道a想說(shuō)的其實(shí)是“碼農(nóng)的荒島求生”呢?很簡(jiǎn)單,只要兩種機(jī)制:編號(hào)以及確認(rèn)。編號(hào)針對(duì)與亂序問(wèn)題,確認(rèn)機(jī)制針對(duì)的是丟失問(wèn)題。a放到河里的任意一片葉子都帶上一個(gè)編號(hào),這些編號(hào)依次遞增,b收到葉子后根據(jù)編號(hào)重組起來(lái),這樣即使葉子到達(dá)的順序是亂的b也能根據(jù)編號(hào)恢復(fù)信息:
uwgoajga3s0640119516644.png (129.16 KB, 下載次數(shù): 9)
下載附件
保存到相冊(cè)
uwgoajga3s0640119516644.png
2024-11-10 07:03 上傳
亂序問(wèn)題解決了,葉子丟失問(wèn)題依靠確認(rèn)機(jī)制:b收到每一片葉子后會(huì)回復(fù)一個(gè)收到,并附帶接收葉子的編號(hào)+1,也就是期待a發(fā)出的下一片葉子的編號(hào):
uvbv2lpf2ch640119516744.png (66.95 KB, 下載次數(shù): 11)
下載附件
保存到相冊(cè)
uvbv2lpf2ch640119516744.png
2024-11-10 07:03 上傳
這樣a在接收到【3 收到】后就確信b已經(jīng)收到了【2 的荒】,如果a在一定時(shí)間內(nèi)沒(méi)有收到【3 收到】那么就會(huì)重新拿起一片葉子再次發(fā)送【2 的荒】。
mmqwf13k5f3640119516844.png (81.08 KB, 下載次數(shù): 10)
下載附件
保存到相冊(cè)
mmqwf13k5f3640119516844.png
2024-11-10 07:03 上傳
可以看到利用這種重傳機(jī)制確保即使葉子可能沉到水里也能把信息發(fā)給b。有了編號(hào)和確認(rèn)機(jī)制,即使在河流這種不可靠的介質(zhì)中a也可以把信息可靠的傳遞給b。當(dāng)然b也可以利用這種機(jī)制把消息可靠的發(fā)送給a。由于需要對(duì)每片葉子進(jìn)行編號(hào),因此a向b發(fā)送消息之前必須把葉子的初始編號(hào)告訴b,又因?yàn)閎也可以向a發(fā)送消息,因此雙方在通信之前必須知道對(duì)方葉子的初始編號(hào),這樣才能正確的進(jìn)行葉子收到后的確認(rèn)以及對(duì)葉子根據(jù)編號(hào)進(jìn)行重排。
4yqe1clcq40640119516944.png (98.47 KB, 下載次數(shù): 9)
下載附件
保存到相冊(cè)
4yqe1clcq40640119516944.png
2024-11-10 07:03 上傳
于是ab雙方協(xié)定,聊天發(fā)起方先把編號(hào)告訴聊天接收方,聊天接收方收到發(fā)起方編號(hào)后也把自己的編號(hào)告訴發(fā)起方。依然假設(shè)a先發(fā)起通信,a先發(fā)送了一片葉子,寫(xiě)著“SYN X”,SYN表示這是一片告訴你我的初始編號(hào)的葉子(在TCP中SYN是synchronization的簡(jiǎn)寫(xiě),表示同步,但作用和這里一樣),X表示自己的初始編號(hào)。
3np11gazyri640119517044.png (77.73 KB, 下載次數(shù): 9)
下載附件
保存到相冊(cè)
3np11gazyri640119517044.png
2024-11-10 07:03 上傳
根據(jù)之前提到的確認(rèn)機(jī)制,b在收到需要對(duì)這片葉子進(jìn)行確認(rèn),于是b發(fā)送一片葉子:“ACK X+1”,表示“我確認(rèn)已經(jīng)接收到了你的葉子,期待接收X+1號(hào)葉子”(在TCP中ACK是acknowledge的簡(jiǎn)寫(xiě),表示確認(rèn),作用和這里一樣)。
l3rkgijtazi640119517144.png (104.06 KB, 下載次數(shù): 8)
下載附件
保存到相冊(cè)
l3rkgijtazi640119517144.png
2024-11-10 07:03 上傳
不要忘了,b也要把自己的編號(hào)告訴a,于是b緊接著又發(fā)送了一片葉子“SYN Y”,表示“這是一片告訴你我的初始編號(hào)的葉子,我的初始編號(hào)是Y”:
mox1uqd5vme640119517244.png (88.06 KB, 下載次數(shù): 8)
下載附件
保存到相冊(cè)
mox1uqd5vme640119517244.png
2024-11-10 07:03 上傳
同樣的a收到后也要進(jìn)行確認(rèn),于是a發(fā)送一片葉子:“ACK Y+1”,表示“我確認(rèn)已經(jīng)接收到了你的葉子,期待接收你Y+1號(hào)葉子”。
gsdt4zaxuep640119517344.png (115.73 KB, 下載次數(shù): 10)
下載附件
保存到相冊(cè)
gsdt4zaxuep640119517344.png
2024-11-10 07:03 上傳
就這樣經(jīng)過(guò)最少四片葉子,a和b就能知道對(duì)方的初始編號(hào)是多少,注意看這里:
j1lpmyj3gwm640119517445.png (113.63 KB, 下載次數(shù): 10)
下載附件
保存到相冊(cè)
j1lpmyj3gwm640119517445.png
2024-11-10 07:03 上傳
可以看到這兩片葉子都是b發(fā)向a的,因此這兩片葉子的信息可以合并在一起,這樣就可以少發(fā)送一片葉子:
fsy31ls35wg640119517545.png (52.1 KB, 下載次數(shù): 11)
下載附件
保存到相冊(cè)
fsy31ls35wg640119517545.png
2024-11-10 07:03 上傳
可以看到,雙方至少需要發(fā)送3片葉子才能知道對(duì)方的初始編號(hào),而如果只發(fā)送兩片葉子沒(méi)辦法保證這一點(diǎn)。------------ END ------------
fgmcijqaez1640119517645.gif (71.87 KB, 下載次數(shù): 10)
下載附件
保存到相冊(cè)
fgmcijqaez1640119517645.gif
2024-11-10 07:03 上傳
●專(zhuān)欄《嵌入式工具》●專(zhuān)欄《嵌入式開(kāi)發(fā)》●專(zhuān)欄《Keil教程》●嵌入式專(zhuān)欄精選教程
關(guān)注公眾號(hào)回復(fù)“加群”按規(guī)則加入技術(shù)交流群,回復(fù)“1024”查看更多內(nèi)容。
點(diǎn)擊“閱讀原文”查看更多分享。 |
|