mtuops.ru

PMTUD и чёрные дыры

Отправитель не знает заранее, какой размер пакета пролезет через весь путь. Он выясняет это по ходу дела, и обычно всё держится на ICMP.

Как задумано

Пакет уходит с флагом DF. Если на каком-то участке он больше допустимого, маршрутизатор отбрасывает его и отвечает «ICMP fragmentation needed» с указанием нового размера. Отправитель уменьшает пакет и запоминает значение для этого маршрута.

Как ломается

Достаточно, чтобы ICMP зарезали на одном участке. Тогда отправитель ничего не узнаёт, продолжает слать пакеты по 1500, а они тихо исчезают. Соединение устанавливается, мелкие данные проходят, крупные зависают. Со стороны это выглядит как «сайт открылся, картинка не грузится» или «сессия в ssh встаёт на выводе большого файла».

Проверить свою сторону просто: ping -M do -s 1472 до нужного адреса. Если этот пинг не проходит, а с меньшим размером проходит, вопрос уже не в приложении.

Что с этим делают

Вариантов три: разрешить ICMP на всём пути, править MSS на маршрутизаторе, либо уменьшить MTU на интерфейсе. Первый вариант правильный, второй быстрый, третий грубый: он режет скорость всем соединениям сразу.

Отдельно стоит помнить про IPv4 против IPv6: в шестой версии маршрутизатор фрагментировать не должен, там PMTUD не роскошь, а обязательная часть работы стека.