今天要講上次講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

接著開第一個終端機,我們要先開一個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的實作