為什麼網頁打不開,但在這卻 Ping 得到?

深入理解封包破碎 (Fragmentation)、Jumbo Frame 與傳輸效能

1

核心概念 (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)。

2

運作原理與計算 (Mechanism)

傳輸層/網路層負載計算機 (TCP / UDP / ICMP)

標準乙太網預設為 1500

總 Header 開銷 = 40 Bytes
1460

關鍵技術細節

  • 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)。
3

架構視覺化 (Visuals)

乙太網封包結構

graph LR %% Nodes representing fields horizontally EthH["Ethernet Header
(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 協商過程

sequenceDiagram participant PC as 使用者電腦
(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)
4

封包分析實戰:Wireshark 裡的 MSS

要驗證 MSS 是否正確,最直接的方式就是抓封包 (Packet Capture)。MSS 數值位於 TCP HeaderOptions 欄位中。

🔍 觀察重點
  • 封包類型:只出現在 SYNSYN, ACK 封包中。
  • 協商原則:雙方會比較彼此的 MSS,並使用「較小」的值作為最終傳輸上限。
  • 位置:TCP 層 > Options > Maximum segment size。

如果中間經過 VPN 設備進行了 MSS Clamping,你會發現雖然來源端送出 1460,但接收端收到的 SYN 封包中,MSS 已經被修改(例如變成 1360)。

Wireshark - Packet 1 [SYN]
Frame 1: 66 bytes on wire (528 bits), 66 bytes captured
Ethernet II, Src: Intel_a1:b2:c3, Dst: Extreme_d4:e5:f6
Internet Protocol Version 4, Src: 192.168.1.10, Dst: 8.8.8.8
Transmission Control Protocol, Src Port: 54321, Dst Port: 443, Seq: 0
Source Port: 54321
Destination Port: 443
.... 0000 0000 0010 = Flags: 0x002 (SYN)
Options: (12 bytes), Maximum segment size, No-Operation...
TCP Option - Maximum segment size: 1460 bytes
Kind: Maximum Segment Size (2)
Length: 4
MSS Value: 1460
5

實務應用:VPN 與 MSS Clamping

問題:VPN 連線後部分網頁打不開

當企業使用 GRE Tunnel 或 IPsec VPN 時,額外的 Header 會佔用空間。如果不調整 MSS,Server 送來的大封包會被中間的 VPN Gateway 丟棄,造成連線不穩。

解決方案:TCP MSS Clamping (Adjust)

在路由器介面上強制修改通過的 TCP SYN 封包中的 MSS 值。

Cisco IOS
interface Tunnel0
 ip tcp adjust-mss 1360
! 通常建議值為 MTU - 40
                        
ExtremeXOS / VOSS
# ExtremeXOS 通常在 VLAN 層級設定
configure vlan "VPN-Vlan" ip-mtu 1400

# 針對 TCP MSS Adjustment (部分型號/版本)
configure ip tcp-mss 1360 vlan "VPN-Vlan"
                        
6

效能怪獸: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 儲存網路至關重要。

傳輸效率對比圖 (封包流比較)

graph LR %% Visualizing Overhead comparison subgraph STD ["標準傳輸 (6 x 1500 Bytes)"] direction LR S1["Head|Data"] --- S2["Head|Data"] --- S3["Head|Data"] --- S4["Head|Data"] --- S5["Head|Data"] --- S6["Head|Data"] end subgraph JUMBO ["Jumbo Frame (1 x 9000 Bytes)"] direction LR J1["Header | --------------------------------------------- Huge Data Payload ---------------------------------------------"] end %% Styling classDef stdPacket fill:#e2e8f0,stroke:#64748b,stroke-width:1px; classDef jumboPacket fill:#dcfce7,stroke:#16a34a,stroke-width:2px; class S1,S2,S3,S4,S5,S6 stdPacket; class J1 jumboPacket;

上方需要 6 個 Header 開銷,下方僅需 1 個。Jumbo Frame 大幅減少了「過路費」(Overhead)。

極度重要:端對端一致性 (End-to-End)

Jumbo Frame 就像一輛超寬卡車,路徑上所有的橋樑與隧道 (Switch, Router, Server, Storage) 都必須拓寬 (支援 MTU 9000)。只要中間有一個設備只支援 1500,封包就會被丟棄 (Drop),導致連線中斷。

graph LR A[Server A
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
7

大師隨堂測驗 (Quiz)

Q1. 標準乙太網 (Ethernet) 的預設 MTU 是多少 Bytes?

解析: 答案是 B。1500 是 Payload (IP Packet) 的上限。1518 包含了 Ethernet Header (14) + FCS (4)。

Q2. 關於 Jumbo Frame 的部署,下列何者正確?

解析: 答案是 B。Jumbo Frame 必須 End-to-End 一致。中間只要有一台設備 MTU 較小 (1500),就會導致封包遺失 (Drop),因為 Layer 2 通常不進行分片。

Q3. 在 ExtremeXOS 中,開啟 Jumbo Frame 的指令為何?

解析: 答案是 A。`enable jumbo-frame ports` 用於 Layer 2 實體層級。`configure ip-mtu` 是用於 Layer 3 VLAN 介面。