Ограничение размера посылки
Данные по сети идут пакетами, и у каждого канала есть предельный размер пакета, который он способен передать без разбиения. Он называется MTU, Maximum Transmission Unit. Для Ethernet стандартное значение 1500 байт, и именно оно чаще всего стоит по умолчанию на роутерах и компьютерах.
Величина включает заголовки, поэтому полезных данных в пакете меньше. Если на пути окажется участок с меньшим MTU, пакет придётся либо разбить на части, либо отправить отправителю сообщение о потребности уменьшить размер.
Значение 1500 закрепилось исторически, ещё со времён ранних версий Ethernet, и осталось стандартом по инерции. Каждое устройство на пути может иметь своё ограничение, а действует наименьшее из них на всём маршруте.
Фрагментация и её проблемы
Разбиение большого пакета на меньшие называется фрагментацией. Она работает, но неэффективна: увеличивает число пакетов, нагружает оборудование, а потеря одного фрагмента означает потерю всего исходного пакета. Поэтому современные системы часто ставят в пакете флаг «не фрагментировать» и подбирают допустимый размер механизмом обнаружения MTU пути (PMTUD).
Механизм полагается на служебные сообщения, которые отправляет узел с меньшим MTU. Если какой-то фаервол их отбрасывает, отправитель не узнаёт о проблеме, и большие пакеты просто исчезают. Возникает классический симптом «чёрной дыры».
На практике фрагментация чаще проявляется в туннелях и на нестандартных каналах, а не в обычном домашнем интернете, где 1500 работает без проблем. Именно поэтому для типичного пользователя тема оказывается «невидимой» до тех пор, пока не встретится необычная сеть.
Симптомы неправильного MTU
Характерная картина: соединение устанавливается, маленькие запросы проходят, а всё, что требует больших пакетов, зависает. Сайт начинает загружаться и останавливается на середине, почта принимается, но не отправляется с вложениями, страница входа открывается, а после ввода данных пропадает, SSH подключается, а на выводе больших данных замирает.
Обычно такая проблема возникает при использовании туннелей: любое инкапсулирование добавляет служебные заголовки, и внутренний пакет перестаёт помещаться в прежние 1500 байт. Поэтому для туннелей MTU чаще выбирают меньше, например около 1400–1420 байт. Точное значение зависит от протокола.
Ещё один признак: приложение работает по Wi-Fi одного провайдера и не работает у другого. Поскольку разные сети добавляют разные заголовки, значение, идеальное в одной, может оказаться слишком большим в другой. При подозрении подключитесь через другой канал, например через мобильную сеть, и сравните поведение.
Как проверить и подобрать значение
Проверка делается пингом с запретом фрагментации. В Windows это ping с ключами -f и -l, где задаётся размер данных, в Linux используется ключ -M do и -s. Пакеты увеличивают до тех пор, пока не появится ответ о потребности фрагментации. Найденный максимальный размер данных плюс 28 байт заголовков IP и ICMP и есть MTU пути.
Затем это значение (или чуть ниже) настраивается на интерфейсе или в роутере. Меняйте параметр по шагам и проверяйте после каждого изменения: слишком маленький MTU снижает эффективность, но обычно безопасен.
Пример расчёта: если пинг с размером данных 1372 байта проходит без фрагментации, а с 1373 нет, то максимальный размер данных равен 1372, и MTU пути составляет 1372 плюс 28, то есть 1400. Для надёжности обычно берут значение на несколько байт ниже найденного.
Что нужно помнить
В большинстве домашних сетей менять MTU не нужно, и значения по умолчанию подходят. Разбираться стоит только тогда, когда есть описанные симптомы, особенно после настройки туннеля, подключения к сети через PPPoE (там обычно 1492) или использования мобильной сети.
Не путайте MTU с MSS: MSS это максимальный размер сегмента данных TCP, он вычисляется из MTU. Многие роутеры умеют «подрезать» MSS автоматически, что решает проблему без ручных настроек.