1. 程式人生 > >面向連線的TCP和無連線的UDP

面向連線的TCP和無連線的UDP

TCP(Transmission Control Protocol)傳輸控制協議:提供面向連線、可靠的資料傳輸服務。[資料傳輸單位為報文段]

UDP(User Datagram Protocol)使用者資料報協議:提供無連線、盡最大努力的資料傳輸服務(不保證資料傳輸的可靠性)。[資料傳輸單位為使用者資料段]

這是我看到的對TCP和UDP的類比理解:

  • TCP就像是打電話:當要在電活上與某個人通話之前,必須首先與這個人建立一個連線,而不論這個人身在何處。這就有些像 TCP協議中的虛電路。如果在你的通話中涉及到某些重要的資訊,你可能會說:“ 你懂嗎?” 說的話就很像是 TCP中的確認應答
    ,它是用來給你一個證實的。隨著時間的推移(特別是在行動電話上),人們也會問:“ 你還在聽嗎?”而在人們結束一次電話通話時,會用“ 再見”一類的結束語來結束通話過程。TCP也需要完成這樣的一類控制功能。
  • UDP就像是傳送明信片。在傳送明信片時,你是不需要事先聯絡收信方的。你只需在明信片上簡單寫上你的傳送內容、 註明地址並郵寄它。它同UDP的無連線方式是很相像的。因為通常寫在明信片上的資訊都不是很重要的,你不會要求接收到它的確認應答。同樣,UDP也不涉及確認應答。

還有一個是通過亞當和夏娃的故事來講的(ps.找不到原作者了)

亞當和夏娃分別生活在兩個山頭,山頭之間是萬丈深淵,亞當採集野果需要分享給夏娃,如果他們之間有一條索道(物理連線

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

建立連線

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

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

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

運送貨物(傳送資料)

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

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

超時重傳 ( timeout retransmit) 

接收方成功接收到資料後,會回覆一個ACK資料包,表示已經確認接收到ACK確認號前面的所有資料。

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

Advertised window size = 0

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

Advertised window size > 0

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

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

關閉連線

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

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

亞當:再見

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

  • 何為虛擬連線?

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

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

什麼是無連線的UDP

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

一個、兩個、三個…

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

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

TCP如何提供可靠的傳輸?(差錯控制和流量控制)

確認:接收方成功接收到資料後,會回覆一個ACK資料包,表示已經確認接收到ACK確認號前面的所有資料。傳送方在一定時間內沒有收到服務端的ACK確認包後,就會重新發送TCP資料包。傳送方收到了ACK,表明接收方已經接收到資料,保證了資料的可靠達到。 

(ACK是TCP報頭的控制位之一,對資料進行確認.確認由目的端發出,用它來告訴傳送端這個序列號之前的資料段都收到了.比如,確認號為X,則表示前X-1個數據段都收到了,只有當ACK=1時,確認號才有效,當ACK=0時,確認號無效,這時會要求重傳資料,保證資料的完整性.)

超時重傳:傳送端根據發出的報文段在超時規定的時間內是否收到確認,從而來判斷該報文段是否丟失或傳輸出錯。

傳送方在傳送完資料後等待一個時間,若時間到達沒有接收到ACK報文,那麼對剛才傳送的資料進行重新發送。如果是  資料在傳輸過程中由於網路原因等直接全體丟包,接收方根本沒有接收到  的話,接收方收到二次重發的資料後,便進行ACK應答,如果 接收方接收到了響應的資料,但是傳送的ACK報文響應卻由於網路原因丟包了,那麼直接丟棄,仍舊傳送ACK應答。

校驗:每個TCP報文段都包括檢驗和欄位,校驗和用來檢查報文段是否出現傳輸錯誤,如果報文段出現傳輸錯誤,TCP檢查出錯就丟棄該報文段,不給出迴應,傳送端會超時重傳。

流量控制:當接收端來不及處理髮送端傳送的資料,能提示傳送端降低傳送的速率,防止包丟失。

擁塞控制:當網路擁塞時,減少資料的傳送。


為什麼UTP不能保證資料報不丟失、不延遲、不錯序,仍然在目前應用中佔主流?

1)TCP需要建立和拆除連線,增加了網路開銷。

2)ACK的增加會使有效資料率減少

3)ACK無效時為了資料的完整性,會要求重傳資料。

4)隨著技術的提高,UDP出錯率降低。

5)UDP具有較好的實時性,工作效率比TCP高,適用於對高速傳輸和實時性有較高的通訊或廣播通訊。

6)每一條TCP連線只能是點到點的;UDP支援一對一,一對多,多對一和多對多的互動通訊。

 

面向連線和無連線服務

下層能夠向上層提供面向連線和無連線兩種形式的服務。這裡的“連線”是指兩個對等實體為進行通訊而進行的一種結合。面向連線服務在資料交換之前必須先建立連線,保留下層的有關資源,資料交換結束後,應終止這個連線,釋放所保留的資源。而對無連線服務,兩個實體之間不建立連線就可以通訊,在資料傳輸時動態地分配下層資源,不需事先進行預保留。

 

——————————碼一些介紹比較詳細的部落格——————————

https://blog.csdn.net/xiaobangkuaipao/article/details/76793702

https://blog.csdn.net/liuchenxia8/article/details/80428157