TCP協議和UDP協議有什麼區別?

devbean


TCP和UDP的基礎知識,可以去翻閱相應書籍。

我說幾個在選擇應用協議時比較重要的點,如果你不是很熟悉TCP/IP,應該是有所幫助的。尤其是關於對可靠性的理解。

基於字節流和麵向數據報

TCP基於字節流:TCP接收到應用層協議的消息(已編碼為二進制)後,然後參考該計算機連接的網絡數據鏈路層MTU(最大傳輸單元)確定是否要分包,然後交給IP層。但是並不會在不同的消息之間設置分隔符,應用層協議需要在自己的消息中包含該消息的長度信息。類比:你向一個文件追加一系列的序列化對象數據(可看做應用層協議包),如果你自己不標記每次序列化數據的長度,到了反序列化的時候就沒辦法了。如果你類似Redis在處理字符串的時候在頭部維護字符串的長度,就可以安全的讀出該字符串。

UDP基於數據報:Udp接收到應用協議的某個消息(已編碼為二進制)後,

不會分包,但是要記錄當前數據包的大小(消息大小加上8個字節頭部),然後交給IP層。IPV4對UDP數據報的大小限制為65535字節(包含頭部8個字節),你每次可以直接發送的消息不能超過65507字節。然後UDP協議會自行根據頭部的報文長度字段確定完整的消息,對於應用層協議來說,這就是一條完整的消息,不用再做邏輯分離消息。

不管是TCP或者UDP,IP層都會再次考慮MTU確定是否分包。IP層的功能這裡不展開。

可靠性和時效性

TCP是可靠的,可靠性通過確認和超時重傳機制保證。它是保證路由可達時最終能傳輸成功。

但是如果你加上時效性要求,這個“可靠性”就大打折扣了!考慮RPG遊戲場合,如果因為網絡丟包等原因,導致超時重傳消息1秒後才到,這種延遲你能接受麼?

通信鏈路不總是可靠的,如果出現問題,TCP協議是不會向上彙報的。而是通過ICMP協議來完成,最終由操作系統接收處理,而操作系統一般會接受多次反饋後才會最終確認“斷網了”,WIndows就會長達幾分鐘。你可以嘗試拔掉路由器的WLAN端口,再看看你的操作系統什麼時候才反應過來無法連接到因特網。你的應用協議可以忍受這麼長時間的“懵逼”狀態麼?

所以,即使TCP有可靠性保證,絕大部分基於TCP的應用層協議都會顯示或隱式地包含確認功能和超時設置。考慮HTTP,顯示的確認功能,客戶端都會有請求超時時間限制。

Tips:

自定義應用層協議需要保證消息有序傳輸時,tcp的滑動窗口是個很好的實現參考。

選擇問題

關於TCP和UDP的一般選擇,這裡不說了,到處都可以找到。

說幾兩個需要可靠性但是適用UDP的場合吧。

1、如果你需要做實時性很高且消息小(比如小於以太網的MTU1500Byte)的通信程序,UDP就很適合。關鍵消息重複發,不用等確認都可以,當然最終還是需要確認。

2、如果是內網環境,網絡非常穩定,UDP幾乎不會出問題,如果極度要求性能,可以考慮。

3、如果你公網網絡資源有限,而用戶之間需要傳遞大量數據,可以考慮用UDP做NAT穿透。


個人見解,歡迎大家評論或者提出意見。


0遷徙的麻雀0


“我是喲喲吼,專注於數據網絡的解答,歡迎大家與我交流數據網絡的問題。”

如題,TCP協議和UDP協議的區別有以下幾個:

1、TCP協議是面向連接的協議,而UDP協議是面向無連接的協議;

2、TCP協議在建立連接時需要三次握手,並且在建立連接後需要維護連接狀態,而UDP協議不需要建立連接,不需要維護連接狀態。因此TCP協議佔用系統資源較多,UDP佔用資源相對少;

3、TCP數據包頭最少長度為20個字節,而UDP只需8個字節;


4、TCP協議提供可靠服務,能保證數據正確性和順序,而UDP協議提供的服務不可靠,可能會產生丟包現象;

5、TCP協議發送的數據為流模式,而UDP協議發送的為數據報模式。

歡迎大家在評論中討論更深層的問題。


喲喲吼


首先,TCP/IP 和UDP最大的區別就是:TCP/IP是面向連接的,UDP是非面向連接的。通俗一點說就是:TCP/IP管發管到,UDP管發不管到。因此,在安全性方面來說,TCP/IP更具有優越性。

第二:TCP/IP偏重的是點對點的通信,使用時服務器和客戶端的區別顯而易見,而UDP則可以使用組播實現一對多,通信時更像一個群聊系統,幾乎沒有客戶端和服務器的區別,在時間和空間上具有更高的節約性。使用組播時,確定一個D類地址作為組的地址,將本機加入組中,向組內發送消息,從組中接收消息。

第三:在具體編寫的代碼結構上,TCP/IP是通過創建Socket對象進行連接,從連接對象上得到輸入輸出流,在流中讀寫從而通信。而UDP則是在本機創建DatagramSocket對象,將數據包裝成DatagramPacket包來發送,其中包裡有要發送到的地址。

TCP(Transmission Control Protocol,傳輸控制協議)是基於連接的協議,也就是說,在正式收發數據前,必須和對方建立可靠的連接。一個TCP連接必須要經過三次“對話”才能建立起來,其中的過程非常複雜,我們這裡只做簡單、形象的介紹,你只要做到能夠理解這個過程即可。我們來看看這三次對話的簡單過程:主機A向主機B發出連接請求數據包:“我想給你發數據,可以嗎?”,這是第一次對話;主機B向主機A發送同意連接和要求同步(同步就是兩臺主機一個在發送,一個在接收,協調工作)的數據包:“可以,你什麼時候發?”,這是第二次對話;主機A再發出一個數據包確認主機B的要求同步:“我現在就發,你接著吧!”,這是第三次對話。三次“對話”的目的是使數據包的發送和接收同步,經過三次“對話”之後,主機A才向主機B正式發送數據。

TCP協議能為應用程序提供可靠的通信連接,使一臺計算機發出的字節流無差錯地發往網絡上的其他計算機,對可靠性要求高的數據通信系統往往使用TCP協議傳輸數據。

向非連接”就是在正式通信前不必與對方先建立連接,不管對方狀態就直接發送。這與現在風行的手機短信非常相似:你在發短信的時候,只需要輸入對方手機號就OK了。

UDP(User Data Protocol,用戶數據報協議)是與TCP相對應的協議。它是面向非連接的協議,它不與對方建立連接,而是直接就把數據包發送過去!

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


夢不落116560421


假設有兩個人,第一個叫@幽彌狂,簡稱小y,第二個叫@真善則美,簡稱小z。現在小y想與小z通信。

TCP協議

小y:我想跟你說幾句話

小z:你很幼稚,我跟你沒有共同語言

小y:明白 理解 是我唐突了

UDP協議

小y:我想跟你說幾句話

(然後就沒有然後了,不知道小z收到還是沒收到,小y等得很糾結)


分享到:


相關文章: