通俗易懂理解TCP和UDP(轉)
知乎看到一位大牛“車小胖”的類比很貼切,就轉過來了。
原文鏈接: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(轉)