iT邦幫忙

2025 iThome 鐵人賽

DAY 24
0

今天要講上次講TCP時沒講到的UDP以及在UDP上面跑的QUIC而我們今天也會將UDP與TCP進行比較,那就事不宜遲,開始今天的介紹吧。

什麼是UDP?

UDP的全名是User Datagram Protocol是一種無連線的傳輸層通訊協定。它在傳送資料前不需要建立連線,也不會確認資料是否正確送達,因此傳輸速度非常快,但可靠性較低。由於延遲低、效率高,UDP 常用於需要即時傳輸的應用,例如線上遊戲、影音串流、語音通話(VoIP)與 DNS 查詢等。

UDP的核心特性

  • 無連線(connectionless):沒有三次握手、沒有連線狀態(kernel只處理socket/五元組),所以沒有TCP的 SYN/ACK state
  • 不保證到達、不保序、不重傳(應用層負責或根本不負責)
  • 傳輸效率高、延遲低,很適合QUIC這種在應用層自己做可靠性/多路復用的設計
  • header小固定只有8bytes

UDP 的常見坑與攻防相關議題

  • IP Fragmentation:大封包可能被IP拆fragmentation,會影響IDS/IPS能否重組與檢查(注意MTU/DF bit)
  • No backpressure:攻擊者可短時間塞大量UDP包造成amplification或餘量耗盡(UDP amplification DDoS)
  • Spoofing:UDP的source IP易偽造(無三次握手驗證),導致放大攻擊或偽造回應,例如偽造DNS回應
  • NAT traversal:UDP hole punching會建立ephemeral mapping,可被利用或偵測到持久連線行為
  • Checksum:UDP有checksum,但可以在某些情況被關閉或無法檢測某種錯誤(視平台而定)

UDP超簡單實作

這是一個超簡單的UDP實作,可以證明UDP沒有握手仍然可以收到資料,我們先在WSL上安裝netcat-openbsd,指令如下:

sudo apt install -y netcat-openbsd

https://ithelp.ithome.com.tw/upload/images/20251004/2017800837sCRq6m5v.png
接著開第一個終端機,我們要先開一個UDP伺服器,指令:

nc -u -l 40000

接著開啟第二個終端機,並輸入指令:

echo "hello-udp" | nc -u 127.0.0.1 40000

這樣我們就能在伺服器端看到hello-udp,從這裡我們就可以看到UDP是「fire-and-forget」,沒有握手,但 socket可以收到資料

接下來我們就可以介紹QUIC了

什麼是QUIC

QUIC(Quick UDP Internet Connections)是一種基於UDP的新型傳輸協定,它結合了TCP的可靠傳輸和TLS的加密安全,但比傳統TCP+TLS連線更快。QUIC支援多路復用,可以在同一條連線上同時傳送多個資料流,不會因單一封包遺失而阻塞其他資料流,並且能快速建立連線(0-RTT/1-RTT),非常適合用於網頁瀏覽、影音串流和低延遲即時應用。同時QUIC也是HTTP/3的傳輸基礎協定。

QUIC的核心構件

  • 基於UDP: QUIC把自己的封包放在UDP datagram內
  • Packet types(TLS-level dependent):
    • Initial:Client初始發起,載有TLS ClientHello(用來派生初始密鑰);必須使用長度與 token 要求來 防止 amplification
    • 0-RTT(Early data):Client可在恢復session時發送早期資料以減少延遲(有replay風險)
    • Handshake:交換TLS握手訊息(Encrypted)以建立終極加密keys
    • One-RTT/Short header:完成握手後的長期傳輸封包,payload全加密,header短
  • Connection ID(CID):獨立於IP/port的連線識別,用來使端點在遷移IP(例如手機切換網路)時仍能繼續同一個 QUIC connection
  • Streams:QUIC在連線內支持多個獨立stream(類似HTTP/2),但在UDP層面由QUIC負責可靠交付與flow control
  • Encryption levels:Initial、0-RTT、Handshake、Application(1-RTT)—不同階段用不同keys
  • Header protection:QUIC對header的一部分做遮罩(header protection),以防止資訊泄露與重放序列猜測
  • Congestion control:UIC在傳輸層執行擁塞控制(常可使用TCP-like算法或BBR)
  • TLS1.3:QUIC使用TLS1.3作為its crypto handshake( TLS record layer 的用法與TCP/TLS不一樣 — TLS handshake messages在QUIC packet payload中傳送)

QUIC的握手流程

1.Client發Initial packet(含ClientHello),這個封包使用初始keys(由destination connection id+salt 派生)進行加密保護的最小部份,server以Initial或Retry回應,然後雙方透過TLS1.3 key schedule產生Handshake keys,交換Handshake messages,完成後使用1-RTT keys加密應用資料
2.0-RTT:在 session resumption的情況下,Client可在第一個ClientHello同時發早期資料(application data),server需要做replay-check。

QUIC封包能看到什麼

通常看得到即使沒解密 payload):

  • UDP src/dst port
  • QUIC header(long header中可看到 packet type: Initial/Handshake/Retry/0-RTT,DCID/SCID 長度)
  • Connection ID(可觀測到不同CID的關聯)
  • Packet number(有一定的header protection,所以被遮罩但Wireshark可以解析有限部份)
  • TLS handshake messages in Initial/Handshake(如果Wireshark具有QUIC+TLS解碼並且在你擁有keylog的情況下能解密)

今日小結

今天我們一口氣學了UDP跟QUIC的基礎觀念,明天我們將會做QUIC的實作


上一篇
Day23-認識防火牆
系列文
Izumi從零開始的30日WEB馬拉松24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言