天天看點

計網 - TCP 協定 VS UDP 協定

文章目錄

PreUDP 協定UDP 的封包格式

  • 校驗和(Checksum)機制
  • UDP 與 TCP的差別
  • 1. 目的差異
  • 2. 可靠性差異
  • 3. 連接配接 vs 無連接配接
  • 流控技術(Flow Control)
  • 傳輸速度
  • 場景差異
  • 第一類:TCP 場景
  • 第二類:UDP 場景
  • 第三類:模糊地帶
  • 總結
  • QA
計網 - TCP 協定 VS UDP 協定

Pre

計網 - 傳輸層協定 TCP:TCP 為什麼握手是 3 次、揮手是 4 次?中提到了T CP 和 UDP 是今天應用最廣泛的傳輸層協定,擁有最核心的壟斷地位。

TCP 最核心的價值是提供了可靠性,而 UDP 最核心的價值是靈活,你幾乎可以用它來做任何事情。

例如:HTTP 協定 1.1 和 2.0 都基于 TCP,而到了 HTTP 3.0 就開始用 UDP 了。

UDP 在資料傳輸、網絡控制、音視訊、Web 技術中,都有很重要的地位. 設計系統時候,UDP 經常拿來和 TCP 比較. 那我們來粗略的看下 TCP 協定和 UDP 協定的優勢和劣勢吧

UDP 協定

UDP(User Datagram Protocol),目标是在傳輸層提供直接發送封包(Datagram)的能力。Datagram 是資料傳輸的最小機關。UDP 協定不會幫助拆分資料,它的目标隻有一個,就是發送封包。

額,既然是直接發送封包, 為什麼不直接調用 IP 協定呢? 如果裸發資料,IP 協定不香嗎?

計網 - TCP 協定 VS UDP 協定

這是因為傳輸層協定在承接上方應用層的調用,需要提供應用到應用的通信——是以要附上端口号。每個端口,代表不同的應用。傳輸層下層的 IP 協定,承接傳輸層的調用,将資料從主機傳輸到主機。IP 層不能區分應用,導緻哪怕是在 IP 協定上進行簡單封裝,也需要單獨一個協定。這就構成了 UDP 協定的市場空間。

UDP 的封包格式

UDP 的設計目标就是在允許使用者直接發送封包的情況下,最大限度地簡化應用的設計。下圖是 UDP 的封包格式。

計網 - TCP 協定 VS UDP 協定

可以看到,UDP 的封包非常簡化,隻有 5 個部分。

1. Source Port 是源端口号。因為 UDP 協定的特性(不需要 ACK),是以這個字段是可以省略的。但有時候對于防火牆、代理來說,Source Port 有很重要的意義,它們需要用這個字段行過濾和路由。

2. Destination Port 是目标端口号(這個字段不可以省略)。

3. Length 是消息體長度。

4. Checksum 是校驗和,作用是檢查封包是否出錯。

5. Data octets 就是一個位元組一個位元組的資料,Octet 是 8 位。

校驗和(Checksum)機制

校驗和(Checksum)機制,這個機制在很多的網絡協定中都會存在,因為校驗資料在傳輸過程中有沒有丢失、損壞是一個普遍需求。

在一次網絡會話中,我們傳輸的内容可能是:“你好!”,但事實上傳輸的是 01 組成的二進制。請思考這樣一個算法,我們把資料分成一個一個 byte,然後将所有 byte 相加,再将最終的結果取反。

比如現在資料有 4 個 byte:a,b,c,d,那麼一種最簡單的校驗和就是:

checksum=(a+b+c+d) ^ 0xff      

如果發送方用上述方式計算出 Checksum,并将 a,b,c,d 和 Checksum 一起發送給接收方,接收方就可以用同樣的算法再計算一遍,這樣就可以确定資料有沒有發生損壞(變化)。當然 Checksum 的做法,隻适用于資料發生少量變化的情況。如果資料發生較大的變動,校驗和也可能發生碰撞。

可以看到 UDP 的可靠性保證僅僅就是 Checksum 一種。如果一個資料封包 Datagram 發生了資料損壞,UDP 可以通過 Checksum 糾錯或者修複。 但是 UDP 沒有提供再多的任何機制,比如 ACK、順序保證以及流控等

UDP 與 TCP的差別

1. 目的差異

首先,這兩個協定的目的不同:TCP 協定的核心目标是提供可靠的網絡傳輸,而 UDP 的目标是在提供封包交換能力基礎上盡可能地簡化協定輕裝上陣。

2. 可靠性差異

TCP 核心是要在保證可靠性提供更好的服務。TCP 會有握手的過程,需要建立連接配接,保證雙方同時線上。而且TCP 有時間視窗持續收集無序的資料,直到這一批資料都可以合理地排序組成連續的結果。

UDP 并不具備以上這些特性,它隻管發送資料封包,而且 UDP 不需要 ACK,這意味着消息發送出去成功與否 UDP 是不管的。

3. 連接配接 vs 無連接配接

TCP 是一個面向連接配接的協定(Connection-oriented Protocol),傳輸資料必須先建立連接配接。 UDP 是一個無連接配接協定(Connection-less Protocol),資料随時都可以發送,隻提供發送封包(Datagram)的能力。

流控技術(Flow Control)

TCP 使用了流控技術來確定發送方不會因為一次發送過多的資料包而使接收方不堪重負。TCP 在發送緩沖區中存儲資料,并在接收緩沖區中接收資料。當應用程式準備就緒時,它将從接收緩沖區讀取資料。如果接收緩沖區已滿,接收方将無法處理更多資料,并将其丢棄。UDP 沒有提供類似的能力。

傳輸速度

UDP 協定簡化,封包小,沒有連接配接、可靠性檢查等,是以單純從傳輸速度上講,UDP 更快。

場景差異

TCP 每個資料封包都需要确認,是以天然不适應高速資料傳輸場景,比如觀看視訊(流媒體應用)、網絡遊戲(TCP 有延遲)等。具體來說,如果網絡遊戲用 TCP,每個封包都需要确認,可能會造成一定的延遲;再比如音、視訊傳輸天生就允許一定的丢包率;Ping 和 DNSLookup,這類型的操作隻需要一次簡單的請求/傳回,不需要建立連接配接,用 UDP 就足夠了。

近些年有一個趨勢,TCP/UDP 的邊界逐漸變得模糊,UDP 應用越來越多。比如傳輸檔案,如果考慮希望檔案無損到達,可以用 TCP。如果考慮希望傳輸足夠塊,就可能會用 UDP。再比如 HTTP 協定,如果考慮請求/傳回的可靠性,用 TCP 比較合适。但是像 HTTP 3.0 這類應用層協定,從功能性上思考,暫時沒有找到太多的優化點,但是想要把網絡優化到極緻,就會用 UDP 作為底層技術,然後在 UDP 基礎上解決可靠性。

是以理論上,任何一個用 TCP 協定構造的成熟應用層協定,都可以用 UDP 重構。這就好比,本來用一個工具可以解決所有問題,但是如果某一類問題體量非常大,就會專門為這類問題創造工具。是以,UDP 非常适合需要定制工具的場景。

下面把場景分成三類,TCP 應用場景、UDP 應用場景、模糊地帶(TCP、UDP 都可以考慮),可以參考。

第一類:TCP 場景

  • 遠端控制(SSH)
  • File Transfer Protocol(FTP)
  • 郵件(SMTP、IMAP)等
  • 點對點檔案傳出(微信等)

第二類:UDP 場景

  • 網絡遊戲
  • 音視訊傳輸
  • DNS
  • Ping
  • 直播

第三類:模糊地帶

  • HTTP(目前以 TCP 為主)
  • 檔案傳輸

以上我們從多個方面了解了 TCP 和 UDP 的差別,最後再來總結一下。UDP 不提供可靠性,不代表我們不能解決可靠性。UDP 的核心價值是靈活、輕量,構造了最小版本的傳輸層協定。在這個之上,還可以實作連接配接(Connection),實作會話(Session),實作可靠性(Reliability)……

計網 - TCP 協定 VS UDP 協定

總結

這裡針對 UDP 協定的内容進行了探讨, 網際網路協定群的傳輸層大體過了一遍。協定對于我們來說是非常重要的,協定的制定讓所有參與者一緻、有序地工作。

學習協定的設計,對工作非常有幫助。比如:

  • 學習 TCP 協定可以培養思維的缜密性——序号的設計、滑動視窗的設計、快速重發的設計、内在狀态機的設計,都是非常精妙的想法;
  • 學習 UDP 協定可以帶動我們反思自己的技術架構,有時候簡單的工具更受歡迎。Linux 下每個工具都是那麼簡單、專注,容易了解。相比 TCP 協定,UDP 更容易了解。

從程式架構上來說,今天我們更傾向于簡單專注的設計,我們更期望有解決封包傳輸的工具、有解決可靠性的工具、有解決流量控制的工具、有解決連接配接和會話的工具……

QA

好了 說一說 TCP 協定和 UDP 協定的優勢和劣勢?

TCP 最核心的價值就是提供封裝好的一套解決可靠性的優秀方案。TCP 幫助我們在確定吞吐量、延遲、丢包率的基礎上,保證可靠性。

曆史上 TCP 也是靠可靠性起家的,有一次著名的實驗,TCP 協定的設計者做了一次示範——利用 TCP 協定将資料在衛星和地面之間傳播了很多次,沒有發生任何資料損壞。從那個時候開始,研發人員開始大量選擇 TCP 協定。然後随着生态的發展,逐漸提供了流控等能力。TCP 的成功在于它給人們提供了很多現成、好用的能力。

UDP 則不同,UDP 提供了最小版的實作,隻支援 Checksum。UDP 最核心的價值是靈活、輕量、傳輸速度快。

考慮到不同應用的特性,如果不使用一個大而全的方案,為自己的應用特性量身定做,可能會做得更好。比如網絡遊戲中遊戲用戶端不斷向服務端發送玩家的位置,如果某一次消息丢失了,隻要這個消息不影響最終的遊戲結果,就可以隻看下一個消息。不同應用有不同的特性,需要的可靠性級别不一樣,這就是越來越多的應用開始使用 UDP 的原因之一。

其實對于我們來說,TCP 協定和 UDP 協定根本不存在什麼優勢和劣勢,隻不過是場景不同,選擇不同而已。最後還有一個非常重要的考慮因素就是成本,如果沒有足夠專業的團隊解決網絡問題,TCP 無疑會是更好的選擇。