怎麼理解TCP的面向連線和UDP的面向無連線
亞當和夏娃分別生活在兩個山頭,山頭之間是萬丈深淵,亞當採集野果需要分享給夏娃,如果他們之間有一條索道(物理連線),野果可以順著索道滑到夏娃那一邊,那就沒有車小胖什麼事了。
事實上山頭之間沒有索道,但是亞當何等聰明,於是他想出了一個方法,假設亞當需要給夏娃10個野果,否則她會餓死。
連線建立
亞當對著夏娃大喊:愛妃,你聽得到嗎?
夏娃迴應:孩他爹,我聽得到!
亞當接著喊:那好,我扔果子給你吃,你接到果子就喊一聲,一共十個。
運送貨物
於是亞當開始扔第一個,夏娃喊收到了一個。
亞當扔第二個,夏娃喊收到兩個。
超時重傳 ( timeout retransmit)
亞當扔第三個,可是夏娃遲遲沒有迴音,亞當意識到可能果子落到懸崖了,於是重新扔,夏娃喊收到第三個。
Advertised window size = 0
於是亞當連續扔了第四、五、六個,夏娃急了:孩他爹,慢點扔,臣妾忙不過來了…
Advertised window size > 0
於是亞當坐下休息,愛妃又開始叫了:繼續扔吧。
亞當開始扔第七個,夏娃喊收到七個。
…
關閉連線
終於亞當扔完了,亞當喊:愛妃,果子扔完了,寡人去忙別的了。
夏娃回覆:好的,我也休息一下,再見
亞當:再見
以上的過程類似TCP連線的過程,TCP是一個虛擬連線。
何為虛擬連線?
和物理連線所對應,物理連線是實實在在存在的,看得見摸得著,比如索道。而虛擬連線是不存在的,看不見摸不著,通過雙向的訊息、訊息確認來模擬物理連線。
由於有確認機制,亞當可以確保夏娃可以收到10個果子。
那接下來再談談什麼是無連線的UDP?
亞當和夏娃吵架了,任憑亞當如何大聲喊,夏娃躲在樹林後生悶氣,一聲不響,亞當害怕夏娃餓死,於是開始自說自話朝著夏娃的山頭扔玉米棒子:
一個、兩個、三個…
一共扔了十個,但最終扔到對方山頭到底有幾個,亞當沒有底,也許有的玉米棒子落到懸崖了,但是這個效率高啊,可以連續扔,以前扔10個果子需要一分鐘,現在只需要20秒。
亞當扔果子、扔玉米都有可能扔到懸崖下,但是扔果子為何可以確保對方收到十個?那是因為夏娃收到一個果子,然後喊收到了,如果沒有收到,亞當就重新扔,直到夏娃說收到了。而扔玉米棒子對方沒有確認,所以對於丟棄的情況無法知道,也無法重新扔。