本節課我們將從幾個方面對比 UDP 和 TCP。
UDP 和 TCP 是 TCP/IP 體系結構運輸層中的兩個重要協議,如圖所示,這是我們之前課程中介紹過的 TCP/IP 體系結構,它的運輸層有兩個非常重要的協議 UDP 和 TCP。在使用 TCP/IP 體系結構的網路通訊中,這兩個協議的使用頻率僅次於往基層的 IP 協議,TCP/IP 體系結構應用層中的某些協議,需要使用運輸層的 TCP 提供的服務,而另一些協議需要使用運輸層的 UDP 提供的服務。
UDP 是使用者資料包協議的英文縮寫詞,TCP 是傳輸控制協議的英文縮寫詞,接下來我們將從幾個方面對這兩個協議進行比較,如圖所示,這是因特網上的兩臺主機,他們在運輸層使用 UDP 協議進行通訊,縱座標為時間,使用 UDP 協議的通訊雙方可以隨時傳送資料。
再來看使用 TCP 協議的情況,使用 TCP 協議的通訊雙方在進行資料傳輸之前,必須使用三報文握手來建立 TCP 連線,TCP 連線建立成功後才能進行資料傳輸結束後,必須使用四報文揮手來釋放 TCP 連線。三報文握手和四報文揮手,屬於 TCP 的連線管理,其過程比較複雜,我們將在後續課程中專門介紹,需要注意的是這裡所謂的連線是指邏輯連線關係,而不是物理連線。
綜上所述,UDP 是無連線的,而 TCP 是面向連線的。
來看這個對比項,這是某個區域網上的需要 UDP 協議進行通訊的 4 臺主機,其中任何一臺主機都可向其他三臺主機傳送廣播,也可以向某個多播組傳送多播,還可以向某臺主機傳送單播,也就是說 UDP 支援單播多播以及廣播。換句話說,UDP 支援一對一,一對多以及一對全的通訊。
再來看使用 TCP 協議的情況,使用 TCP 協議的通訊雙方在進行資料傳輸之前,必須使用三報文握手來建立 TCP 連線,TCP 連線建立成功後,通訊雙方之間就好像有一條可靠的通訊通道,通訊雙方使用這條基於 TCP 連線的可靠通道進行通訊,很顯然 TCP 僅支援單播,也就是一對一的通訊。
接下來我們來對比這兩個協議對應用報文的處理。先來看使用 UDP 協議的情況,傳送方的應用程序,將應用層報文交付給運輸層的 UDP,UDP 直接給應用層報文,新增一個 UDP 首部,使之成為 UDP 使用者資料包,然後進行傳送。
需要說明的是為了簡單起見,我們忽略運輸層下面的各層處理,接受方的 UDP 收到該 UDP 使用者資料包後,去掉 UDP 首部,將應用層報文交付給應用程序,也就是說 UDP 對應用程序交下來的報文,既不合並也不拆分,而是保留這些報文的邊界。換句話說,UDP 是面向應用報文的。
再來看使用 TCP 協議的情況,傳送方的 TCP把應用程序交付下來的資料塊,僅僅看作是一連串的無結構的位元組流,TCP 並不知道這些待傳送的位元組流的含義,僅將他們編號並儲存在自己的傳送快取中。TCP 根據傳送策略,從傳送快取中提取一定數量的位元組,構建 TCP 報文段併傳送。接收方的 TCP,一方面從所接收到的 TCP 報文段中取出資料載荷部分,並儲存在接收快取中,一方面將接收快取中的一些位元組交付給應用程序,TCP 不保證接收方應用程序所收到的資料塊與傳送方應用程序和發出的資料塊具有對應大小的關係。例如傳送方應用程序交給傳送方的 TCP,共 10 個資料塊,但接收方的 TCP 可能只用了 4 個資料塊,就把收到的位元組流交付給了上層的應用程序,但接收方應用程序收到的位元組流必須和傳送方應用程序發出的位元組流完全一樣。
當然,接收方的應用程序必須有能力識別收到的位元組流,把它還原成有意義的應用層資料,也就是說 TCP 是面向自位元組流的,這正是 TCP 實現可靠傳輸,流量控制以及擁塞控制的基礎。
需要說明的是為了突出示意圖的要點,我們只畫出了一個方向的資料流,在實際網路中基於 TCP 連線的兩端,可以同時進行 TCP 報文段的傳送和接收,也就是全雙工通訊。另外圖中 TCP 報文段的資料部分只包含了幾個位元組,實際當中一個 TCP 報文段包含上千個位元組是很常見的。
再來看下一個對比項,在之前的課程中,我們曾介紹過 TCPIP 體系結構的往繼層向其上層提供的是無連線不可靠的傳輸服務,當運輸層使用 UDP 協議時,向其上層提供的也是無連線不可靠的傳輸服務,傳送方給接收方傳送 UDP 使用者資料包,若傳輸過程中,使用者資料包受到干擾而產生誤碼,接收方 UDP 可以透過該資料包首部中的校驗和欄位的值,檢查出產生誤碼的情況,但僅僅丟棄該資料包,其他什麼也不做。
傳送方給接收方傳送 UDP 使用者資料包,如果該資料包被因特網中的某個路由器丟棄了,傳送方 UDP 不做任何處理,因為 UDP 向上層提供的是無連線不可靠的傳輸服務。因此對於 UDP 使用者資料包出現的誤碼和丟失等問題,UDP 並不關心。基於 UDP 的這個特點,UDP 適用於實時應用,例如 IP 電話、視訊會議等。
再來看使用 TCP 協議的情況,儘管網際層中的 IP 協議向上層提供的是無連線不可靠的傳輸服務,也就是說 IP 資料包可能在傳輸過程中出現丟失或誤碼,但只要運輸層使用 TCP 協議,就可向其上層提供面向連線的可靠傳輸服務。我們可將其想象成使用 TCP 協議的收發雙方,基於 TCP 連線的可靠性到進行資料傳輸,不會出現誤碼丟失、亂序以及重複等傳輸差錯。
TCP 適用於要求可靠傳輸的應用,例如檔案傳輸。
最後我們再來對比一下 UDP 使用者資料包的首部與 TCP 報文段的首部。一個 UDP 使用者資料包由首部和資料載荷兩部分構成,其首部格式如圖所示僅有 4 個欄位,每個欄位長度為 2 個位元組。由於 UDP 不提供可靠傳輸服務,它僅僅在網際層的基礎上新增了用於區分應用程序的埠,因此他的首部非常簡單,僅有 8 個位元組
1 個 TCP 報文段,有首部和資料載荷兩部分構成,其首部格式如圖所示,這比 UDP 使用者資料包的首部複雜的多,其最小長度為 20 位元組,最大長度為 60 位元組,這是因為 TCP 要實現可靠傳輸,流量控制、擁塞控制等服務,其首部自然會比較複雜,首部中的欄位比較多,首部長度也比較長。
本節課的內容小結如下,需要說明的是 TCP 的流量控制和擁塞控制比較複雜,我們並未在本節課中有關他們的介紹,我們將在後續課程中進行。