回覆列表
  • 1 # 夢不落116560421

    首先,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發訊息,因此有時會出現收不到訊息的情況。

  • 2 # 遷徙de麻雀

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

    基於位元組流和麵向資料報

    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穿透。

  • 中秋節和大豐收的關聯?
  • 為什麼面板抓一下就會紅腫起包,還很癢?