MTU, фрагментация и PMTUD: почему пакеты теряются
Как размер пакета ломает сетевое взаимодействие и как это лечить
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). Алгоритм:
- Клиент отправляет пакет максимального размера.
- Узел на пути возвращает ICMP «Fragmentation Needed» с подсказкой нового MTU.
- Клиент уменьшает размер и продолжает передачу.
«Чёрные дыры 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 странах, без логов.
Посмотреть тарифы