Почему MTU нельзя угадать и как его измерить
MTU показывает наибольший пакет, который канал передаёт целиком. У Ethernet он равен 1500 байт, но на реальном маршруте бывают участки с меньшим значением: соединение по PPPoE снижает его до 1492, а некоторые мобильные каналы дают ещё меньше. Если пакет больше допустимого и фрагментация запрещена, устройство отбрасывает его. Небольшие пакеты при этом проходят, отсюда странные симптомы: страницы частично открываются, картинки не грузятся, а маленькие запросы работают.
Измерить MTU можно обычным ping. Мы отправляем запросы с флагом «не фрагментировать» и подбираем размер данных, пока они не начнут проходить. Метод простой и не требует сторонних программ.
Формула запоминается легко: MTU равен размеру данных плюс 28 байт, из которых 20 занимает заголовок IP и 8 заголовок ICMP. Значит, данные 1472 байта дают пакет 1500 байт.
Отдельно отметим, что проблема размера часто проявляется только на конкретных узлах. Сайты, расположенные за участком с уменьшенным MTU, работают нестабильно, а остальные открываются нормально, и причину быстро не найти без измерения. Поэтому ping с запретом фрагментации входит в базовый набор диагностики наряду с проверкой DNS и шлюза.
Команды для Windows, Linux и macOS
Синтаксис отличается в каждой системе, ключи запрета фрагментации разные.
| Система | Команда | Комментарий |
|---|---|---|
| Windows | ping -f -l 1472 example.com | -f запрещает фрагментацию, -l задаёт размер данных |
| Linux | ping -M do -s 1472 example.com | -M do включает запрет фрагментации, -s размер данных |
| macOS | ping -D -s 1472 example.com | -D устанавливает бит запрета фрагментации |
В Windows добавьте -n 2, чтобы не ждать четырёх ответов. В Linux и macOS полезен ключ -c 2 с тем же смыслом. Выбирайте для проверки устойчиво отвечающий узел с известным адресом, например адрес шлюза вашего провайдера или собственный сервер. Узел, который сам не отвечает на ping, для теста не подходит.
Признак успеха в Windows: обычные строки «Ответ от…» с указанным числом байт. Признак неудачи: сообщение «Требуется фрагментация пакета, но установлен флаг DF» или тайм-аут, если промежуточное устройство молча отбрасывает пакет без ICMP-уведомления. Второй случай встречается чаще, чем хотелось бы, и его тоже считайте неудачей.
Пошаговый подбор размера
Идея та же, что при поиске числа в игре «больше-меньше». Начинаем с размера, соответствующего Ethernet, и сдвигаем границу.
- Запустите ping -f -l 1472 -n 2 example.com. Если ответы пришли, MTU пути не меньше 1500, дальше искать нечего.
- При неудаче уменьшите размер: 1464, 1400, 1300. Найдите первый размер, который проходит.
- Уточняйте границу шагами в 10, затем в 1 байт между последним неудачным и первым удачным значением.
- Прибавьте 28 к наибольшему прошедшему размеру: это и есть MTU на пути.
- Повторите проверку с двумя-тремя разными узлами, чтобы исключить особенности одного маршрута.
Пример результата (пример): с размером 1464 ответы приходят, с 1465 сообщение о необходимости фрагментации. Тогда MTU равен 1464 плюс 28, то есть 1492. Это типичный признак PPPoE.
Если подбор вручную кажется долгим, можно записать простой цикл в PowerShell, который перебирает размеры и останавливается на первом удачном. Но при первой диагностике полезно сделать несколько шагов руками: вы видите, как именно меняется сообщение при переходе через границу, и лучше понимаете, что происходит на маршруте.
Что делать с найденным значением
Если измеренный MTU меньше 1500, а на компьютере или роутере выставлено больше, пакеты будут теряться. Корректировать значение нужно там, где вы управляете настройками: в интерфейсе роутера для соединения с провайдером или на сетевом адаптере компьютера.
В Windows посмотреть текущее значение адаптера можно командой netsh interface ipv4 show subinterfaces, а задать значение командой netsh interface ipv4 set subinterface с указанием интерфейса и параметра mtu. Точные названия интерфейсов зависят от системы, поэтому сверяйтесь с выводом первой команды. В Linux значение меняют командой ip link set dev имя mtu число, а изменение сохраняется только до перезагрузки, если не прописано в настройках сетевой службы.
Учитывайте, что в роутерах величина MTU часто указывается вместе с типом подключения. Для PPPoE провайдеры называют 1492 или меньше, для IPoE обычно оставляют 1500. При сомнениях сверьтесь с инструкцией провайдера. Подробнее о понятии читайте на странице словаря про MTU, а о настройке на домашнем роутере на странице про MTU и MSS.
После изменения MTU повторите измерение и сравните результат с прежним. Если после правки страницы стали открываться полностью, значит, причина была именно в размере пакета. Если ничего не изменилось, верните прежнее значение и ищите проблему в другом месте: слишком низкий MTU снижает эффективность канала без пользы.
Когда результат ping обманывает
Метод удобен, но не универсален. Есть несколько ситуаций, в которых он даёт ложную картину.
- Узел не отвечает на ICMP или ограничивает его. Тогда неудача не связана с размером.
- Фильтры на пути отбрасывают ICMP-сообщения о необходимости фрагментации, и вы видите только тайм-ауты. Значение MTU тогда определяется по границе, а не по тексту сообщения.
- Маршрут может меняться. Два запроса подряд иногда идут разными путями с разным MTU.
- Обратный путь ответа тоже ограничен. Ping проверяет запрос и ответ вместе, поэтому проблема может быть в обратном направлении.
Для проверки маршрута с определением MTU на каждом участке удобнее tracepath в Linux, если он установлен. Он показывает значение pmtu по мере прохождения узлов. Проверяйте только свои сети и узлы, для которых у вас есть разрешение.