User Datagram Protocol (UDP) 靜宜大學資工系 蔡奇偉 副教授 2006
大綱 簡介 程序對程序通訊 埠號 插座位址 使用者資料包格式 檢查合 UDP 運作 UDP 之用途
簡介 UDP 是程序 (process) 與 IP 間資料交流的一個簡單封包格式。 提供程序對程序的資料傳輸 非預接性 (connectionless) 不具可靠性 (unreliable) 不分封資料 適合少量資料與不在乎可靠性的傳輸,如 DNS。
UDP 在 TCP/IP 協定組的位置
程序對程序通訊 IP 協定負責主機對主機的通訊。不過這樣的傳輸並不完全,該筆訊息尚須交到正確的程序手上,這就需要像 UDP 這種傳輸層協定來執行。UDP 負責將訊息交給適當的程序。下圖展示 IP 及 UDP 運作的區域:
Figure 11-3 埠號 (Port numbers) 程序用一個 0 到 65535 的整數來代表,稱為埠號。以下圖的 Daytime 服務為例, 客戶端程序的埠號為 52000,伺服端程序的埠號為 13。(伺服端程序的埠號通常是公開且固定)
Figure 11-5 IANA (Internet Assigned Numbers Authority) 負責埠號的分配與管理。IANA 把埠號分隔成下圖所示的三個區間: 由 IANA 指定與管理。 須向 IANA 註冊以避免被重複使用。 不受 IANA 控制也不用註冊,任何程序都可使用,這些號碼為短暫埠號
IP 位址與埠號 如右圖所示,傳送 UDP 資料包時, IP 標頭中的 IP 位址欄用來指定目標主機; UDP 標頭中的埠號用來選擇程序。 Figure 11-4 IP 位址與埠號 如右圖所示,傳送 UDP 資料包時, IP 標頭中的 IP 位址欄用來指定目標主機; UDP 標頭中的埠號用來選擇程序。
插座位址 (Socket addresses) Figure 11-6 插座位址 (Socket addresses) UDP 用 IP 位址與埠號在兩端形成一個連線,一個IP位址與一個埠號的組合稱為插座位址 (如下圖所示) 。在用戶端的插座位址唯一的定義用戶端的程序,同樣地,伺服端的插座位址定義伺服端的程序 。
使用者資料包格式 (User Datagram Format) Figure 11-7 使用者資料包格式 (User Datagram Format) UDP 的封包被稱為使用者資料包,它的標頭固定為 8 個位元組。下圖展示其格式:
■來源端埠號 (Source port number) 這個埠號為來源端主機上的程序所使用。長為 16 位元,其範圍從 0 到 65,535。如果來源主機為用戶端,則大多情況下,其埠號為 UDP 軟體所選出的短暫埠號。如果來源主機為伺服端,則大多數埠號碼為公認埠號。 ■目的端埠號 (Destination port number) 這個埠號為目的主機上的程序所使用。長為 16 位元。如果目的主機為伺服端,其埠號大多為公認埠號。如果目的主機為用戶端,則其號碼大多為一短暫埠號。在這種情況下,伺服端程式會從收到的要求封包中,複製其短暫埠號過來。
■長度 (Length) 本欄為 16 位元長,用來代表使用者資料包 (標頭與資料) 的總長度。16 位元可定義長度為 0 到 65,535 位元組。不過 UDP 最小長度為 8 個位元組,代表該資料包只有標頭沒有資料。因此資料的長度最多為 65,507 位元組 ( 65,535 – 20 – 8 = 65,507,20 位元組為 IP 標頭,8 位元組為 UDP 標頭)。 ■檢查和 (Checksum) 檢查和用來偵測整個使用者資料包 (包括標頭與資料) 的錯誤。
UDP 資料包中的長度欄事實上是多餘的,因為資料包將被封裝在 IP 資料包內,由 IP 中的長度欄即可推出以下公式: 不過 UDP 協定的設計者認為,直接用目的 UDP 資料包內的長度資訊來獲得 UDP 資料的長度較為有效率,這樣就不用要求 IP 軟體來提供這項資訊。我們知道,當 IP 軟體把 UDP 使用者資料包送到 UDP 層時,IP 已經把 IP 標頭部分丟掉了。
檢查合 (Checksum) UDP 檢查合計算與 IP 或 ICMP 不同,UDP 的檢查合計算包括一個虛擬標頭 (pseudoheader)、UDP 標頭及來自應用層的資料。 虛擬標頭為 IP 標頭的一部分。如果檢查合不包含虛擬標頭,使用者資料包或許能安全無誤的到達,但是如果 IP 標頭遭毀壞,就有可能會被送到別台電腦。
Figure 11-8 UDP 資料包的虛擬標頭
Figure 11-9 一個簡單 UDP 使用者資料包的檢查和計算
UDP 運作 非預接式服務 (Connectionless Services) 前面提及 UDP 提供非預接式服務,表示每個 UDP 所送出的使用者資料包都是獨立的,不同的使用者資料包即使是來自相同的程序到相同的目的程式,彼此間也沒有任何關係。使用者資料包並不編號,也沒有如同 TCP 協定一樣,有所謂的連線建立與連線結束。以 UDP 方式,表示每個使用者資料包可能以不同的路徑旅行。 非預接式的另一個現象是,使用 UDP 的程序不能以資料流 (data stream) 的方式將資料送給 UDP,且期望 UDP 將之分成數個相關聯的使用者資料包。相反的,每個程序要求要送的資料,必須比一個使用者資料包小,也就是說,送短訊息的程序應該使用 UDP。
流量與錯誤控制 UDP 是一種非常簡單、非可靠性的傳輸協定。沒有流量控制,也就是說沒有流量窗口的機制,接收者可能被湧入的訊息淹沒。 在 UDP 除了檢查合外,沒有其他錯誤控制的機制,送出者不知道是否一筆訊息掉了或是重複傳送。當接收者以檢查合偵測到錯誤時,該資料包即被丟棄。由於 UDP 沒有流量控制及錯誤控制,必須由使用 UDP 的程序來提供這些機制。
封裝及解封裝 要把訊息從一個程序送到另一個程序,UDP 協定必須將訊息封裝起來再送出,並且在接收後,解封裝取出 (如下圖)。 Figure 11-10 封裝及解封裝 要把訊息從一個程序送到另一個程序,UDP 協定必須將訊息封裝起來再送出,並且在接收後,解封裝取出 (如下圖)。
Figure 11-11 UDP 的佇列 UDP 對每一個埠號建立輸出/入佇列,來處理與對應程序間的資料交流,如下圖所示:
多工與解多工 (Multiplexing and Demultiplexing) Figure 11-12 多工與解多工 (Multiplexing and Demultiplexing) 執行 TCP/IP 協定的主機只跑一個 UDP,但是可能有好幾個程序想使用 UDP 的服務,處理這種情況,要以 UDP 多工及解多工的方式進行 (如下圖)。
UDP 之用途 適合小量資料傳送而且也不在乎流量與錯誤控制的程序。 適合內部自定流量與錯誤控制機制的程序,如 TFTP。 適合廣播與群播的傳輸層協定,因為效率較高,而且錯誤的影響不大。 使用於如 SNMP 之類的網管的程序。 使用於 RIP 之類的路徑協定。