UDP - 用戶數(shù)據(jù)報協(xié)議
UDP是UserDatagramProtocol的簡稱,中文名是用戶數(shù)據(jù)報協(xié)議,是OSI(OpenSystemInterconnection,開放式系統(tǒng)互聯(lián))參考模型中一種無連接的傳輸層協(xié)議,提供面向事務(wù)的簡單不可靠信息傳送服務(wù),IETFRFC768是UDP的正式規(guī)范。UDP在IP報文的協(xié)議號是17。UDP協(xié)議全稱是用戶數(shù)據(jù)報協(xié)議,在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,是一種無連接的協(xié)議。在OSI模型中,在第四層——傳輸層,處于IP協(xié)議的上一層。

協(xié)議
UDP是OSI參考模型中一種無連接的傳輸層協(xié)議,它主要用于不要求分組順序到達的傳輸中,分組傳輸順序的檢查與排序由應(yīng)用層完成,提供面向事務(wù)的簡單不可靠信息傳送服務(wù)。UDP協(xié)議基本上是IP協(xié)議與上層協(xié)議的接口。UDP協(xié)議適用端口分別運行在同一臺設(shè)備上的多個應(yīng)用程序。
UDP提供了無連接通信,且不對傳送數(shù)據(jù)包進行可靠性保證,適合于一次傳輸少量數(shù)據(jù),UDP傳輸?shù)目煽啃杂蓱?yīng)用層負(fù)責(zé)。常用的UDP端口號有:
應(yīng)用協(xié)議端口號
DNS53
TFTP69
SNMP161
UDP報文沒有可靠性保證、順序保證和流量控制字段等,可靠性較差。但是正因為UDP協(xié)議的控制選項較少,在數(shù)據(jù)傳輸過程中延遲小、數(shù)據(jù)傳輸效率高,適合對可靠性要求不高的應(yīng)用程序,或者可以保障可靠性的應(yīng)用程序,如DNS、TFTP、SNMP等 。
使用
在選擇使用協(xié)議的時候,選擇UDP必須要謹(jǐn)慎。在網(wǎng)絡(luò)質(zhì)量令人十分不滿意的環(huán)境下,UDP協(xié)議數(shù)據(jù)包丟失會比較嚴(yán)重。但是由于UDP的特性:它不屬于連接型協(xié)議,因而具有資源消耗小,處理速度快的優(yōu)點,所以通常音頻、視頻和普通數(shù)據(jù)在傳送時使用UDP較多,因為它們即使偶爾丟失一兩個數(shù)據(jù)包,也不會對接收結(jié)果產(chǎn)生太大影響。比如我們聊天用的ICQ和QQ就是使用的UDP協(xié)議。
報頭
UDP報頭由4個域組成,其中每個域各占用2個字節(jié),具體如下:
源端口號
目標(biāo)端口號
數(shù)據(jù)報長度
校驗值
UDP協(xié)議使用端口號為不同的應(yīng)用保留其各自的數(shù)據(jù)傳輸通道。UDP和TCP協(xié)議正是采用這一機制實現(xiàn)對同一時刻內(nèi)多項應(yīng)用同時發(fā)送和接收數(shù)據(jù)的支持。數(shù)據(jù)發(fā)送一方(可以是客戶端或服務(wù)器端)將UDP數(shù)據(jù)包通過源端口發(fā)送出去,而數(shù)據(jù)接收一方則通過目標(biāo)端口接收數(shù)據(jù)。有的網(wǎng)絡(luò)應(yīng)用只能使用預(yù)先為其預(yù)留或注冊的靜態(tài)端口;而另外一些網(wǎng)絡(luò)應(yīng)用則可以使用未被注冊的動態(tài)端口。因為UDP報頭使用兩個字節(jié)存放端口號,所以端口號的有效范圍是從0到65535。一般來說,大于49151的端口號都代表動態(tài)端口。
數(shù)據(jù)報的長度是指包括報頭和數(shù)據(jù)部分在內(nèi)的總字節(jié)數(shù)。因為報頭的長度是固定的,所以該域主要被用來計算可變長度的數(shù)據(jù)部分(又稱為數(shù)據(jù)負(fù)載)。數(shù)據(jù)報的最大長度根據(jù)操作環(huán)境的不同而各異。從理論上說,包含報頭在內(nèi)的數(shù)據(jù)報的最大長度為65535字節(jié)。不過,一些實際應(yīng)用往往會限制數(shù)據(jù)報的大小,有時會降低到8192字節(jié)。
UDP協(xié)議使用報頭中的校驗值來保證數(shù)據(jù)的安全。校驗值首先在數(shù)據(jù)發(fā)送方通過特殊的算法計算得出,在傳遞到接收方之后,還需要再重新計算。如果某個數(shù)據(jù)報在傳輸過程中被第三方篡改或者由于線路噪音等原因受到損壞,發(fā)送和接收方的校驗計算值將不會相符,由此UDP協(xié)議可以檢測是否出錯。這與TCP協(xié)議是不同的,后者要求必須具有校驗值。
許多鏈路層協(xié)議都提供錯誤檢查,包括流行的以太網(wǎng)協(xié)議,也許你想知道為什么UDP也要提供檢查和校驗。其原因是鏈路層以下的協(xié)議在源端和終端之間的某些通道可能不提供錯誤檢測。雖然UDP提供有錯誤檢測,但檢測到錯誤時,UDP不做錯誤校正,只是簡單地把損壞的消息段扔掉,或者給應(yīng)用程序提供警告信息。
UDP?Helper是實現(xiàn)對指定UDP端口廣播報文的中繼轉(zhuǎn)發(fā),即將指定UDP端口的廣播報文轉(zhuǎn)換為單播報文發(fā)送給指定的服務(wù)器,起到中繼的作用。
功能
為了在給定的主機上能識別多個目的地址,同時允許多個應(yīng)用程序在同一臺主機上工作并能獨立地進行數(shù)據(jù)包的發(fā)送和接收,設(shè)計用戶數(shù)據(jù)報協(xié)議UDP。
使用UDP協(xié)議包括:TFTP、SNMP、NFS、DNS、BOOTP
UDP使用底層的互聯(lián)網(wǎng)協(xié)議來傳送報文,同IP一樣提供不可靠的無連接數(shù)據(jù)包傳輸服務(wù)。它不提供報文到達確認(rèn)、排序、及流量控制等功能。
報文格式
每個UDP報文分UDP報頭和UDP數(shù)據(jù)區(qū)兩部分。報頭由四個16位長(2字節(jié))字段組成,分別說明該報文的源端口、目的端口、報文長度以及校驗值。
分層封裝
在TCP/IP協(xié)議層次模型中,UDP位于IP層之上。應(yīng)用程序訪問UDP層然后使用IP層傳送數(shù)據(jù)報。IP層的報頭指明了源主機和目的主機地址,而UDP層的報頭指明了主機上的源端口和目的端口。
分解操作
UDP的復(fù)用、分解與端口
UDP軟件應(yīng)用程序之間的復(fù)用與分解都要通過端口機制來實現(xiàn)。每個應(yīng)用程序在發(fā)送數(shù)據(jù)報之前必須與操作系統(tǒng)協(xié)商以獲得協(xié)議端口和相應(yīng)的端口號。
UDP分解操作:從IP層接收了數(shù)據(jù)報之后,根據(jù)UDP的目的端口號進行分解操作。
UDP端口號指定有兩種方式:由管理機構(gòu)指定端口和動態(tài)綁定的方式。
配置命令
1.1.1?display?udp-helper?server
【命令】
display?udp-helper?server[interfaceinterface-type?interface-number]
【視圖】
任意視圖
【缺省級別】
2:系統(tǒng)級
【參數(shù)】
interfaceinterface-type?interface-number:顯示指定接口的UDP中繼轉(zhuǎn)發(fā)相關(guān)信息。interface-type?interface-number為接口類型和接口編號。
【描述】
display?udp-helper?server命令用來顯示UDP中繼轉(zhuǎn)發(fā)的相關(guān)信息。
如果不選擇參數(shù),則顯示所有接口的UDP中繼轉(zhuǎn)發(fā)相關(guān)信息。
【舉例】
顯示VLAN接口1的UDP中繼轉(zhuǎn)發(fā)相關(guān)信息。
<Sysname>?display?udp-helper?server?interface?vlan-interface?1
Interface?name?Server?address?Packets?sent
Vlan-interface1?192.1.1.2?0
以上顯示信息表示VLAN接口1對應(yīng)的目的服務(wù)器的IP地址為192.1.1.2,中繼轉(zhuǎn)發(fā)到該目的服務(wù)器的報文數(shù)為0。
1.1.2?reset?udp-helper?packet
【命令】
reset?udp-helper?packet
【視圖】
用戶視圖
【缺省級別】
2:系統(tǒng)級
【參數(shù)】
無
【描述】
reset?udp-helper?packet命令用來清除UDP中繼轉(zhuǎn)發(fā)的報文統(tǒng)計數(shù)目。
【舉例】
清除UDP中繼轉(zhuǎn)發(fā)的報文統(tǒng)計數(shù)目。
<Sysname>?reset?udp-helper?packet
1.1.3?udp-helper?enable
【命令】
udp-helper?enable
undo?udp-helper?enable
【視圖】
系統(tǒng)視圖
【缺省級別】
2:系統(tǒng)級
【參數(shù)】
無
【描述】
udp-helper?enable命令用來使能UDP?Helper功能,設(shè)備會將指定UDP端口的廣播報文轉(zhuǎn)換為單播報文發(fā)送給指定的目的服務(wù)器,起到中繼的作用。undo?udp-helper?enable命令用來關(guān)閉UDP?Helper功能。
缺省情況下,UDP?Helper功能處于關(guān)閉狀態(tài)。
【舉例】
使能UDP?Helper功能。
<Sysname>?system-view
[Sysname]?udp-helper?enable
1.1.4?udp-helper?port
【命令】
udp-helper?port{port-number|dns|netbios-ds|netbios-ns|tacacs|tftp|time}
undo?udp-helper?port{port-number|dns|netbios-ds|netbios-ns|tacacs|tftp|time}
【視圖】
系統(tǒng)視圖
【缺省級別】
2:系統(tǒng)級
【參數(shù)】
port-number:需要中繼轉(zhuǎn)發(fā)的UDP端口號,取值范圍為1~65535(不支持67和68)。
dns:對DNS的數(shù)據(jù)報文進行中繼轉(zhuǎn)發(fā),對應(yīng)的UDP端口號為53。
netbios-ds:對NetBIOS數(shù)據(jù)報服務(wù)的數(shù)據(jù)報文進行中繼轉(zhuǎn)發(fā),對應(yīng)的UDP端口號為138。
netbios-ns:對NetBIOS名字服務(wù)的數(shù)據(jù)報文進行中繼轉(zhuǎn)發(fā),對應(yīng)的UDP端口號為137。
tacacs:對終端訪問控制器訪問控制系統(tǒng)的數(shù)據(jù)報文進行中繼轉(zhuǎn)發(fā),對應(yīng)的UDP端口號為49。
tftp:對簡單文件傳輸協(xié)議的數(shù)據(jù)報文進行中繼轉(zhuǎn)發(fā),對應(yīng)的UDP端口號為69。
time:對時間服務(wù)的數(shù)據(jù)報文進行中繼轉(zhuǎn)發(fā),對應(yīng)的UDP端口號為37。
【描述】
udp-helper?port命令用來配置需要中繼轉(zhuǎn)發(fā)的UDP端口。undo?udp-helper?port命令用來取消對需要中繼轉(zhuǎn)發(fā)的UDP端口的配置。
缺省情況下,沒有配置中繼轉(zhuǎn)發(fā)的UDP端口。
關(guān)閉UDP?Helper功能后,所有已配置的UDP端口都被取消。
【舉例】
配置對目的UDP端口號為100的廣播報文進行中繼轉(zhuǎn)發(fā)。
<Sysname>?system-view
[Sysname]?udp-helper?port?100
1.1.5?udp-helper?server
【命令】
udp-helper?serverip-address
undo?udp-helper?server[ip-address]
【視圖】
三層以太網(wǎng)接口視圖/VLAN接口視圖
【缺省級別】
2:系統(tǒng)級
【參數(shù)】
ip-address:目的服務(wù)器的IP地址,為點分十進制形式。
【描述】
udp-helper?server命令用來配置中繼轉(zhuǎn)發(fā)的目的服務(wù)器。undo?udp-helper?server命令用來刪除中繼轉(zhuǎn)發(fā)的目的服務(wù)器。
缺省情況下,沒有配置中繼轉(zhuǎn)發(fā)的目的服務(wù)器。
目前,一個接口上最多可以配置20個中繼轉(zhuǎn)發(fā)的目的服務(wù)器。
需要注意的是,undo?udp-helper?server命令后不加參數(shù)時,將會刪除該接口下配置的所有目的服務(wù)器。
相關(guān)配置可參考命令display?udp-helper?server。?
特性
(1)UDP是一個無連接協(xié)議,傳輸數(shù)據(jù)之前源端和終端不建立連接,當(dāng)它想傳送時就簡單地去抓取來自應(yīng)用程序的數(shù)據(jù),并盡可能快地把它扔到網(wǎng)絡(luò)上。在發(fā)送端,UDP傳送數(shù)據(jù)的速度僅僅是受應(yīng)用程序生成數(shù)據(jù)的速度、計算機的能力和傳輸帶寬的限制;在接收端,UDP把每個消息段放在隊列中,應(yīng)用程序每次從隊列中讀一個消息段。
(2)由于傳輸數(shù)據(jù)不建立連接,因此也就不需要維護連接狀態(tài),包括收發(fā)狀態(tài)等,因此一臺服務(wù)機可同時向多個客戶機傳輸相同的消息。
(3)UDP信息包的標(biāo)題很短,只有8個字節(jié),相對于TCP的20個字節(jié)信息包的額外開銷很小。
(4)吞吐量不受擁擠控制算法的調(diào)節(jié),只受應(yīng)用軟件生成數(shù)據(jù)的速率、傳輸帶寬、源端和終端主機性能的限制。
(5)UDP使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持復(fù)雜的鏈接狀態(tài)表(這里面有許多參數(shù))。
(6)UDP是面向報文的。發(fā)送方的UDP對應(yīng)用程序交下來的報文,在添加首部后就向下交付給IP層。既不拆分,也不合并,而是保留這些報文的邊界,因此,應(yīng)用程序需要選擇合適的報文大小。
雖然UDP是一個不可靠的協(xié)議,但它是分發(fā)信息的一個理想?yún)f(xié)議。例如,在屏幕上報告股票市場、在屏幕上顯示航空信息等等。UDP也用在路由信息協(xié)議RIP(Routing?Information?Protocol)中修改路由表。在這些應(yīng)用場合下,如果有一個消息丟失,在幾秒之后另一個新的消息就會替換它。UDP廣泛用在多媒體應(yīng)用中,例如,Progressive?Networks公司開發(fā)的RealAudio軟件,它是在因特網(wǎng)上把預(yù)先錄制的或者現(xiàn)場音樂實時傳送給客戶機的一種軟件,該軟件使用的RealAudio?audio-on-demand?protocol協(xié)議就是運行在UDP之上的協(xié)議,大多數(shù)因特網(wǎng)電話軟件產(chǎn)品也都運行在UDP之上。
對比
UDP和TCP協(xié)議的主要區(qū)別是兩者在如何實現(xiàn)信息的可靠傳遞方面不同。TCP協(xié)議中包含了專門的傳遞保證機制,當(dāng)數(shù)據(jù)接收方收到發(fā)送方傳來的信息時,會自動向發(fā)送方發(fā)出確認(rèn)消息;發(fā)送方只有在接收到該確認(rèn)消息之后才繼續(xù)傳送其它信息,否則將一直等待直到收到確認(rèn)信息為止。與TCP不同,UDP協(xié)議并不提供數(shù)據(jù)傳送的保證機制。如果在從發(fā)送方到接收方的傳遞過程中出現(xiàn)數(shù)據(jù)報的丟失,協(xié)議本身并不能做出任何檢測或提示。因此,通常人們把UDP協(xié)議稱為不可靠的傳輸協(xié)議。
相對于TCP協(xié)議,UDP協(xié)議的另外一個不同之處在于如何接收突發(fā)性的多個數(shù)據(jù)報。不同于TCP,UDP并不能確保數(shù)據(jù)的發(fā)送和接收順序。例如,一個位于客戶端的應(yīng)用程序向服務(wù)器發(fā)出了以下4個數(shù)據(jù)報
D1
D22
D333
D4444
但是UDP有可能按照以下順序?qū)⑺邮盏臄?shù)據(jù)提交到服務(wù)端的應(yīng)用:
D333
D1
D4444
D22
事實上,UDP協(xié)議的這種亂序性基本上很少出現(xiàn),通常只會在網(wǎng)絡(luò)非常擁擠的情況下才有可能發(fā)生。
應(yīng)用
既然UDP是一種不可靠的網(wǎng)絡(luò)協(xié)議,那么還有什么使用價值或必要呢?其實不然,在有些情況下UDP協(xié)議可能會變得非常有用。因為UDP具有TCP所望塵莫及的速度優(yōu)勢。雖然TCP協(xié)議中植入了各種安全保障功能,但是在實際執(zhí)行的過程中會占用大量的系統(tǒng)開銷,無疑使速度受到嚴(yán)重的影響。反觀UDP由于排除了信息可靠傳遞機制,將安全和排序等功能移交給上層應(yīng)用來完成,極大降低了執(zhí)行時間,使速度得到了保證。
關(guān)于UDP協(xié)議的最早規(guī)范是RFC768,1980年發(fā)布。盡管時間已經(jīng)很長,但是UDP協(xié)議仍然繼續(xù)在主流應(yīng)用中發(fā)揮著作用。包括視頻電話會議系統(tǒng)在內(nèi)的許多應(yīng)用都證明了UDP協(xié)議的存在價值。因為相對于可靠性來說,這些應(yīng)用更加注重實際性能,所以為了獲得更好的使用效果(例如,更高的畫面幀刷新速率)往往可以犧牲一定的可靠性(例如,畫面質(zhì)量)。這就是UDP和TCP兩種協(xié)議的權(quán)衡之處。根據(jù)不同的環(huán)境和特點,兩種傳輸協(xié)議都將在今后的網(wǎng)絡(luò)世界中發(fā)揮更加重要的作用。
程序設(shè)計
UDP?Server程序
編寫程序
- 1使用socket - 來建立一個UDP?socket,第二個參數(shù)為SOCK_DGRAM。
- 2初始化sockaddr_in結(jié)構(gòu)的變量,并賦值。sockaddr_in結(jié)構(gòu)定義:
struct?sockaddr_in?{
uint8_t?sin_len?;
sa_family_t?sin_family;
in_port_t?sin_port?;
structin_addrsin_addr;
char?sin_zero;
};
這里使用“8888”作為服務(wù)程序的端口,使用“INADDR_ANY”作為綁定的IP地址即任何主機上的地址。
- 3使用bind - 把上面的socket和定義的IP地址和端口綁定。這里檢查bind - 是否執(zhí)行成功,如果有錯誤就退出。這樣可以防止服務(wù)程序重復(fù)運行的問題。
- 4進入無限循環(huán)程序,使用recvfrom - 進入等待狀態(tài),直到接收到客戶程序發(fā)送的數(shù)據(jù),就處理收到的數(shù)據(jù),并向客戶程序發(fā)送反饋。這里是直接把收到的數(shù)據(jù)發(fā)回給客戶程序。
例子程序
1、編譯例子程序
使用如下命令來編譯例子程序:
gcc?-Wall?-o?udpserv?udpserv.c
gcc?-Wall?-o?udpclient?udpclient.c
編譯完成生成了udpserv和udpclient兩個可執(zhí)行程序。
2、運行UDP?Server程序
執(zhí)行./udpserv&命令來啟動服務(wù)程序。我們可以使用netstat-ln命令來觀察服務(wù)程序綁定的IP地址和端口,部分輸出信息如下:
Active?Internet?connections? - only?servers
Proto?Recv-Q?Send-Q?Local?Address?Foreign?Address?State
tcp000.0.0.0:32768?0.0.0.0:*?LISTEN
tcp000.0.0.0:111?0.0.0.0:*?LISTEN
tcp000.0.0.0::6000?0.0.0.0:*?LISTEN
tcp000.0.0.0::631?0.0.0.0:*?LISTEN
udp000.0.0.0:32768?0.0.0.0:*
udp000.0.0.0:8888?0.0.0.0:*
udp000.0.0.0:111?0.0.0.0:*
udp000.0.0.0:882?0.0.0.0:*
可以看到udp處有“0.0.0.0:8888”的內(nèi)容,說明服務(wù)程序已經(jīng)正常運行,可以接收主機上任何IP地址且端口為8888的數(shù)據(jù)。
如果這時再執(zhí)行./udpserv&命令,就會看到如下信息:
bind?error:?Address?already?in?use
說明已經(jīng)有一個服務(wù)程序在運行了。
運行程序
執(zhí)行./udpclient?127.0.0.1命令來啟動客戶程序,使用127.0.0.1來連接服務(wù)程序,執(zhí)行效果如下:
Hello,World!
Hello,World!
this?is?a?test
this?is?a?test
^d
輸入的數(shù)據(jù)都正確從服務(wù)程序返回了,按ctrl+d可以結(jié)束輸入,退出程序。
如果服務(wù)程序沒有啟動,而執(zhí)行客戶程序,就會看到如下信息:
$./udpclient127.0.0.1
test
read?error:?Connection?refused
說明指定的IP地址和端口沒有服務(wù)程序綁定,客戶程序就退出了。這就是使用connect - 的好處,注意,這里錯誤信息是在向服務(wù)程序發(fā)送數(shù)據(jù)后收到的,而不是在調(diào)用connect - 時。如果使用tcpdump程序來抓包,會發(fā)現(xiàn)收到的是ICMP的錯誤信息。
其他相關(guān)
UDP=uridine?diphosphate,尿苷二磷酸,一種嘧啶核苷酸,由堿基、尿嘧啶與核糖組成,主要用途是RNA合成(轉(zhuǎn)錄)時的原料。另外UDP也是DTP能量消耗后產(chǎn)物,功能類似ADP,但較ADP少見。參與微生物肽聚糖等的合成。
