MTU, фрагментация и PMTUD: почему пакеты теряются

Как размер пакета ломает сетевое взаимодействие и как это лечить

18 марта 2026 2 мин чтения TooTimes Team

MTU (Maximum Transmission Unit) — максимальный размер IP-пакета, который умеет передать канал. Для классического Ethernet это 1500 байт. Если приложение отправит пакет большего размера — либо произойдёт фрагментация, либо ошибка «Fragmentation Needed». Разбираем, как сценарий бьёт пользователя.

Типичные значения MTU

  • Ethernet — 1500.
  • PPPoE (ADSL, часть ШПД) — 1492.
  • IPsec-туннели — 1400–1440.
  • GRE — 1476.
  • 4G/5G APN — 1400–1500 (варьируется).
  • WireGuard — 1420 (по умолчанию).

Если путь состоит из нескольких участков, Path MTU = минимум из всех MTU на маршруте.

Фрагментация

Если у IP-пакета флаг DF (Don't Fragment) не установлен, маршрутизатор может разделить пакет на части. Каждая часть едет отдельно, собираются они на получателе. Проблема: фрагментация увеличивает вероятность потерь и усложняет работу межсетевых экранов.

Path MTU Discovery

Современные стеки (TCP, QUIC) ставят DF=1 и полагаются на PMTUD (RFC 1191). Алгоритм:

  1. Клиент отправляет пакет максимального размера.
  2. Узел на пути возвращает ICMP «Fragmentation Needed» с подсказкой нового MTU.
  3. Клиент уменьшает размер и продолжает передачу.

«Чёрные дыры ICMP»

Проблема PMTUD в том, что ICMP часто фильтруется (из соображений безопасности). Если ICMP не доходит, клиент не узнаёт о реальном Path MTU и просто теряет крупные пакеты. Классический симптом — «маленькие страницы открываются, большие виснут».

MSS clamping

Практический приём: на граничном роутере пересчитывать поле MSS (Maximum Segment Size) в TCP-handshake, приводя его к актуальному Path MTU. Линуксовый фрагмент:

iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
  -j TCPMSS --clamp-mss-to-pmtu

QUIC и MTU

QUIC использует собственный DPLPMTUD (Datagram Packetization Layer PMTUD) поверх UDP: пакеты-пробники отправляются с растущим размером, пока не произойдёт потеря. Это более робастный механизм, чем ICMP-based PMTUD.

Диагностика

Минимальный набор инструментов:

  • ping -s <size> -M do <host> на Linux — ищем максимум без фрагментации.
  • tracepath <host> — показывает Path MTU по шагам.
  • Wireshark-фильтр icmp.type == 3 && icmp.code == 4 — «Fragmentation Needed».

Итого

MTU — не эзотерика, а базовый параметр, от которого зависят тысячи реальных сбоев. Если TCP-соединение «зависает после первого пакета», почти всегда виноват он. Включите PMTUD, не режьте ICMP, а лучше — настройте MSS clamping на граничных узлах.

Нужен стабильный защищённый доступ к интернету?

TooTimes — зашифрованный туннель до серверов в 9 странах, без логов.

Посмотреть тарифы
✎ Панель блога