UDP 協議
用戶數據報(UDP)協議是運輸層提供的一種最低限度的復用/分解服務,可以在網絡層和正確的用戶即進程間傳輸數據。UDP 是一種不提供不必要服務的輕量級運輸協議,除了復用/分用功能和簡單的差錯檢測之外,幾乎就是 IP 協議了,也可以說它僅提供最小服務。UDP 是無連接的,因此在兩個進程通信前沒有握手過程。UDP 協議提供一種不可靠數據傳輸服務,也就是說,當一個進程講一個報文發送進 UDP 套接字時,UDP 協議並不保證該報文將到達接收進程。也正是由於 UDP 不修復錯誤,因此到達接收進程的報文也可能是亂序到達的。UDP 是面向報文的,這是因為 UDP 並不會對應用層傳遞下來的報文進行任何處理,對於報文的邊界信息都會保存,向下交付時交付的是完整報文。
UDP VS TCP
相比於 TCP 協議,UDP 協議什么都不提供,那么為什么還需要 UDP 協議呢?UDP 在以下 4 個方面具有一定的優勢,對於某些應用來說更為合適。
- 應用層發送什么數據以及何時發送的問題,使用 UDP 協議更為精細。TCP 的傳輸有擁塞控制機制,會限制發送方的發送思路,同時還需要 ACK 確認。而 UDP 沒有包括擁塞控制機制,只需要把數據封裝好放進 UDP 報文就能進行發送,所以 UDP 的發送端可以用它選定的任何速率向其下層(網絡層)注入數據。值得注意的是實際端到端吞吐量可能小於該速率,這可能是因為中間鏈路的帶寬受限或因為擁塞而造成的。
- 無需建立連接。UDP 不需要像 TCP 那樣進行 3 次握手,因此 UDP 並不會產生連接建立帶來的時延。例如 DNS 運行在 TCP 上的話,就會使得效率受到影響,因此使用 UDP 協議更合適。
- 無連接狀態。UDP 不需要建立連接,也就不需要為了維持連接產生其他的開銷。而 TCP 由於需要維護連接的發送緩存、擁塞控制參數、序號和確認號參數等信息,需要對這些信息進行跟蹤和審計,就需要更多的開銷。
- 分組首部開銷小,UDP 的首部開銷僅有 8 字節,TCP 則需要 20 字節。
對於有些應用而言,是可以容忍丟失且對速率是很敏感的,例如視頻會議等實時性的引用,TCP 協議會造成較大的時延而影響性能。不過 UDP 協議的使用還是存在爭議的,如果沒有擁塞控制機制來防范網絡擁塞,在大量端系統都采用流式高比特視頻等應用,會使得路由器出現大量分組溢出,同樣會影響性能,而且會干擾 TCP 協議的運行。不過這個問題已經有研究人員進行探討,並提出了相關機制。
最后一個問題是,UDP 能否實現可靠數據傳輸?雖然 UDP 本身不提供這樣的服務,但是 UDP 應用可以在應用層添加可靠傳輸機制,例如實現錯誤恢復等。
UDP 報文結構
UDP 首部只有 4 個字段:源端口號、目的端口號、長度、校驗和,其中每個字段由 2 個字節組成。
接下來我們着重討論一下校驗和,校驗和進行差錯檢驗的一個例子如下:
我們想要探討的問題是,鏈路層已經有一定的差錯檢測機制了,為什么在傳輸層也要?這是因為我們不能保證源主機和目的主機之間的所有鏈路使用的鏈路層協議,都具備差錯檢驗的機制,有可能中間的某一跳的鏈路不支持。而且當報文段存儲在某一台路由器的內存時,也有可能發生比特差錯。當端到端的數據傳輸需要差錯檢測時,那么 UDP 也要在運輸層提供這個功能,也就是端到端原則。不過雖然 UDP 可以進行差錯檢驗,但是它對錯誤的恢復無能為力。
Wireshark實驗
實驗操作
- 在 Wireshark 中捕獲數據包,然后執行一些會導致主機發送和接收多個 UDP 數據包的操作。也可以什么也不做,僅執行 wireshark 捕獲以便獲取其他程序發給您的 UDP 數據包。有一種特殊情況:簡單網絡管理協議(SNMP)在 UDP 內部發送 SNMP 消息,因此您可能會在跟蹤中找到一些 SNMP 消息(以及 UDP 數據包)。
- 停止數據包捕獲后,設置數據包篩選器,以便 Wireshark 僅顯示在主機上發送和接收的 UDP 數據包。 選擇其中一個 UDP 數據包並在詳細信息窗口中展開 UDP 字段。
問題解答
1.從跟蹤中選擇一個 UDP 數據包。從此數據包中,確定 UDP 標頭中有多少字段,並為這些字段命名。
UDP 的標頭有 4 個字段,一共 8 byte,各字段分別為:
Source Port:源端口號
Destination Port:目的端口號
Length:長度
Checksum:校驗和
2. 通過查詢 Wireshark 的數據包內容字段中顯示的信息,確定每個 UDP 報頭字段的長度。
每個部分都是 2 byte,因此 UDP 報頭為 8 byte = 64 bit。
3. 長度字段中的值是指的是什么?使用捕獲的 UDP 數據包驗證您的聲明。
長度字段指示了在 UDP 報文段中的字節數(首部 + 數據),這是因為數據字段的長度在一個 UDP 段中不同於在另一個段中,因此需要一個明確的長度。
如圖所示,報文的長度是 778 byte,加上首部的 8 byte 為 786 byte 剛好是 Length 字段的長度。
4. UDP 有效負載中可包含的最大字節數是多少?
首先先認識下有效負載:
有效負載是被傳輸數據中的一部分,而這部分才是數據傳輸的最基本的目的,和有效負載一同被傳送的數據還有:數據頭或稱作元數據,有時候也被稱為開銷數據,這些數據用來輔助數據傳輸。——百度百科
簡單地說,有效負載就是可變長度的數據部分。由於 Length 字段占 2byte = 65536 bit,並且其中 8 byte 是 UDP 首部信息。因此有效載荷 = 65536 - 8 = 65528 bit。
5. 最大可能的源端口號是多少?
兩個 Port 字段占 2 byte = 65536 bit,同時端口號從 0 開始算,因此最大端口號 = 216 - 1 = 65535。
6. UDP 的協議號是什么? 以十六進制和十進制表示法給出答案。
UDP 的協議號為 17,十六進制為 0x11。
7. 觀察發送 UDP 數據包后接收響應的 UDP 數據包,這是對發送的 UDP 數據包的回復,請描述兩個數據包中端口號之間的關系。(提示:對於響應 UDP 目的地應該為發送 UDP 包的地址。)
發送 UDP 數據包:
接收 UDP 數據包:
參考資料
《計算機網絡 自頂向下方法》 [美] James F.Kurose,Keith W.Ross 著,陳鳴 譯,機械工業出版社
UDP
有效載荷
TCP/IP協議號大全