搜尋文件

輸入關鍵字,搜尋標題與正文。

    電腦網路文件 05/16

    UDP 與無連線傳輸

    本文提要

    UDP 是一種極簡的無連線傳輸層協定,僅在 IP 之上提供連接埠多工與可選的資料同位檢查,不保證送達、不保證順序且無連線狀態開銷。 相較於 TCP 複雜的連線握手、重傳與流量控制,UDP 追求的是極致的低延遲、精簡的通訊標頭與對底層封包傳送節奏的直接控制力。

    18px · 寬鬆行距

    閱讀設定

    排版預覽 · 示範文字(可捲動)

    檔案與目錄

    Linux 以一棵從根目錄 / 開始的樹狀結構組織檔案。目錄用來整理檔案,也可以包含其他目錄。

    pwd
    ls -la /home
    18px

    16、18、20、22px;隨瀏覽器文字大小縮放。

    欄寬套用於背景文章;此處預覽字級與行距。手機正文自動配合螢幕。

    文件與本文目錄
    本主題文件

    UDP 是一種極簡的無連線傳輸層協定,僅在 IP 之上提供連接埠多工與可選的資料同位檢查,不保證送達、不保證順序且無連線狀態開銷。 相較於 TCP 複雜的連線握手、重傳與流量控制,UDP 追求的是極致的低延遲、精簡的通訊標頭與對底層封包傳送節奏的直接控制力。

    本文接續TCP 基礎:連線生命週期與流量控制並與封包交換與網路分層模型對照;同時為後續依賴 UDP 的應用如DNS 網域名稱解析系統提供底層通訊原理。

    UDP 的設計哲學與標頭結構

    UDP(User Datagram Protocol,定義於 RFC 768)的本質是對 IP 層能力的最輕量封裝。 IP 層僅負責將封包從「主機 A」送達「主機 B」;而 UDP 僅額外增加了一項核心能力:連接埠多工(Port Multiplexing),將資料精確遞交給主機上的「特定行程(Process)」。

    UDP 的標頭僅有極其精簡的 8 個位元組(Bytes):

    TEXT
     0                   1                   2                   3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |          來源連接埠 (16 bits)   |          目的連接埠 (16 bits)   |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |          長度 (Length, 16 bits)|          校驗和 (Checksum, 16) |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                                                               |
    |                        資料有效負載 (Payload)                   |
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    
    1. 來源連接埠(Source Port):發送行程的連接埠(可選,若不需要接收回覆可設為 0)。
    2. 目的連接埠(Destination Port):接收行程監聽的連接埠。
    3. 長度(Length):UDP 標頭加上資料負載的總長度(最小為 8 位元組)。
    4. 校驗和(Checksum):涵蓋虛擬 IP 標頭、UDP 標頭與資料內容的校驗值。在 IPv4 中可選,但在 IPv6 中強制要求,用於偵測資料在傳輸過程中是否受損;若校驗失敗,接收端核心將默默丟棄該資料包。

    UDP 與 TCP 的根本特徵對比

    表格・3 欄 8 列
    比較特性TCP(傳輸控制協定)UDP(使用者資料包協定)
    連線狀態連線導向(需三次交握建立狀態)無連線(Connectionless,隨發隨走)
    標頭大小至少 20 位元組(可達 60 位元組)固定 8 位元組
    可靠性保證送達、逾時重傳、校驗盡力而為(可能丟包、不重傳)
    資料順序嚴格循序重組不保證順序(可能後發先至)
    資料抽象位元組串流(Byte Stream,無邊界)資料包(Datagram,保留明確訊息邊界)
    速率調節具備流量控制與壅塞控制(主動降速)無速率限制(應用程式想發多快就發多快)
    廣播與多播僅支援單播(Unicast,點對點)支援單播、廣播(Broadcast)與多播(Multicast)
    延遲特性較高(交握延遲 + 隊頭阻塞隊列)極低(零交握延遲、即發即收)

    資料包邊界(Datagram Boundaries)的關鍵差異

    在 TCP 中,應用程式兩次發送 100 位元組,接收端可能一次收到 200 位元組,或四次收到 50 位元組,應用層必須自行設計封包長度標頭或分隔符號來切分訊息。 而在 UDP 中,發送端每次透過系統呼叫 sendto() 發出一個資料包,接收端呼叫 recvfrom() 就必定精準接收這一個完整的獨立資料包(除非被截斷);UDP 原生保留了應用程式的訊息邊界。

    典型應用場景與權衡考量

    UDP 並非「次等協定」,而是面對特定工程需求時的精確技術取捨:

    1. 即時多媒體與通訊(VoIP、視訊會議、WebRTC)

    在即時語音通話或 Zoom/Google Meet 視訊會議中,即時性(Real-Time)遠比絕對完整性更重要。 若網路發生短暫掉包,TCP 會暫停後續所有音訊播放、等待重傳(隊頭阻塞,Head-of-Line Blocking),使用者會聽到嚴重的卡頓與延遲;而使用 UDP 時,掉失的幾毫秒音訊直接跳過,人耳往往難以察覺,通話得以保持極佳的流暢度與即時性。

    2. 即時多人線上遊戲

    在第一人稱射擊(FPS)或競速遊戲中,伺服器每秒向玩家推播 60 次當前座標。 如果第 10 幀的座標封包遺失了,客戶端完全不需要等待重傳,因為第 11 幀更新的最新座標已經抵達;等待過期舊座標的重傳只會浪費頻寬並增加輸入延遲。

    3. 極度簡單的單次請求/回應服務(DNS、DHCP、NTP、SNMP)

    以 DNS 查詢 為例,客戶端只想問一個網域名稱的 IP。 若走 TCP,客戶端需要先發送 SYN、等 SYN-ACK、發送 ACK(耗費整整 1 個 RTT 交握),然後才送出查詢,查完還要四次揮手關閉;而使用 UDP,客戶端只發出一個封包,伺服器回傳一個封包即可結束通訊,極大幅度降低了伺服器維護連線狀態的記憶體開銷與網路往返時間。

    現代協定演進:在 UDP 之上重構可靠傳輸(QUIC 與 HTTP/3)

    長期以來,網際網路協定面臨嚴重的「協定僵化(Ossification)」:中間的防火牆、路由器與 NAT 設備只認得 TCP 與 UDP,任何想發明新傳輸層協定(如 SCTP)的企圖都會被中間設備丟棄。 同時,TCP 核心邏輯刻在作業系統核心中,更新極為緩慢,且 TCP 的全域連線循序保證造成了難以消除的隊頭阻塞。

    為此,現代最頂尖的網路協定工程採取了全新路線——「以 UDP 為傳輸載體,在使用者空間(User Space)應用層實作精密控制」:

    • QUIC(RFC 9000) 選擇建立在標準 UDP 之上,從而保證封包能通行全球所有中間網路設備。
    • QUIC 在應用層實作了比 TCP 更優秀的特性:
      1. 零交握延遲(0-RTT 連線恢復):結合 TLS 1.3,將傳輸層交握與密鑰交換合併為單一步驟。
      2. 徹底消除隊頭阻塞:在同一條 UDP 通道內並行多個獨立串流,單一串流丟包只會阻斷該串流,其餘串流不受任何影響。
      3. 連線遷移(Connection Migration):以 Connection ID 取代傳統 IP:Port 四元組,使用者從 Wi-Fi 切換到 5G 行動網路時,連線不中斷無須重新交握。 這項架構已正式成為 HTTP/3 的基礎核心。

    常見誤解與限制

    1. UDP 不代表發送端不會出錯:若發送端應用程式傳送速度遠超本機網卡的實體發送速率,作業系統核心的發送緩衝區依然會滿載,導致 sendto() 拋出 ENOBUFS 錯誤。
    2. UDP 容易遭受反射放大與偽造攻擊:由於 UDP 無交握狀態,攻擊者極容易偽造封包的來源 IP。若伺服器(如開放的 DNS 或 NTP 伺服器)接收到小封包後回覆巨量資料,攻擊者便可將來源 IP 偽造為受害者 IP,發動嚴重的「分散式阻斷服務反射放大攻擊(DDoS Amplification)」。
    3. NAT 逾時更激進:因為 UDP 沒有連線建立與中斷標記,NAT 閘道只能依靠計時器(Timer)維持轉譯對應表;通常 UDP 的閒置逾時僅有 30 秒至 1 分鐘,長連線需要定時發送 Keep-Alive 心跳包以防止 NAT 映射被清除。

    相關主題與參考來源