Networking

MTU и MSS

MTU — максимальный размер кадра, который проходит через интерфейс, MSS — максимальный размер полезных данных в TCP-сегменте.

Что такое MTU и MSS

MTU (Maximum Transmission Unit) — наибольший размер пакета, который интерфейс может передать одним куском. Для обычного Ethernet это 1500 байт. Всё, что больше, приходится либо фрагментировать, либо отбрасывать.

MSS (Maximum Segment Size) — наибольший объём полезных данных внутри одного TCP-сегмента, без заголовков. Стороны сообщают его друг другу в SYN-пакете при установке соединения.

Связь между ними прямая — MSS равен MTU минус заголовки:

MTU 1500
 ├─ заголовок IPv4   20 байт
 ├─ заголовок TCP    20 байт
 └─ данные (MSS)   1460 байт   ← это и передаёт приложение

Для IPv6 заголовок 40 байт → MSS = 1500 − 40 − 20 = 1440

Типовые значения

Среда MTU MSS (IPv4)
Ethernet 1500 1460
PPPoE (часть домашних провайдеров) 1492 1452
WireGuard (типично) 1420 1380
VXLAN поверх Ethernet 1450 1410
Jumbo frames 9000 8960
Минимум для IPv6 1280 1220

Каждый уровень туннелирования отъедает свои байты: VPN, VXLAN в оверлейной сети, GRE. Поэтому внутри туннеля MTU всегда меньше, чем снаружи.

Jumbo frames

Jumbo frame — кадр Ethernet больше стандартных 1500 байт, обычно 9000. Смысл в накладных расходах: при MTU 1500 на каждые 1460 байт данных приходится 40 байт заголовков и одно прерывание, при MTU 9000 — те же 40 байт на 8960 данных. Меньше пакетов, меньше работы процессору, выше throughput.

Где это оправдано: сети хранения (iSCSI, NFS), бэкапы, репликация БД, межузловой трафик GPU-кластера — то есть там, где гоняют большие объёмы внутри одного сегмента.

Главное условие: jumbo frames должны быть включены на всех устройствах сегмента — на обоих хостах и на коммутаторе между ними. Если хоть один узел остался на 1500, пакеты будут молча пропадать. В интернет jumbo не выпускают: за пределами вашей сети MTU 1500 и меньше.

Как проявляется неверный MTU

Симптом характерный и обманчивый: пинг идёт, SSH-сессия открывается, но большие страницы, загрузка файлов или git clone зависают намертво. Причина — маленькие пакеты проходят, а полноразмерные отбрасываются, и виноватым обычно считают приложение.

Классика жанра — Path MTU Discovery, сломанный вырезанным ICMP. Роутер на пути должен ответить «пакет слишком велик» сообщением ICMP fragmentation needed; если администратор зарезал ICMP целиком, отправитель не узнает о проблеме и будет вечно переотправлять один и тот же сегмент. Отсюда правило: не блокируйте ICMP полностью на файрволе.

Как найти реальный MTU

Отправляем пакет с запретом фрагментации и уменьшаем размер, пока не пройдёт:

$ ping -M do -s 1472 -c1 example.com
PING example.com (93.184.216.34) 1472(1500) bytes of data.
ping: local error: message too long, mtu=1420

$ ping -M do -s 1392 -c1 example.com
1400 bytes from 93.184.216.34: icmp_seq=1 ttl=56 time=41.2 ms

К размеру из -s прибавьте 28 байт (20 IP + 8 ICMP) — получится MTU. Здесь прошло 1392 → MTU 1420, типичный признак туннеля.

$ ip link show eth0 | head -1
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP

$ sudo ip link set dev eth0 mtu 9000     # до перезагрузки

Когда исправить MTU по всему пути нельзя, применяют MSS clamping: шлюз сам переписывает MSS в проходящих SYN-пакетах, и стороны сразу договариваются о безопасном размере.

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

Этот приём — стандартное лекарство для VPN и PPPoE, где иначе часть сайтов открывается, а часть нет.

Связанные термины

Готовы запустить GPU-задачу?

Запустить GPU-сервер