本日主題:兩種傳輸協定的差別與應用 預計時間:1.5 小時 對應主教材:第 2.4 節


一、今日學習目標

  • [ ] 清楚說出 TCP 與 UDP 的差異
  • [ ] 知道各自的典型應用
  • [ ] 理解 TCP 三向交握的完整流程
  • [ ] 理解 TCP 的流量控制與重傳機制

二、教材內容

2.1 核心差異

TCP UDP
全名 Transmission Control Protocol User Datagram Protocol
連線 需先建立連線(三向交握) 不需連線(Connectionless)
可靠性 保證送達、會確認與重傳 不保證、不重傳
順序 保證順序(序號機制) 不保證順序
速度 較慢(有額外開銷) 較快(開銷小)
標頭大小 20~60 bytes 8 bytes
流量控制 有(滑動窗口)
適用 資料正確最重要 速度/即時最重要
┌──────────────────────────────────────────────┐
│         TCP vs UDP 一圖看懂                    │
├──────────────────────────────────────────────┤
│                                              │
│  TCP = 掛號信                                 │
│  ┌─────┐    ┌─────┐                          │
│  │ 寄方 │──→│ 收方 │                          │
│  └─────┘←──└─────┘                          │
│    「收到了嗎?」                               │
│    「收到了!」                                 │
│    → 確認送達、不見了會重寄                     │
│    → 慢但可靠                                  │
│                                              │
│  UDP = 傳單/廣播                               │
│  ┌─────┐    ┌─────┐                          │
│  │ 寄方 │──→│ 收方 │                          │
│  └─────┘    └─────┘                          │
│    「發出去就好,不管有沒有收到」                 │
│    → 快但不保證收到                             │
│                                              │
└──────────────────────────────────────────────┘

2.2 典型應用

TCP 的應用場景

  • 網頁(HTTP/HTTPS):少一個位元組網頁就可能顯示錯誤。
  • 檔案傳輸(FTP/SFTP):檔案掉一個 byte 就損壞了。
  • Email(SMTP/IMAP/POP3):郵件內容不能缺漏。
  • 遠端登入(SSH/RDP):指令和畫面必須完整。
  • 資料庫連線:資料查詢結果不能有遺漏。

UDP 的應用場景

  • 影音串流:偶爾掉一個畫面不影響觀看,但卡頓(TCP 重傳造成)很惱人。
  • 線上遊戲:即時性比完整性重要。
  • 語音/視訊通話(VoIP):延遲比偶爾雜音更嚴重。
  • DNS 查詢:一來一回、資料量小,失敗就再問一次。
  • DHCP:設備還沒有 IP,無法建立 TCP 連線。
  • NTP 時間同步:偶爾失敗不影響。
  • SNMP 網路監控:大量設備的監控資料,效率優先。

記憶法:TCP 像掛號信(要簽收、慢但可靠);UDP 像廣播(發出去就好、快但不保證收到)

┌──────────────────────────────────────────────┐
│        選擇 TCP 還是 UDP?                     │
├──────────────────────────────────────────────┤
│                                              │
│  資料正確性很重要?                             │
│    ├── 是 → 用 TCP(網頁、Email、檔案傳輸)     │
│    └── 否 → 資料即時性很重要?                  │
│               ├── 是 → 用 UDP(串流、遊戲)     │
│               └── 資料很小、一來一回?           │
│                      └── 是 → 用 UDP(DNS)    │
│                                              │
└──────────────────────────────────────────────┘

2.3 TCP 三向交握(Three-way Handshake)

建立 TCP 連線的三步驟(面試講出來加分):

┌─────────────────────────────────────────────────┐
│            TCP 三向交握                          │
├─────────────────────────────────────────────────┤
│                                                 │
│  用戶端                          伺服器          │
│    │                               │            │
│    │ ① SYN(seq=100)              │            │
│    │──────────────────────────────→│            │
│    │  「我想跟你建立連線」            │            │
│    │                               │            │
│    │ ② SYN-ACK(seq=300,ack=101)  │            │
│    │←──────────────────────────────│            │
│    │  「好,我也準備好了」            │            │
│    │                               │            │
│    │ ③ ACK(ack=301)              │            │
│    │──────────────────────────────→│            │
│    │  「收到,開始傳資料」            │            │
│    │                               │            │
│    │ ═══ 連線建立,開始傳輸 ═══      │            │
│    │                               │            │
└─────────────────────────────────────────────────┘

SYN = Synchronize(同步/發起)
ACK = Acknowledge(確認)

TCP 四次揮手(Four-way Teardown)

結束 TCP 連線需要四個步驟:

用戶端                          伺服器
  │                               │
  │ ① FIN                        │
  │──────────────────────────────→│
  │  「我要斷了」                   │
  │                               │
  │ ② ACK                        │
  │←──────────────────────────────│
  │  「好,知道了」                 │
  │                               │
  │ ③ FIN                        │
  │←──────────────────────────────│
  │  「我也要斷了」                 │
  │                               │
  │ ④ ACK                        │
  │──────────────────────────────→│
  │  「好,再見」                   │
  │                               │
  ═══ 連線關閉 ═══

為什麼是四次而不是三次?因為 TCP 是全雙工的(兩邊都能傳),所以兩邊各自關閉自己的傳輸方向。

2.4 TCP 的可靠性機制

┌──────────────────────────────────────────────┐
│         TCP 保證可靠的三個機制                  │
├──────────────────────────────────────────────┤
│                                              │
│  ① 序號 + 確認(Sequence + ACK)              │
│    每個封包都有序號,收到後回傳確認              │
│    發送:[1] [2] [3] [4]                      │
│    確認:    ACK2 ACK3 ACK4 ACK5              │
│                                              │
│  ② 重傳(Retransmission)                     │
│    如果沒收到 ACK,過了一段時間就重傳            │
│    發送:[1] [2] [3] [4]                      │
│    確認:    ACK2  ✗    ACK4                  │
│    重傳:          [3]  ← 沒收到 ACK3 就重傳   │
│                                              │
│  ③ 流量控制(Flow Control)                    │
│    用「滑動窗口」機制,讓發送速度配合接收能力     │
│    避免發太快導致接收方來不及處理               │
│                                              │
└──────────────────────────────────────────────┘

2.5 為什麼 DNS 用 UDP?

DNS 查詢通常一來一回、資料量小、要快,用 UDP 最划算;查詢失敗大不了再問一次。(資料量大時 DNS 也會改用 TCP,例如 DNS 區域轉送 Zone Transfer。)

💡 面試加分小知識

  • TCP 標頭有 20 bytes,UDP 標頭只有 8 bytes。每個封包都要帶標頭,所以大量小封包時 UDP 效率更高。
  • TCP 的 SYN Flood 攻擊:駭客大量發送 SYN 封包但不完成三向交握,讓伺服器維持大量「半開」連線,最終耗盡資源。這是常見的 DDoS 攻擊手法。
  • HTTP/3(QUIC)使用 UDP:最新的 HTTP/3 協定改用 UDP 作為傳輸層,在 UDP 上自己實作了可靠性機制,兼顧速度和可靠。

⚠️ 常見誤解

  • 誤解 1:「UDP 不可靠就是不好」→ 不對。UDP 的「不可靠」是設計選擇,在影音串流、遊戲等場景中,速度和即時性比完整性更重要。用 TCP 傳影片反而會因為重傳造成卡頓。
  • 誤解 2:「TCP 一定比 UDP 慢」→ 在資料量大、連續傳輸時,TCP 的「慢」並不明顯。慢主要體現在連線建立(三向交握的延遲)和每個封包的確認開銷上。
  • 誤解 3:「DNS 只用 UDP」→ DNS 在做區域轉送(Zone Transfer)時會用 TCP,因為資料量大(整個 DNS 記錄資料庫)。DNS 回應超過 512 bytes 時也會改用 TCP。

三、今日練習

Q1. 用一句話說 TCP 和 UDP 最大的差別。 Q2. 影音串流為什麼用 UDP 而不是 TCP? Q3. TCP 三向交握的三個步驟? Q4. 為什麼 TCP 斷線需要四次揮手而不是三次? Q5. 以下應用各使用 TCP 還是 UDP?為什麼? - (a) 網路電話(VoIP) - (b) 下載 Windows 更新 - (c) 線上遊戲角色移動 - (d) 查詢 DNS - (e) SSH 遠端登入

參考解答 **A1.** TCP 可靠但慢(要建立連線、會確認與重傳);UDP 快但不保證送達(不建立連線、發了就不管)。 **詳細說明**:TCP(Transmission Control Protocol)在傳輸前先用三向交握建立連線,傳輸過程中每個封包都有序號和確認機制,遺失的封包會重傳。UDP(User Datagram Protocol)不需要建立連線,直接把資料送出去,不確認對方有沒有收到。TCP 適合資料正確性重要的場景,UDP 適合即時性重要的場景。 **A2.** 串流重視即時與流暢,偶爾掉幾個封包影響不大,用 UDP 較快;若用 TCP 一直重傳反而會卡頓。 **詳細說明**:假設你在看直播,某一個畫面的封包遺失了。如果用 TCP,它會等到這個封包重傳成功才繼續,這段等待時間就是你感受到的「卡頓」。如果用 UDP,遺失的封包就跳過,直接播下一個畫面,你可能只會看到一瞬間的畫面模糊,但不會卡住。對觀看體驗來說,流暢比完美更重要。 **A3.** SYN → SYN-ACK → ACK。 **詳細說明**: 1. **SYN**:用戶端發送同步請求(「我想跟你建立連線」),包含一個初始序號 2. **SYN-ACK**:伺服器回應同步確認(「好,我也準備好了」),包含自己的序號和對用戶端序號的確認 3. **ACK**:用戶端發送確認(「收到,開始傳資料」),確認伺服器的序號 完成三向交握後,TCP 連線正式建立,雙方可以開始傳輸資料。 **A4.** 因為 TCP 是全雙工的——用戶端和伺服器都可以獨立地傳送和接收資料。所以關閉連線時,每一方都需要獨立關閉自己的傳送方向。用戶端發 FIN 只是說「我不再發資料了」,但伺服器可能還有資料要傳完。等伺服器傳完後,再發自己的 FIN 表示「我也不發了」。所以需要四次:用戶端 FIN → 伺服器 ACK → 伺服器 FIN → 用戶端 ACK。 **A5.** - (a) VoIP → **UDP**。語音通話重視即時性,延遲比偶爾失真更嚴重。TCP 的重傳機制會導致延遲和回音。 - (b) Windows 更新 → **TCP**。下載檔案需要完整性保證,少一個 byte 整個更新檔就損壞了。 - (c) 遊戲角色移動 → **UDP**。即時性最重要,角色位置的更新需要快速到達。遺失一個位置更新不要緊,下一個更新會覆蓋它。 - (d) DNS 查詢 → **UDP**。查詢封包很小(通常 <512 bytes),一來一回就結束。失敗就再問一次,比建立 TCP 連線再查詢更快。 - (e) SSH → **TCP**。遠端操作指令必須完整、有序地到達,少一個字元或順序錯誤都會造成問題。

四、今日檢核

  • [ ] 我能說清楚 TCP 與 UDP 差異與應用
  • [ ] 我能講出三向交握
  • [ ] 我知道 DNS 為何用 UDP
  • [ ] 我理解 TCP 的重傳和流量控制機制
  • [ ] 我能根據應用場景選擇 TCP 或 UDP

五、延伸閱讀建議

資源 說明
YouTube: NetworkChuck「TCP vs UDP」 用動畫對比兩者差異,非常清楚(英文有字幕)
YouTube: Sunny Classroom「TCP 三向交握」 中文講解,有圖示說明
YouTube: Ben Eater「TCP/IP」 從底層原理解說 TCP(英文,進階)
Cloudflare: TCP vs UDP 清楚的圖文說明(英文)
YouTube: Professor Messer「Transport Layer」 CompTIA Network+ 傳輸層教學

⬅️ 上一天:Day 1 | 🏠 本週總覽 | ➡️ 下一天:Day 3 — 網路設備