1. 程式人生 > >UDP與TCP的區別

UDP與TCP的區別

https://blog.csdn.net/persistencegoing/article/details/84376427

 

TCP (Transmission Control Protocol)---傳輸控制協議,提供的是面向連線、可靠的位元組流服務。當客戶和伺服器彼此交換資料前,必須先在雙方之間建立一個TCP連線,之後才能傳輸資料。TCP建立連線要進行3次握手,而斷開連線要進行4次。TCP提供超時重發,丟棄重複資料,檢驗資料,流量控制等功能,保證資料能從一端傳到另一端。 
      UDP(User Data Protocol)---使用者資料報協議,是一個簡單的面向資料報的運輸層協議。UDP不提供可靠性,它只是把應用程式傳給IP層的資料報傳送出去,但是並不能保證它們能到達目的地。由於UDP在傳輸資料報前不用在客戶和伺服器之間建立一個連線,且沒有超時重發等機制,故而傳輸速度很快。

   UDP適用於一次只傳送少量資料、對可靠性要求不高的應用環境。比如,我們經常使用“ping”命令來測試兩臺主機之間TCP/IP通訊是否正常,其實“ping”命令的原理就是向對方主機發送UDP資料包,然後對方主機確認收到資料包,如果資料包是否到達的訊息及時反饋回來,那麼網路就是通的。例如,在預設狀態下,一次“ping”操作傳送4個數據包(如圖所示)。大家可以看到,傳送的資料包數量是4包,收到的也是4包(因為對方主機收到後會發回一個確認收到的資料包)。這充分說明了UDP協議是面向非連線的協議,沒有建立連線的過程。正因為UDP協議沒有連線的過程,所以它的通訊效率高;但也正因為如此,它的可靠性不如TCP協議高。QQ就使用UDP發訊息,因此有時會出現收不到訊息的情況 

TCP要三次握手, 每次傳輸都會檢查包回執有重發機制, 用於可靠性要求高, 效能要求不高的傳輸.
UDP會丟包, 丟包後不重發, 所以在可靠性要求低, 效能要求高的地方使用.
大多數情況下TCP已經滿足需求了, 但總有對效能慾求不滿的地方.
例如流媒體相關, 時延較大的衛星通訊方面, 鐵路資訊上報及互動系統, 城市交通訊息上報及互動系統等等, UDP作用也是巨大, 而且UDP和TCP並非公用一套埠, 合理運用也能起到意想不到的作用.

udp處理資料報,tcp處理網路流。
讀udp socket 一次返回一個報文
讀TCP socket不一定能讀到一個完整的報文
udp不保證報文到達的先後順序,不保證是否有報文丟失
tcp保證寫入流的資料按順序被讀出來
tcp可靠性高,效率低

關於TCP和UDP的區別和概念上面都有人寫過了。我這裡寫一個UDP的應用。

在多人網路遊戲中,人物的移動可以用UDP來發。因為人物一直處於移動當中,會頻繁發出位置資訊的包。由於發的比較頻繁,而且後面的位置資訊會覆蓋掉前面的位置資訊,所以丟不丟包不重要。就可以用UDP來發。每個UDP包的資料裡面加個時間戳,那麼進來的包你判斷下時間,如果是已經過期的包,就可以直接丟掉。這樣,即使udp包過來的順序不一樣都無所謂了

般使用tcp,可靠性傳輸。但用udp也可以做的很完美,比如qq就是使用udp

TCP是面向流字元的,資料流間無邊界;UDP是面向分組的,分組間有明確的邊界。
對於TCP,傳送一串數字(1,2,3,4,5),接收時有可能變成兩次(1,2)和(2,4,5),或者變成任意接收方式,協議棧只保證接收順序正確;UDP傳送一個分組,接收方或者接收完全失敗,如果成功整個分組都會接收到。

1、TCP是面向連線的,UDP是無連線的。類比於打電話和發電報的關係。

UDP 的使用範圍很窄,而且程式設計比 TCP 難多了:

你真的很在乎延遲,不能忍受重傳,那麼就用UDP,例如 NTP 協議。重傳NTP訊息純屬添亂。
你真的不在乎可靠性,丟一些包也不需要重傳,那麼就可以用 UDP。例子我想不出來。音訊或視訊流可以用UDP,不過據有些大視訊網站都用HTTP協議,而HTTP是基於TCP的,實時音視訊是可以而且應該用 UDP 的,一方面因為它常常涉及到網路穿透,另外一方面它不需要重傳。——我需要實時的看到你的影象跟聲音,至於中間丟一幀什麼的完全不重要。而為了重傳往往會造成延遲與不同步,考慮一下,某一幀因為重傳,導致0.5秒以後才到,那麼整個音視訊就延遲了0.5。
你需要NAT穿透,那麼不得不用UDP。
其他情況,一旦程式要自己做重傳,你都是在用UDP模擬出蹩腳的TCP,還不如直接用TCP呢。
總之:使用 UDP 需要有強大到不容置疑的理由,when in doubt, use TCP.

一些協議,出於歷史原因,受當時技術和網路條件限制,選擇了基於UDP實現,其選擇的理由現在很可能已經不再成立了。因此“xxx協議用UDP”不是你現在寫網路應用程式也該用UDP的理由,除非你本身就是在實現xxx協議。

另外,那些說TCP比UDP慢、效率低的,你拿UDP寫個程式,把千兆網頻寬打滿(TCP等價的程式碼只有兩行:客戶端 while (true) { send(...); } 服務端 while (true) { recv(...); }。),且不說你的程式會有多複雜,先看看goodput到底是不是比TCP大、CPU使用率是不是比TCP低嘛。
從設計目的來看,udp的傳送方是不知道接受方是否收到資料,而tcp是要求傳送方確定的知道接受方


可以看出,UDP與TCP的主要區別在於:

1.基於連線與無連線;
2.對系統資源的要求(TCP較多,UDP少);
3.UDP程式結構較簡單;
4.流模式與資料報模式 ;
5.TCP保證資料正確性,UDP可能丟包,TCP保證資料順序,UDP不保證。

 


轉載:https://blog.csdn.net/yjh314/article/details/44343257 
希望大家關注我一波,防止以後迷路,有需要的可以加群討論互相學習java ,學習路線探討,經驗分享與java求職      群號:721515304