為什麼網頁打不開,但在這卻 Ping 得到?
深入理解封包破碎 (Fragmentation)、Jumbo Frame 與傳輸效能
核心概念 (Concept)
MTU (Maximum Transmission Unit)
定義:最大傳輸單元。指的是第二層(Data Link Layer)網路介面所能通過的最大封包大小(不含 Ethernet Header)。
生活化比喻:隧道的限高
想像網路線是一條隧道。MTU 就是這個隧道的「限高/限寬」(標準乙太網為 1500 bytes)。
如果不遵守這個限制,車子(封包)就必須被拆解(分片)才能通過,或者直接撞牆(Drop)。
MSS (Maximum Segment Size)
定義:最大區段大小。指的是 TCP 封包中,「實際能裝載資料(Payload)」的最大量。
生活化比喻:卡車的貨櫃容量
如果整個 IP 封包是一輛卡車,扣除車頭(IP Header)和駕駛座(TCP Header),剩下的「貨櫃空間」就是 MSS。
如果貨物太多,我們必須協商好每次只載多少貨(MSS),才不會讓整台卡車超過隧道的限高(MTU)。
運作原理與計算 (Mechanism)
傳輸層/網路層負載計算機 (TCP / UDP / ICMP)
標準乙太網預設為 1500
關鍵技術細節
- TCP MSS 計算: MTU - IP Header (20) - TCP Header (20) = 預設 1460。這是 TCP 三向交握時協商的內容。
- UDP Payload 計算: UDP Header 佔 8 Bytes。最大 Payload = MTU - 28。若超過此值且 DF=1,會被丟棄。
- ICMP Data 計算: ICMP Header 佔 8 Bytes。若要進行 Ping 測試且不分片 (Do not Fragment),資料長度 (Data Size) 不能超過 MTU - 28。
- DF Bit (Don't Fragment): 現代作業系統通常將 IP 封包的 DF 位元設為 1。如果封包大於路徑上某設備的 MTU 且 DF=1,路由器會丟棄封包並回傳 ICMP Type 3 Code 4 (Fragmentation Needed)。
架構視覺化 (Visuals)
乙太網封包結構
(14 Bytes)"] subgraph MTU_Zone ["MTU (1500 Bytes)"] direction LR IPH["IP Header
(20 Bytes)"] L4H["TCP/UDP Header
(20/8 Bytes)"] Data["Data Payload
(MSS)"] end FCS["FCS
(4 Bytes)"] %% Connections EthH --- IPH --- L4H --- Data --- FCS %% Styling classDef eth fill:#e2e8f0,stroke:#64748b; classDef ip fill:#dbeafe,stroke:#3b82f6; classDef l4 fill:#dcfce7,stroke:#22c55e; classDef data fill:#fef9c3,stroke:#eab308; classDef fcs fill:#f1f5f9,stroke:#94a3b8; classDef mtuZone fill:#f8fafc,stroke:#334155,stroke-dasharray: 5 5; class EthH eth; class IPH ip; class L4H l4; class Data data; class FCS fcs; class MTU_Zone mtuZone;
傳統線性封包結構:左至右依序排列,虛線框內為 MTU 範圍
TCP MSS 協商過程
(MTU 1500) participant Router as VPN 路由器
(MTU 1400) participant Server as 網站伺服器
(MTU 1500) Note over PC, Server: 三向交握階段 (SYN) PC->>Server: SYN (MSS=1460) Note right of PC: 本地 1500 - 40 = 1460 Server->>PC: SYN, ACK (MSS=1460) Note left of Server: 伺服器也認為它是 1460 Note over PC, Server: 資料傳輸階段 (問題發生) PC->>Router: 發送 1500 bytes 封包 (DF=1) Router--xRouter: 封包太大 (1500 > 1400) 且 DF=1 Router-->>PC: ICMP Type 3 Code 4 (需分片但 DF 設為 1) Note over PC, Server: 解決方案:MSS Clamping Note right of Router: 路由器修改 SYN 封包中的 MSS PC->>Router: SYN (MSS=1460) Router->>Server: SYN (MSS=1360)
(強制修改為 1400-40)
封包分析實戰:Wireshark 裡的 MSS
要驗證 MSS 是否正確,最直接的方式就是抓封包 (Packet Capture)。MSS 數值位於 TCP Header 的 Options 欄位中。
🔍 觀察重點
- 封包類型:只出現在 SYN 或 SYN, ACK 封包中。
- 協商原則:雙方會比較彼此的 MSS,並使用「較小」的值作為最終傳輸上限。
- 位置:TCP 層 > Options > Maximum segment size。
如果中間經過 VPN 設備進行了 MSS Clamping,你會發現雖然來源端送出 1460,但接收端收到的 SYN 封包中,MSS 已經被修改(例如變成 1360)。
實務應用:VPN 與 MSS Clamping
問題:VPN 連線後部分網頁打不開
當企業使用 GRE Tunnel 或 IPsec VPN 時,額外的 Header 會佔用空間。如果不調整 MSS,Server 送來的大封包會被中間的 VPN Gateway 丟棄,造成連線不穩。
解決方案:TCP MSS Clamping (Adjust)
在路由器介面上強制修改通過的 TCP SYN 封包中的 MSS 值。
interface Tunnel0
ip tcp adjust-mss 1360
! 通常建議值為 MTU - 40
# ExtremeXOS 通常在 VLAN 層級設定
configure vlan "VPN-Vlan" ip-mtu 1400
# 針對 TCP MSS Adjustment (部分型號/版本)
configure ip tcp-mss 1360 vlan "VPN-Vlan"
效能怪獸:Jumbo Frame (巨型封包)
什麼是 Jumbo Frame?
標準乙太網的 MTU 是 1500 Bytes。而 Jumbo Frame 允許將 MTU 提高到 9000 Bytes 甚至更高(ExtremeXOS 支援到 9216)。
比喻:搬家工程
- 標準封包 (1500): 像用小貨車搬家。搬完一個家需要跑 6 趟,每趟都要重新發動引擎、過收費站 (Header Overhead)。
- Jumbo Frame (9000): 像用大型貨櫃車搬家。跑 1 趟就搬完了。節省了 5 次的發動與過站時間。
優點 (Benefits)
- 提升傳輸效率: 減少了 Header 佔用的比例 (Payload Ratio 上升)。
- 降低 CPU 負載: 相同資料量下,封包數量減少,網卡的 CPU 中斷 (Interrupts) 次數大幅下降。這對 iSCSI 儲存網路至關重要。
傳輸效率對比圖 (封包流比較)
上方需要 6 個 Header 開銷,下方僅需 1 個。Jumbo Frame 大幅減少了「過路費」(Overhead)。
極度重要:端對端一致性 (End-to-End)
Jumbo Frame 就像一輛超寬卡車,路徑上所有的橋樑與隧道 (Switch, Router, Server, Storage) 都必須拓寬 (支援 MTU 9000)。只要中間有一個設備只支援 1500,封包就會被丟棄 (Drop),導致連線中斷。
MTU 9000] --OK--> B[Extreme Switch
MTU 9000] B --OK--> C[Storage Array
MTU 9000] B -- "DROP!" --> D[Legacy Switch
MTU 1500] D -.- E[Server B
MTU 9000] style A fill:#dcfce7,stroke:#16a34a style B fill:#dcfce7,stroke:#16a34a style C fill:#dcfce7,stroke:#16a34a style D fill:#fee2e2,stroke:#ef4444,stroke-width:2px style E fill:#f3f4f6,stroke:#9ca3af,stroke-dasharray: 5 5 linkStyle 2 stroke:#ef4444,stroke-width:3px,color:red
ExtremeXOS 實戰指令
EXOS 30.x+1. 全域啟用 Jumbo Frame (Layer 2 介面層級)
enable jumbo-frame ports all # 或者指定特定 Port enable jumbo-frame ports 1:1,1:2,2:1-10
2. 設定 VLAN 的 IP MTU (Layer 3 路由層級)
*僅當 Switch 需要對 Jumbo 封包進行 Routing 時才需要設定
configure vlan "iSCSI_VLAN" ip-mtu 9000
3. 驗證設定 (Verification)
show port 1:1 info detail # 尋找輸出中的 "Max Frame Size" # 預設 Jumbo 上限通常為 9216 Bytes
大師隨堂測驗 (Quiz)
Q1. 標準乙太網 (Ethernet) 的預設 MTU 是多少 Bytes?
Q2. 關於 Jumbo Frame 的部署,下列何者正確?
Q3. 在 ExtremeXOS 中,開啟 Jumbo Frame 的指令為何?