2026 年 05 月 06 日
CH9 — 傳輸層協定(TCP/UDP)
📋 大綱
1傳輸層角色 — TCP vs UDP 定位
2埠編號 — Well-known / 註冊 / 動態 Port
3UDP 協定 — 標頭 4 欄位、虛擬標頭 Checksum
4TCP 序列與回應號碼 — 雙向傳輸範例
5滑動訊窗 — 緩衝區、Window 欄位
6TCP 標頭欄位 — 20 Bytes + 6 個控制旗標
7TCP 連線管理 — 三向交握、四向終止
8TCP 選擇項 — MSS、SACK
📌 1|傳輸層簡介
傳輸層位置
位於網路層與會議層之間。TCP/IP 架構下有兩大協定:TCP(傳輸控制協定)與 UDP(使用者資料報協定)。
TCP vs UDP 比較
TCP — 傳輸控制協定
特性高可靠度、連接導向
標頭20~60 Bytes(豐富控制功能)
傳輸位元組為單位、序列與回應機制
流量滑動訊窗、擁塞控制
常見應用:FTP、Telnet、SMTP、POP3、HTTP
UDP — 使用者資料報協定
特性非可靠性、無連接導向
標頭8 Bytes(簡單輕量)
傳輸不檢測是否成功送達
流量無流量/擁塞控制機制
常見應用:DNS、TFTP、SNMP、NFS、BOOTP
TCP 可靠性示意
發送端:「Are you ready?」→ 接收端:「Yes, I am ready.」→ 發送端:收到回覆,確認連線建立,開始傳送。
📌 2|埠編號(Port Number)
在網路層定址(IP)之外,定義額外參數,用以識別同一節點上不同通訊服務。IANA 將 Port 分為三類:
公認知埠
0 ~ 1023
公共、授權單位使用,常用服務應用程式
註冊埠
1024 ~ 49151
一般應用程式向 IANA 註冊後使用
動態埠
49152 ~ 65535
不被註冊,自由運用(客戶端隨機產生)
常用服務埠號
| Port | 服務 | 協定 | 說明 |
|---|---|---|---|
| 20 | FTP-Data | TCP | 檔案傳輸(資料埠) |
| 21 | FTP | TCP | 檔案傳輸(控制埠) |
| 23 | Telnet | TCP | 遠端登錄 |
| 25 | SMTP | TCP | 簡易郵件傳輸 |
| 53 | DNS | TCP/UDP | 網域名稱伺服器 |
| 69 | TFTP | UDP | 簡單檔案傳輸 |
| 80 | HTTP | TCP | 超文件傳送 |
| 110 | POP3 | TCP | 郵局協定 |
| 179 | BGP | TCP | 邊界閘道協定 |
| 520 | RIPng | UDP | 下一代尋徑資訊 |
| 1194 | OpenVPN | UDP | 開放虛擬私有網路 |
| 2483 | Oracle DB | TCP/UDP | 甲骨文資料庫 |
| 5004 | RTP | UDP | 即時傳輸協定 |
| 5060 | SIP | TCP/UDP | 會議啟動協定 |
客戶端 vs 伺服端埠號:IANA 規範的埠號是針對伺服端。客戶端埠號隨機產生,常設在 1024 ~ 4096 範圍內。
📌 3|UDP 協定
一種非可靠性的傳輸模式,不會檢測是否已成功將資料傳送給對方。適用於即時性要求高、少量傳輸的場景。
UDP 標頭格式(8 Bytes)
來源埠(16 bits)
Src Port
目的埠(16 bits)
Dst Port
訊息長度(16 bits)
Length
檢驗和(16 bits)
Checksum
- Length:以位元組為單位,記錄 UDP 標頭及其所屬資料的總合長度
- Checksum:以 16 位元為單位,運用 1 補數演算法執行加總後,再求 1 的補數
虛擬標頭(pseudo-header)
Checksum 運算時,會加入虛擬標頭一起計算,目的是對網路層再次檢測:
來源端 IP
目的端 IP
00000000
Protocol = 17
UDP 訊息長度
對網路層再次檢測,破壞了各層級各自負責的原則——好壞見仁見智。
📌 4|TCP 序列號碼與回應號碼
序列號碼(Sequence Number)
記錄傳送資料過程的累積序號,以位元組數為單位(早期以封包數為單位)。對 100 Mbps 系統,序號循環約 328 秒一次(比 IP TTL 的 255 秒長)。
回應號碼(Acknowledge Number)
告知對方資料已順利收到,象徵期望下次收到對方的下一個序列號碼。
單向資料傳送範例
甲(發送端) 乙(接收端)
Seq: X, Data: a Bytes ──────▶
Seq: Y, Ack: X+a
◀──────────────────────
Seq: X+a, Data: b Bytes ──────▶
Seq: Y, Ack: X+a+b
緩衝區(Buffer):接收端使用緩衝區暫存資料。Window 欄位記錄「剩餘可用緩衝區空間」。若 Window = 0,表示緩衝區已滿,發送端須停止傳送,等待更新。
📌 5|滑動訊窗(Sliding Window)
訊窗概念:緩衝區也稱為「訊窗」(Windows)。訊窗大小由各項參數調整:HDLC、X.25 以封包數量為單位;TCP 以位元組數為單位。整體可用訊窗大小固定,剩餘容量記錄在 TCP 標頭的
Window 欄位。
滑動訊窗運作:發送端一次可發送多個封包(不需等待每個 ACK),但不能超過接收端公告的 Window 大小。隨著 ACK 到來,訊窗「向前滑動」,允許發送新的資料。
合併回應(Piggybacking)
當接收端要回傳資料給發送端時,可以把 ACK 合併在攜帶資料的封包中一起傳送,不必另外發送一個純 ACK 封包,節省網路資源。
📌 6|TCP 標頭欄位
TCP 標頭格式(標準 20 Bytes)
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port (16) | Destination Port (16) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number (32) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgement Number (32) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| HLEN | Reserved | Code Bits | Window (16) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum (16) | Urgent Pointer (16) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options (if HLEN > 5) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
各欄位說明
Src Port
來源埠編號(16 bits)
Dst Port
目的埠編號(16 bits)
Seq Num
序列號碼(32 bits)— 以位元組為單位累加
Ack Num
回應號碼(32 bits)— 期待對方下一個封包的 Seq
HLEN
Header Length(4 bits)— 標頭長度,單位 4 bytes。無選項時 = 5 → 20 Bytes
Reserved
保留位元(4 bits),設為 0
Window
緩衝區剩餘空間(16 bits)
Checksum
檢驗和(16 bits)— 包含標頭、資料、虛擬標頭,1 補數運算法
Urgent Ptr
緊急指標(16 bits)— URG=1 時才生效,指向緊急資料位置
Options
可變長度,32 位元整數倍,不足時以 Padding 補齊
控制旗標(Code Bits / Control Flags)— 6 個
ACK
Acknowledgement — 回應確認
SYN
Synchronize — 同步連線
FIN
Final — 結束連線
RST
Reset — 重新設定連線
PSH
Push — 不經緩衝直接送達
URG
Urgent — 緊急資料標記
CWR
Congestion Window Reduced
ECE
ECN Echo — 明確擁塞通知
常見組合:SYN(連線建立)、ACK+SYN(回應並同步)、FIN(結束連線)
📌 7|TCP 連線啟動與結束
三向交握(Three-way Handshake)— 建立連線
發送端(Client) 接收端(Server)
│ │
│ ──── ① SYN, Seq=X ──────────▶ │ 請求同步
│ │
│ ◀─── ② SYN+ACK, Seq=Y, Ack=X+1 ── │ 同步 + 確認
│ │
│ ──── ③ ACK, Seq=X+1, Ack=Y+1 ──▶ │ 確認完成
│ │
│ 連線建立完成 │
- ① SYN 封包:攜帶初始序列號碼
Seq=X - ② SYN+ACK:伺服端回傳
Seq=Y,並Ack=X+1表示期待下一個封包 - ③ ACK:客戶端確認收到,完成連線建立
四向終止(Four-way Termination)— 結束連線
發送端(Client) 接收端(Server)
│ │
│ ──── ① FIN ──────────────────▶ │ 請求結束
│ │
│ ◀─── ② ACK ──────────────────── │ 確認收到
│ │
│ ◀─── ③ FIN ──────────────────── │ 伺服端也準備結束
│ │
│ ──── ④ ACK ──────────────────▶ │ 最後確認
│ │
│ 連線關閉 │
注意:連線終止需要四個封包(雙方各提出一次 FIN,並各自回覆一個 ACK),而非四次來回。雙方都可主動發出 FIN。
📌 8|TCP 選擇項
選擇項基本格式
Kind (1 Byte) | Length (1 Byte) | Data (可變)
各選擇項長度不固定,但整體長度必須是 32 位元整數倍,不足以 Padding 補齊。
| Kind | Length | 名稱 | 說明 |
|---|---|---|---|
| 0 | 1 | End of Option List | 宣告選擇項結束,僅 Kind 欄位 |
| 1 | 1 | No-operation(NOP) | 佔 1 Byte,用於對齊/填充,常放在選項之前 |
| 2 | 4 | MSS(Maximum Segment Size) | 告知對方允許的最大資料片段大小 |
| 4 | 2 | SACK Permitted | 宣告雙方支援 SACK 機制 |
| 5 | 可變 | SACK | 選擇性回應,告知已收到的連續區塊 |
MSS — 最大資料片段大小
乙太網路 MSS = 1460 Bytes
由客戶端向伺服器提出,告知自己允許的最大片段值。
1500 - 20(IP) - 20(TCP) = 1460SACK — 選擇性回應
SACK 訊息格式
Kind=5 | Length | Left Edge 1 | Right Edge 1 | Left Edge n | Right Edge n
- Left Edge:區塊第一個已收到的位元組序號
- Right Edge:區塊最後一個已收到的位元組 + 1
接收端告知傳送端「哪些區塊已收到」,傳送端只需重傳確實遺失的區塊,大幅提升傳輸效率。