1. 程式人生 > >通俗易懂理解TCP和UDP(轉)

通俗易懂理解TCP和UDP(轉)

建立 休息 如果 str 否則 無連接 一分鐘 tis 得到

知乎看到一位大牛車小胖”的類比很貼切,就轉過來了。

原文鏈接:https://www.zhihu.com/question/51388497

或者:https://daily.zhihu.com/story/9028124

怎麽理解 TCP 的面向連接UDP 的無連接(不面向連接)

亞當和夏娃分別生活在兩個山頭,山頭之間是萬丈深淵,亞當采集野果需要分享給夏娃,如果他們之間有一條索道(物理連接),野果可以順著索道滑到夏娃那一邊,那就沒有車小胖什麽事了。

事實上山頭之間沒有索道,但是亞當何等聰明,於是他想出了一個方法,假設亞當需要給夏娃 10 個野果,否則她會餓死。

連接建立

亞當對著夏娃大喊:愛妃,你聽得到嗎?

夏娃回應:孩他爹,我聽得到!

亞當接著喊:那好,我扔果子給你吃,你接到果子就喊一聲,一共十個。

運送貨物

於是亞當開始扔第一個,夏娃喊收到了一個。

亞當扔第二個,夏娃喊收到兩個。

超時重傳 ( timeout retransmit)

亞當扔第三個,可是夏娃遲遲沒有回音,亞當意識到可能果子落到懸崖了,於是重新扔,夏娃喊收到第三個。

Advertised window size = 0

於是亞當連續扔了第四、五、六個,夏娃急了:孩他爹,慢點扔,臣妾忙不過來了…

Advertised window size > 0

於是亞當坐下休息,愛妃又開始叫了:繼續扔吧。

亞當開始扔第七個,夏娃喊收到七個。

……

關閉連接

終於亞當扔完了,亞當喊:愛妃,果子扔完了,寡人去忙別的了。

夏娃回復:好的,我也休息一下,再見

亞當:再見

以上的過程類似 TCP 連接的過程,TCP 是一個虛擬連接。

何為虛擬連接?

和物理連接所對應,物理連接是實實在在存在的,看得見摸得著,比如索道。而虛擬連接是不存在的,看不見摸不著,通過雙向的消息、消息確認來模擬物理連接。

由於有確認機制,亞當可以確保夏娃可以收到 10 個果子。

那接下來再談談什麽是無連接的 UDP?

亞當和夏娃吵架了,任憑亞當如何大聲喊,夏娃躲在樹林後生悶氣,一聲不響,亞當害怕夏娃餓死,於是開始自說自話朝著夏娃的山頭扔玉米棒子:

一個、兩個、三個……

一共扔了十個,但最終扔到對方山頭到底有幾個,亞當沒有底,也許有的玉米棒子落到懸崖了,但是這個效率高啊,可以連續扔,以前扔 10 個果子需要一分鐘,現在只需要 20 秒。

亞當扔果子、扔玉米都有可能扔到懸崖下,但是扔果子為何可以確保對方收到十個?那是因為夏娃收到一個果子,然後喊收到了,如果沒有收到,亞當就重新扔,直到夏娃說收到了。而扔玉米棒子對方沒有確認,所以對於丟棄的情況無法知道,也無法重新扔。

通俗易懂理解TCP和UDP(轉)