理解 UDP

JerryC發表於2017-03-02

更好閱讀體驗:《理解 TCP 和 UDP》— By Gitbook

UDP 和 TCP 的不同

TCP 在傳送資料之前必須先建立連線,資料傳送結束後要釋放連線。
TCP 不提供廣播或多播服務,由於 TCP 要提供可靠的、面向連線的運輸服務,因此不可避免地增加了許多的開銷,如確認、流量控制、計時器以及連線管理等。

而 UDP 在傳送資料之前不需要先建立連線。接收方收到 UDP 報文之後,不需要給出任何確認。
雖然 UDP 不提供可靠交付,但在某些情況下 UDP 卻是一種最有效的工作方式。

簡單來說就是:

UDP:單個資料包,不用建立連線,簡單,不可靠,會丟包,會亂序;

TCP:流式,需要建立連線,複雜,可靠 ,有序。

UDP 概述

UDP 全稱 User Datagram Protocol, 與 TCP 同是在網路模型中的傳輸層的協議。

UDP 的主要特點是:

  1. 無連線的,即傳送資料之前不需要建立連線,因此減少了開銷和傳送資料之前的時延。
  2. 不保證可靠交付,因此主機不需要為此複雜的連線狀態表
  3. 面向報文的,意思是 UDP 對應用層交下來的報文,既不合並,也不拆分,而是保留這些報文的邊界,在新增首部後向下交給 IP 層。
  4. 沒有阻塞控制,因此網路出現的擁塞不會使傳送方的傳送速率降低。
  5. 支援一對一、一對多、多對一和多對多的互動通訊,也即是提供廣播和多播的功能。
  6. 首部開銷小,首部只有 8 個位元組,分為四部分。

UDP 的常用場景:

  1. 名字轉換(DNS)
  2. 檔案傳送(TFTP)
  3. 路由選擇協議(RIP)
  4. IP 地址配置(BOOTP,DHTP)
  5. 網路管理(SNMP)
  6. 遠端檔案服務(NFS)
  7. IP 電話
  8. 流式多媒體通訊

UDP 報文結構

UDP 資料包分為資料欄位和首部欄位。
首部欄位只有 8 個位元組,由四個欄位組成,每個欄位的長度是 2 個位元組。

理解 UDP
UDP 資料包結構.png

首部各欄位意義

  1. 源埠:源埠號,在需要對方回信時選用,不需要時可全 0.
  2. 目的埠:目的埠號,在終點交付報文時必須要使用到。
  3. 長度:UDP 使用者資料包的長度,在只有首部的情況,其最小值是 8 。
  4. 檢驗和:檢測 UDP 使用者資料包在傳輸中是否有錯,有錯就丟棄。

UDP 如何進行校驗和

偽首部

UDP 資料包首部中檢驗和的計算方法比較特殊。
在計算檢驗和時,要在資料包之前增加 12 個位元組的偽首部,用來計算校驗和。
偽首部並不是資料包真正的首部,是為了計算校驗和而臨時新增在資料包前面的,在真正傳輸的時候並不會把偽首部一併傳送。

理解 UDP
UDP 資料包結構-偽首部.png

偽首部個欄位意義

  1. 第一欄位,源 IP 地址
  2. 第二欄位,目的 IP 地址
  3. 第三欄位,欄位全 0
  4. 第四欄位,IP 首部中的協議欄位的值,對於 UDP,此欄位值為 17
  5. 第五欄位,UDP 使用者資料包的長度

校驗和計算方法

校驗和的計算中,頻繁用到了二進位制的反碼求和運算,運算規則見下:

二進位制反碼求和運算

0 + 0 = 0
1 + 0 = 0 + 1 = 1
1 + 1 = 10複製程式碼

其中 10 中的 1 加到了下一列去,如果是最高列的 1 + 1 ,那麼得到的 10 留下 0 , 1 移到最低列,與最低位再做一次二進位制加法即可。

檢驗和計算過程

  1. 把首部的檢驗和欄位設定為全 0
  2. 把偽首部以及資料段看成是許多 16 位的字串接起來。
  3. 若資料段不是偶數個位元組,則填充一個全 0 位元組,但是這個位元組不傳送。
  4. 通過二進位制反碼運算,計算出 16 位字的和。
    1. 讓第一行和第二行做二進位制反碼運算。
    2. 將第一行和第二行的結果與第三行做二進位制反碼計算,以此類推。
  5. 最後運算結果取反,得到校驗和。
  6. 把計算出來的校驗和值,填入首部校驗和欄位。

接收方收到資料包之後,按照同樣的方法計算校驗和,如果有差錯,則丟棄這個資料包。

可以看出校驗和,既檢查了 UDP 使用者資料包的源埠號和目的埠號以及資料包的資料部分,又檢查了 IP 資料包的源 IP 地址和目的地址。

一個校驗和例子
假設一個 UDP 資料包:

理解 UDP
UDP 校驗和.png

各欄位以二進位制表示:

1001 1001 0001 0011 //偽首部源IP地址前16位,值:153.19
0000 1000 0110 1000 //偽首部源IP地址後16位,值:8.104
1010 1011 0000 0011 //偽首部目的IP地址前16位,值:171.3
0000 1110 0000 1011 //偽首部目的IP地址後16位,值:14.11
0000 0000 0001 0001 //偽首部UDP協議欄位代表號,值:17
0000 0000 0000 1111 //偽首部UDP長度欄位,值:15
0000 0100 0011 1111 //UDP頭部源IP地址對應的程式埠號,值:1087
0000 0000 0000 1101 //UDP頭部目的IP地址對應的程式埠號,值:13
0000 0000 0000 1111 //UDP頭部UDP長度欄位,值:15
0000 0000 0000 0000 //UDP頭部UDP檢驗和,值:0
0101 0100 0100 0101 //資料欄位
0101 0011 0101 0100 //資料欄位
0100 1001 0100 1110 //資料欄位
0100 0111 0000 0000 //資料欄位+填充0欄位複製程式碼

按照二進位制反碼運算求和,結果:10010110 11101101
結果求反碼得出校驗和:01101001 00010010

參考

二進位制反碼求和運算
《後臺開發 核心技術與應用實踐》
《計算機網路》

相關文章