2026 年 05 月 06 日

CH9 — 傳輸層協定(TCP/UDP)

CH9 傳輸層 TCP UDP 埠編號 滑動訊窗 SACK

📋 大綱

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服務協定說明
20FTP-DataTCP檔案傳輸(資料埠)
21FTPTCP檔案傳輸(控制埠)
23TelnetTCP遠端登錄
25SMTPTCP簡易郵件傳輸
53DNSTCP/UDP網域名稱伺服器
69TFTPUDP簡單檔案傳輸
80HTTPTCP超文件傳送
110POP3TCP郵局協定
179BGPTCP邊界閘道協定
520RIPngUDP下一代尋徑資訊
1194OpenVPNUDP開放虛擬私有網路
2483Oracle DBTCP/UDP甲骨文資料庫
5004RTPUDP即時傳輸協定
5060SIPTCP/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
32 bits · 發送端 IP
目的端 IP
32 bits · 接收端 IP
00000000
8 bits · 固定值
Protocol = 17
8 bits · UDP 協定編號
UDP 訊息長度
16 bits · Length 欄位值
對網路層再次檢測,破壞了各層級各自負責的原則——好壞見仁見智。

📌 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 補齊。

KindLength名稱說明
01End of Option List宣告選擇項結束,僅 Kind 欄位
11No-operation(NOP)佔 1 Byte,用於對齊/填充,常放在選項之前
24MSS(Maximum Segment Size)告知對方允許的最大資料片段大小
42SACK Permitted宣告雙方支援 SACK 機制
5可變SACK選擇性回應,告知已收到的連續區塊

MSS — 最大資料片段大小

乙太網路 MSS = 1460 Bytes
由客戶端向伺服器提出,告知自己允許的最大片段值。1500 - 20(IP) - 20(TCP) = 1460

SACK — 選擇性回應

SACK 訊息格式
Kind=5 | Length | Left Edge 1 | Right Edge 1 | Left Edge n | Right Edge n
  • Left Edge:區塊第一個已收到的位元組序號
  • Right Edge:區塊最後一個已收到的位元組 + 1

接收端告知傳送端「哪些區塊已收到」,傳送端只需重傳確實遺失的區塊,大幅提升傳輸效率。