更好閱讀體驗:《理解 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 個字節。
UDP 數據報結構.png
首部各字段意義:
- 源端口:源端口號,在需要對方回信時選用,不需要時可全 0.
- 目的端口:目的端口號,在終點交付報文時必須要使用到。
- 長度:UDP 用戶數據報的長度,在只有首部的情況,其最小值是 8 。
- 檢驗和:檢測 UDP 用戶數據報在傳輸中是否有錯,有錯就丟棄。
UDP 如何進行校驗和
偽首部
UDP 數據報首部中檢驗和的計算方法比較特殊。
在計算檢驗和時,要在數據報之前增加 12 個字節的偽首部,用來計算校驗和。
偽首部并不是數據報真正的首部,是為了計算校驗和而臨時添加在數據報前面的,在真正傳輸的時候并不會把偽首部一并發送。
UDP 數據報結構-偽首部.png
偽首部個字段意義:
- 第一字段,源 IP 地址
- 第二字段,目的 IP 地址
- 第三字段,字段全 0
- 第四字段,IP 首部中的協議字段的值,對于 UDP,此字段值為 17
- 第五字段,UDP 用戶數據報的長度
校驗和計算方法
校驗和的計算中,頻繁用到了二進制的反碼求和運算,運算規則見下:
二進制反碼求和運算