Frontend Labs
⋯

8. MTU, fragmentation triggers, and jumbo frames

8.1 The MTU chain

MTU is the largest Layer-3 payload a link will carry. The effective end-to-end MTU is the minimum of every link on the path — the Path MTU (PMTU).

Link Typical MTU
Standard Ethernet 1500
Ethernet + 1 VLAN tag on a strict device effectively 1496
PPPoE (DSL) 1492
IPsec tunnel (varies by mode/cipher) ~1400–1438
WireGuard 1420
GRE 1476
VXLAN over 1500 underlay 1450
Jumbo frames (data-center Ethernet) 9000
IPv6 minimum any link must support 1280
IPv4 minimum every host must reassemble 576

8.2 What happens when a packet is too big

  • IPv4, DF (Don't Fragment) bit = 0: the router fragments the packet (Ch. 15). Slow, fragile, disables some hardware offloads.
  • IPv4, DF = 1: router drops it and sends back ICMP type 3 code 4 "Fragmentation needed" including the next-hop MTU.
  • IPv6: routers never fragment. The source must; an oversize packet gets ICMPv6 type 2 "Packet Too Big".

TCP always sets DF and relies on PMTUD (Path MTU Discovery): start at the local MTU, shrink when a "too big" ICMP arrives, cache per-destination.

8.3 The PMTUD black hole

If a firewall blocks all ICMP (a depressingly common "hardening" mistake), the "fragmentation needed" messages never arrive. Symptom: the TCP handshake succeeds (small packets), then the connection hangs the instant a full-size data packet is sent — it's silently dropped forever. Classic signature: curl connects, sends the request, and stalls; small pages work, big ones don't; ping works but ping -s 1472 -M do fails.

Fixes:

  • Allow ICMP type 3 (and ICMPv6 type 2) through firewalls. Always.
  • MSS clamping on the tunnel/router: iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu. This rewrites the MSS option in SYN packets so endpoints never send oversize segments in the first place.
  • Linux ip route ... mtu lock 1400 for a known-bad path.
  • PLPMTUD (RFC 4821 / RFC 8899) — probe for MTU using the transport itself, no ICMP needed. QUIC uses this.

8.4 Jumbo frames

Setting MTU 9000 on every device in a data-center segment means ~6× fewer packets per MB → less CPU, higher throughput, especially for storage (iSCSI, NFS) and backups. Rules:

  • Every device on the L2 segment must agree, including the switches. One device at 1500 that receives a 9000 frame just drops it.
  • Doesn't help across the internet (path will have a 1500 link).
  • Test: ping -M do -s 8972 <peer> (8972 + 8 ICMP + 20 IP = 9000).

8.5 War story

A new site-to-site VPN worked for SSH and ping but every git clone and file copy froze at a few KB. tcpdump showed a 1500-byte packet leaving repeatedly with no ACK. The firewall vendor's "recommended" ruleset dropped all ICMP. Adding an allow rule for ICMP type 3, plus MSS clamping to 1400 on the tunnel interface, fixed every stuck transfer. Lesson: "connects then hangs on big transfers" ≈ MTU/PMTUD black hole, 95% of the time.

Try it yourself

# Find the path MTU to a host (largest non-fragmented ICMP payload)
ping -M do -s 1472 example.com          # 1472+8+20 = 1500; shrink until it passes
tracepath example.com                    # reports PMTU per hop, no root needed
ip route get 8.8.8.8                      # shows the MTU that will be used
ip route add 10.0.0.0/8 via 10.1.1.1 mtu 1400   # pin an MTU for a route

Generated from real-life-example.md · 8 Oct 2026 16:36