使用者資料報協定(User Datagram Protocol,UDP)是無連接配接不可靠傳輸層協定。它不提供主機到主機通信,它除了提供程序到程序之間的通信之外,就沒有給 IP 服務增加任何東西。此外,它進行非常有限的差錯檢驗。如果 UDP 功能是如此之差,那麼為什麼程序還要使用它?它有缺點也有優點。UDP 是一個非常簡單的協定,開銷最小。如果一個程序想發送很短的封包,而且不在意可靠性,就可以使用 UDP。使用 UDP 發送一個很短的封包,在發送方和接收方之間的互動要比使用 TCP 時少得多。
使用者資料報
UDP 分組稱為使用者資料報(user datagram),有 8 位元組的固定頭部,這個頭部由 4 個字段組成,每個字段 2 位元組(16 位)。
頭兩個字段定義了源和目的端口号。第三個字段定義了使用者資料報的總長,即頭部加資料的長度。16 位可以定義的總長度範圍是 0 到 65 535。然而,總長度需要更小一些,這是因為 UDP資料報存儲在總長度為 65 535 的 IP資料報中。最後一個字段可以攜帶可選校驗和。
UDP服務
程序到程序的通信
UDP 使用套接字位址提供程序到程序通信,這是 IP 位址和端口号的組合。
無連接配接服務
UDP 提供無連接配接服務。這就是表示 UDP 發送出去的每一個使用者資料報都是一個獨立的資料報。不同的使用者資料報之間沒有關系,即使它們都是來自相同的源程序并發送到相同的目的程式。使用者資料報不進行編号。此外,也沒有像 TCP 協定那樣的連接配接建立和連接配接終止,這就表示每一個使用者資料報可以沿着不同的路徑傳遞。
無連接配接的一個結果就是使用 UDP 的程序不能夠向 UDP 發送資料流,并期望它将這個資料流分割成許多不同的相關聯的使用者資料報。相反,每一個請求必須足夠小,使其能夠裝入使用者資料報中,隻有那些發送短封包的程序才應當使用 UDP。短封包小于 65 507 位元組(65 535 減去 UDP 頭部的 8位元組再減去 IP 頭部的 20 位元組)。
流量控制
UDP 是一個非常簡單的協定。它沒有流量控制(flow control),因而也沒有視窗機制。如果到來的封包太多時,接收方可能會溢出。缺乏流量控制意味着如果需要的話,使用 UDP 的程序應該提供這個服務。
差錯控制
除校驗和外,UDP 也沒有差錯控制(error control)機制,這就表示發送方不知道封包是丢失還是重傳。當接收方使用校驗和檢測出差錯時,它就悄悄地将此使用者資料報丢棄。缺乏差錯控制意味着如果需要的話,使用 UDP 的程序應該提供這個服務。
校驗和
UDP 校驗和包含三部分:僞頭部、UDP 頭部和從應用層來的資料。僞頭部(psedoheader)是 IP 分組的頭部的一部分,其中有些字段要填入 0,使用者資料報分裝在 IP 分組中(見圖 3-40)。
如果校驗和不包括僞頭部,使用者資料報也可能是安全完整地到達。但是,如果 IP 頭部受到損壞,那麼它可能被送出到錯誤的主機。
增加協定字段可確定這個分組是屬于 UDP,而不是屬于其他傳輸層協定。如果一個程序既可用 UDP 又可用 TCP,則端口号可以是相同的。UDP 的協定字段值是 17。
如果在傳輸過程中這個值改變了,在接收端計算校驗和時就可檢測出來,UDP 就可丢棄這個分組。這樣就不會傳遞給錯誤的協定。
可選校驗和
UDP 分組的發送方可以選擇不計算校驗和。這種情況下,在發送前,校驗和字段就全填入 0。在發送方決定計算校驗和的情況下,如果碰巧結果全是 0,那麼在發送前校驗和全改為 1。換言之,發送方填充兩次校驗和。注意,這不會産生混淆,因為校驗和的值在正常情況下不會全為 1(見例3.12)。
擁塞控制
由于 UDP 是無連接配接協定,它不提供擁塞控制。UDP 假設被發送的分組很小且零星,不會在網絡中造成擁塞。今天當 UDP 被用做音頻和視訊的互動實時傳輸時,這個假設可能對也可
能不對。
封裝和解封裝
要将封包從一個程序發送到另一個程序時,UDP 協定就要對封包進行封裝和解封裝。排隊我們已經讨論過端口,但是沒有讨論端口的實際實作。在 UDP 中,隊列是與端口聯系在一起的。在用戶端,當程序啟動時,它從作業系統請求一個端口号。有些實作是建立一個入隊列和一個出隊列與每一個程序相關聯。而有些實作隻建立與每一個程序相關的入隊列。
多路複用與多路分解
在運作 TCP/IP 協定簇的主機上隻有一個 UDP,但可能有多個想使用 UDP 服務的程序。處理這種情況,UDP 采用多路複用和多路分解。
UDP 和通用簡單協定比較
我們可以将 UDP 與之前讨論的無連接配接簡單協定進行比較。唯一的差別就是 UDP 提供可選校驗和來在接收端發現被破壞分組。如果校驗和被加入分組,接收 UDP 可以檢測分組,如果分組被破壞可以丢棄它。然而,沒有回報被發向發送方。
UDP 是我們之前讨論的無連接配接簡單協定的一個例子,差別在于它為差錯檢測加入了可選校驗和。