0.3 UDP

 

 UDP用戶數據報協議User Datagram Protocol,)是一個簡單的面向數據報的傳輸層協議。

TCP/IP模型中,UDP為網路層以上和應用層以下提供了一個簡單的介面。UDP只提供數據的不可靠傳遞,它一旦把應用程序發給網路層的數據發送出去,就不保留數據備份(所以UDP有時候也被認為是不可靠的數據報協議)。

 

UDP首部欄位由4個部分組成,其中兩個是可選的。各16bit的來源埠和目的埠用來標記發送和接受的應用進程。因為UDP不需要應答,所以來源埠是可選的,如果來源埠不用,那麼置為零。在目的埠後面是長度固定的以位元組為單位的長度域,用來指定UDP數據報包括數據部分的長度,長度最小值為8byte。首部剩下地16bit是用來對首部和數據部分一起做校驗和(Checksum)的,這部分是可選的,但在實際應用中一般都使用這一功能。

Source IP Address (32)

Destination IP Address (32)

Zero (8)

Protocol (8)

UDP Length (16)

 

由於缺乏可靠性且屬於非連接導向協定,UDP應用一般必須允許一定量的丟包、出錯和複製。有些應用,比如TFTP,如果需要則必須在應用層增加根本的可靠機制。但是絕大多數UDP應用都不需要可靠機制,甚至可能因為引入可靠機制而降低性能。流媒體、實時多媒體遊戲和IP電話 (VoIP)就是典型的UDP應用。如果某個應用需要很高的可靠性,那麼可以用傳輸控制協議(TCP協議)來代替UDP。

 

由於缺乏擁塞控制(congestion control),需要基於網路的機制來減小因失控和高速UDP流量負荷而導致的擁塞崩潰效應。換句話說,因為UDP發送者不能夠檢測擁塞,所以像使用包隊列和丟棄技術的路由器這樣的網路基本設備往往就成為降低UDP過大通信量的有效工具。數據報擁塞控制協議(DCCP)設計成通過在諸如流媒體類型的高速率UDP流中,增加主機擁塞控制,來減小這個潛在的問題。

典型網路上的眾多使用UDP協議的關鍵應用一定程度上是相似的。這些應用包括域名系統(DNS)、簡單網路管理協議(SNMP)、動態主機配置協議(DHCP)、路由信息協議(RIP)和某些影音串流服務等等。

 

UDP 是一種非可靠、非連線型的傳輸協定,因此無須像 TCP 那樣提供額外的欄位來控制傳輸可靠性。比起 TCP 來說,UDP 的封包表頭可精簡多了:

UDPSourcePort (16)

UDPDestinationPort (16)

Message Length (16)

UDP Checksum (16)

DATA
...

Source Port & Destination Port

跟 TCP 的 Port 一樣:就是 Socket Pair 中的兩個元素,只是給那些透過 UDP 傳送資料的程式使用而已。可在 Linux 的 /etc/services 這個檔案找到各自 Well-Known Port。

Message Length

整個 UDP 封包的長度,以位元組為單位( byte ),最小值為 8 。

Checksum

封包及資料的校驗值,跟 TCP 的 checksum 功能一樣,用作資料完整性的檢測依據。然而,關於 UDP 的 checksum 計算卻有點複雜,因為其值必需連同一個所謂的 UDP 虛擬表頭(UDP Pseudo Header) 一起計算的。虛擬表頭如下:

之所以稱為虛擬,是因為其中的 Source IP Address 與 Destinatin IP Address 並不出現在 UDP 封包中,而是在 IP 封包中。但在進行校驗的時侯,發送端與接收端則根據此 "虛擬" 的表頭及資料進行。然而,此表頭是不會出現在任何封包中的。