【計算機網絡】一篇文章帶你快速掌握UDP協議

目錄

一、UDP簡介

二、UDP的特點

2.1 面向無連接

2.2 有單播,多播,廣播的功能

2.3 UDP是面向報文的

2.4 不可靠性(無擁塞控制)

2.5 首部開銷小,傳輸數據報文時是很高效的 

三、UDP首部

四、UDP校驗

4.1 UDP校驗和

4.2 TCP協議、IP協議、ICMP協議的校驗方法

4.2.1 TCP協議

4.2.2 IP協議

4.2.3 ICMP協議

四、UDP協議使用場景


一、UDP簡介

UDP協議全稱是用戶數據報協議(User Datagram Protocol,在網絡中它與TCP協議一樣用於處理數據包,是一種無連接的協議。在OSI模型中,在第四層——傳輸層,處於IP協議的上一層。UDP有不提供數據包分組、組裝和不能對數據包進行排序的缺點,也就是說,當報文發送之後,是無法得知其是否安全完整到達的。

UDP傳輸與IP傳輸非常類似。你可以將UDP協議看作IP協議暴露在傳輸層的一個接口。UDP協議同樣以數據包的方式傳輸,它的傳輸方式也是"Best Effort"的(盡最大努力交付,但不保證可靠交付),所以UDP協議也是不可靠的。

那麼,我們爲什麼不直接使用IP協議而要額外增加一個UDP協議呢? 一個重要的原因是IP協議中並沒有端口(port)的概念。IP協議進行的是IP地址到IP地址的傳輸,這意味者兩臺計算機之間的對話。但每臺計算機中需要有多個通信通道,並將多個通信通道分配給不同的進程使用,一個端口就代表了這樣的一個通信通道。

 

二、UDP的特點

2.1 面向無連接

首先 UDP 是不需要和 TCP一樣在發送數據前進行三次握手建立連接的,想發數據就可以開始發送了。並且也只是數據報文的搬運工,不會對數據報文進行任何拆分和拼接操作。

UDP無連接,時間上不存在建立連接需要的時延。空間上,TCP需要在端系統中維護連接狀態,需要一定的開銷。此連接裝入包括接收和發送緩存,擁塞控制參數和序號與確認號的參數。UCP不維護連接狀態,也不跟蹤這些參數,開銷小。空間和時間上都具有優勢。

具體來說就是:

  • 在發送端,應用層將數據傳遞給傳輸層的 UDP 協議,UDP 只會給數據增加一個 UDP 頭標識下是 UDP 協議,然後就傳遞給網絡層了
  • 在接收端,網絡層將數據傳遞給傳輸層,UDP 只去除 IP 報文頭就傳遞給應用層,不會任何拼接操作

舉個例子:

  • DNS如果運行在TCP之上而不是UDP,那麼DNS的速度將會慢很多。
  • HTTP使用TCP而不是UDP,是因爲對於基於文本數據的Web網頁來說,可靠性很重要。
  • 同一種專用應用服務器在支持UDP時,一定能支持更多的活動客戶機。

 

2.2 有單播,多播,廣播的功能

UDP 不止支持一對一的傳輸方式,同樣支持一對多,多對多,多對一的方式,也就是說 UDP 提供了單播,多播,廣播的功能。

 

2.3 UDP是面向報文的

發送方的UDP對應用程序交下來的報文,在添加首部後就向下交付IP層。UDP對應用層交下來的報文,既不合並,也不拆分,而是保留這些報文的邊界。因此,應用程序必須選擇合適大小的報文。

IP層交上來UDP用戶數據報,在去除首部後就原封不動地交付給上層應用進程,報文不可分割,是UDP數據報處理的最小單位。

正是因爲這樣,UDP顯得不夠靈活,不能控制讀寫數據的次數和數量。比如我們要發送100個字節的報文,我們調用一次sendto函數就會發送100字節,對端也需要用recvfrom函數一次性接收100字節,不能使用循環每次獲取10個字節,獲取十次這樣的做法。

 

 

2.4 不可靠性(無擁塞控制)

首先不可靠性體現在無連接上,通信都不需要建立連接,想發就發,這樣的情況肯定不可靠。

並且收到什麼數據就傳遞什麼數據,並且也不會備份數據,發送數據也不會關心對方是否已經正確接收到數據了。

再者網絡環境時好時壞,但是 UDP 因爲沒有擁塞控制,一直會以恆定的速度發送數據。即使網絡條件不好,也不會對發送速率進行調整。這樣實現的弊端就是在網絡條件不好的情況下可能會導致丟包,但是優點也很明顯,在某些實時性要求高的場景(比如電話會議)就需要使用 UDP 而不是 TCP

從上面的動態圖可以得知,UDP只會把想發的數據報文一股腦的丟給對方,並不在意數據有無安全完整到達。

總的來說:

  • UDP沒有擁塞控制,應用層能夠更好的控制要發送的數據和發送時間,網絡中的擁塞控制也不會影響主機的發送速率。某些實時應用要求以穩定的速度發送,能容忍一些數據的丟失,但是不能允許有較大的時延(比如實時視頻,直播等)
  • UDP提供盡最大努力的交付,不保證可靠交付。因此主機不需要維持複雜的連接狀態表。所有維護傳輸可靠性的工作需要用戶在應用層來完成。沒有TCP的確認機制、重傳機制。如果因爲網絡原因沒有傳送到對端,UDP也不會給應用層返回錯誤信息

 

2.5 首部開銷小,傳輸數據報文時是很高效的

UDP 頭部包含了以下幾個數據:

  • 兩個十六位的端口號,分別爲源端口(可選字段)和目標端口
  • 整個數據報文的長度
  • 整個數據報文的檢驗和(IPv4 可選 字段),該字段用於發現頭部信息和數據中的錯誤

因此 UDP 的頭部開銷小,只有八字節,相比 TCP 的至少二十字節要少得多,在傳輸數據報文時是很高效的。

 

三、UDP首部

 UDP首部有8個字節,由4個字段構成,每個字段都是兩個字節,

  1. 源端口: 源端口號,需要對方回信時選用,不需要時全部置0。長度爲16bit
  2. 目的端口:目的端口號,在終點交付報文的時候需要用到。長度爲16bit
  3. 長度:UDP的數據報的長度(包括首部和數據),其最小值爲8byte(只有首部)。長度爲16bit
  4. 校驗和(Checksum):檢測UDP數據報在傳輸中是否有錯,有錯則丟棄。該字段是可選的,當源主機不想計算校驗和,則直接令該字段全爲0。UDP和TCP的校驗和都覆蓋到了他們的首部和數據,而IP報文首部的校驗和只覆蓋了IP首部。長度爲16bit

16bit的源端口和目的端口用來標記發送和接受的應用進程。因爲UDP不需要應答,所以源端口是可選的,如果源端口不用,那麼置爲零。當運輸層從IP層收到UDP數據報時,就是根據首部中的目的端口,把UDP數據報通過相應的端口,上交最後的終點——應用程序。

如果接收方UDP發現收到的報文中的目的端口號不正確(不存在對應端口號的應用進程0,),就丟棄該報文,並由ICMP發送“端口不可達”差錯報文給對方。ICMP應用Traceroute,就是讓發送的UDP用戶數據報故意使用一個非法的UDP端口,結果ICMP返回“端口不可達”差錯報文,因而達到了測試的目的。

以下爲這四部分的示意圖:

 

 

四、UDP校驗

4.1 UDP校驗和

在計算校驗和的時候,需要在UDP數據報之前增加12字節的僞首部,僞首部並不是UDP真正的首部。只是在計算校驗和時,臨時添加在UDP數據報的前面,得到一個臨時的UDP數據報。校驗和就是按照這個臨時的UDP數據報計算的。僞首部既不向下傳送也不向上遞交(但是會在發送方和接收方之間進行同層次[運輸層]的傳送),而僅僅是爲了計算校驗和。這樣的校驗和,既檢查了UDP數據報,又對IP數據報的源IP地址和目的IP地址進行了檢驗。

UDP校驗和的計算方法和IP數據報首部校驗和的計算方法相似,都使用二進制反碼運算求和再取反,但不同的是:IP數據報的校驗和只檢驗IP數據報的首部,但UDP的校驗和是把首部和數據部分一起校驗。

 

在發送端,首先是將全零放入檢驗和字段,並且添加僞首部。再將僞首部以及UDP用戶數據報(包括UDP首部和數據部分)看成是由許多16bit的字串接起來。 若UDP用戶數據報的數據部分不是偶數個字節,則要填入一個全零字節(即:最後一個基數字節應是16位數的高字節而低字節填0)。 然後按二進制反碼計算出這些16bit字的和(兩個數進行二進制反碼求和的運算的規則是:從低位到高位逐列進行計算。 0和0相加是0,0和1相加是1,1和1相加是0但要產生一個進位1,加到下一列。若最高位相加後產生進位,則最後得到的結果要加1),即將僞首部、UDP首部、UDP數據部分的所有二級制數按照16位爲一組分割出來,將所有的16位的二進制數求加和,然後將得到的結果取反存入到UDP報文的校驗和字段中(修改初始的全零校驗和),然後發送此UDP用戶數據報。 在接收端,將收到的UDP首部、UDP數據連同僞首部(以及可能的填充全零字節)一起,按照上面相同的方法進行計算,求分割出來的16bit數據的二進制和,並且將結果取反。 當無差錯時其結果應全爲1。否則就表明有差錯出現, 接收端就應將此UDP用戶數據報丟棄(也可以上交給應用層,但附上出現了差錯的警告)。

這種差錯檢驗的檢錯能力不強,但是簡單,速度快

 

4.2 TCP協議、IP協議、ICMP協議的校驗方法

4.2.1 TCP協議

TCP 的校驗和計算方法同UDP一樣,同樣要加上一個僞頭部,區別是僞頭部的協議碼是0x06,長度是整個TCP報文的長度(包含TCP頭部)。

 

4.2.2 IP協議

IP協議的首部檢驗和佔16位。這個字段只檢驗數據報的首部,但不包括數據部分。這是因爲數據報每經過一個路由器,路由器都要重新計算一下首部檢驗和(一些字段,如生存 時間、標誌、片偏移等都可能發生變化)。不檢驗數據部分可減少計算的工作量。爲了進一步減小計算檢驗和的工作量,IP首部的檢驗和不採用複雜的CRC檢驗碼而採用下面的簡單計算方法:在發送方,先把IP數據報首部劃分爲許多16位字的序列,並把檢驗和字段置零。用反碼算術運算把所有16位字相加後,將得到的和的反碼寫入檢驗和字段。接收方收到數據報後,將首部的所有16位字再使用反碼算術運算相加一次。將得到的和取反碼,即得出接收方檢驗和的計算結果。若首部未發生任何變化,則此結果必爲0,於是就保留這個數據報。否則即認爲出差錯,並將此數據報丟棄。下圖說明了 IP數據報首部檢驗和的計算過程。

4.2.3 ICMP協議

ICMP校驗和的計算方法一樣,只不過只是對ICMP包整個進行校驗和,沒有僞頭部,也不包括IP包頭部。

 

 

UDP協議使用場景

  1. 需要資源少,在網絡情況比較好的內網,或者對於丟包不敏感的應用。如DHCP協議就是基於UDP的。一般的獲取IP地址都是內網請求,而且一次獲取不到IP又沒事。
  2. 不需要一對一溝通,建立連接,而是可以廣播的應用。DHCP就是一種廣播的形式。VXLAN也是需要用到組播,也是基於UDP協議的。
  3. 需要處理速度快,時延低,可以容忍少數丟包,但是要求即便網絡擁塞,也毫不退縮,一往無前的時候。
  4. QUIC是Google提出的一種基於UDP改進的通信協議,其目的是降低網絡通信的延遲,提供更好的用戶互動體驗。
  5. UDP常用一次性傳輸比較少量數據的網絡應用,如DNS,SNMP等,因爲對於這些應用,若是採用TCP,爲連接的創建,維護和拆除帶來不小的開銷。UDP也常用於多媒體應用(如IP電話,實時視頻會議,流媒體等)數據的可靠傳輸對他們而言並不重要,TCP的擁塞控制會使他們有較大的延遲,也是不可容忍的

參考資料:https://www.linuxidc.com/Linux/2018-09/154366.htm
                  計算機網絡(第7版)-謝希仁

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章