本日主題:兩種傳輸協定的差別與應用 預計時間: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 — 網路設備