更好閱讀體驗:《理解 TCP 和 UDP》— By Gitbook
UDP 和 TCP 的不同
TCP 在傳送資料之前必須先建立連線,資料傳送結束後要釋放連線。
TCP 不提供廣播或多播服務,由於 TCP 要提供可靠的、面向連線的運輸服務,因此不可避免地增加了許多的開銷,如確認、流量控制、計時器以及連線管理等。
而 UDP 在傳送資料之前不需要先建立連線。接收方收到 UDP 報文之後,不需要給出任何確認。
雖然 UDP 不提供可靠交付,但在某些情況下 UDP 卻是一種最有效的工作方式。
簡單來說就是:
UDP:單個資料包,不用建立連線,簡單,不可靠,會丟包,會亂序;
TCP:流式,需要建立連線,複雜,可靠 ,有序。
UDP 概述
UDP 全稱 User Datagram Protocol, 與 TCP 同是在網路模型中的傳輸層的協議。
UDP 的主要特點是:
- 無連線的,即傳送資料之前不需要建立連線,因此減少了開銷和傳送資料之前的時延。
- 不保證可靠交付,因此主機不需要為此複雜的連線狀態表
- 面向報文的,意思是 UDP 對應用層交下來的報文,既不合並,也不拆分,而是保留這些報文的邊界,在新增首部後向下交給 IP 層。
- 沒有阻塞控制,因此網路出現的擁塞不會使傳送方的傳送速率降低。
- 支援一對一、一對多、多對一和多對多的互動通訊,也即是提供廣播和多播的功能。
- 首部開銷小,首部只有 8 個位元組,分為四部分。
UDP 的常用場景:
- 名字轉換(DNS)
- 檔案傳送(TFTP)
- 路由選擇協議(RIP)
- IP 地址配置(BOOTP,DHTP)
- 網路管理(SNMP)
- 遠端檔案服務(NFS)
- IP 電話
- 流式多媒體通訊
UDP 報文結構
UDP 資料包分為資料欄位和首部欄位。
首部欄位只有 8 個位元組,由四個欄位組成,每個欄位的長度是 2 個位元組。
首部各欄位意義:
- 源埠:源埠號,在需要對方回信時選用,不需要時可全 0.
- 目的埠:目的埠號,在終點交付報文時必須要使用到。
- 長度:UDP 使用者資料包的長度,在只有首部的情況,其最小值是 8 。
- 檢驗和:檢測 UDP 使用者資料包在傳輸中是否有錯,有錯就丟棄。
UDP 如何進行校驗和
偽首部
UDP 資料包首部中檢驗和的計算方法比較特殊。
在計算檢驗和時,要在資料包之前增加 12 個位元組的偽首部,用來計算校驗和。
偽首部並不是資料包真正的首部,是為了計算校驗和而臨時新增在資料包前面的,在真正傳輸的時候並不會把偽首部一併傳送。
偽首部個欄位意義:
- 第一欄位,源 IP 地址
- 第二欄位,目的 IP 地址
- 第三欄位,欄位全 0
- 第四欄位,IP 首部中的協議欄位的值,對於 UDP,此欄位值為 17
- 第五欄位,UDP 使用者資料包的長度
校驗和計算方法
校驗和的計算中,頻繁用到了二進位制的反碼求和運算,運算規則見下:
二進位制反碼求和運算
0 + 0 = 0
1 + 0 = 0 + 1 = 1
1 + 1 = 10複製程式碼
其中 10 中的 1 加到了下一列去,如果是最高列的 1 + 1 ,那麼得到的 10 留下 0 , 1 移到最低列,與最低位再做一次二進位制加法即可。
檢驗和計算過程
- 把首部的檢驗和欄位設定為全 0
- 把偽首部以及資料段看成是許多 16 位的字串接起來。
- 若資料段不是偶數個位元組,則填充一個全 0 位元組,但是這個位元組不傳送。
- 通過二進位制反碼運算,計算出 16 位字的和。
- 讓第一行和第二行做二進位制反碼運算。
- 將第一行和第二行的結果與第三行做二進位制反碼計算,以此類推。
- 最後運算結果取反,得到校驗和。
- 把計算出來的校驗和值,填入首部校驗和欄位。
接收方收到資料包之後,按照同樣的方法計算校驗和,如果有差錯,則丟棄這個資料包。
可以看出校驗和,既檢查了 UDP 使用者資料包的源埠號和目的埠號以及資料包的資料部分,又檢查了 IP 資料包的源 IP 地址和目的地址。
一個校驗和例子
假設一個 UDP 資料包:
各欄位以二進位制表示:
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