MTU

Определение MTU

Информация в локальной сети и интернете передаётся не сплошным потоком, а небольшими пакетами.

MTU (Maximum Transmission Unit) определяет максимальный размер пакета данных, который может быть передан через сеть без фрагментации (дробления).

MTU_1500

Если размер пакета будет превышать MTU интерфейса, то незамедлительно начнётся процесс дефрагментации. Пакет будет разбит на более мелкие части, помечен специальными метками чтобы на стороне приёма хост их мог правильно собрать воедино.

MTU_2000

В далёком 1980 году IT сообщество решило, что стандартный размер L3-интерфейса будет равен 1500 байт. То есть пакет размером в 1500 байт пройдёт через интерфейс, а пакет в 1501 байт будет фрагментирован либо отброшен. Также определились с тем, что самый маленький размер MTU – 68 байт. Записали эту умную мысль в документ RFC 1191

В самом начале хотелось бы отметить, что тема MTU довольна непростая, содержащая кучу нюансов, и мы не будем сильно углубляться. Но следует себе представлять, что MTU бывает для L2 (frame size) и L3 (packet size) и размеры будут отличаться. Сложней когда рассматриваем MTU при туннелирование трафика, при использовании VPN. Описанные сложности, в основном, связаны с наличием заголовков в пакетах, которые уменьшают размер полезных данных.

Способы добиться правильного MTU

Кадр с большим MTU может быть:

  1. Фрагментирован (разбит на кусочки)
  2. Автоматически выставлен в нужный размер (технология Patch MTU Discovery (PMTUD))
  3. Полностью отброшен (drop – “дропнуть”)
  4. Фиксировано настроен вручную

Фрагментация пакетов

При превышении размера MTU стандартом предусмотрен механизм разбивки большого пакета на маленькие кусочки. Далее следует сборка из кусочков первоначального пакета – дефрагментация.

Маршрутизаторы и коммутаторы не занимаются дефрагментацией пакетов, у них и так хлопот хватает, поэтому разбивкой и сборкой  пакетов занимается отправитель и тот, кому предназначается сообщение.

В современном Интернете дефрагментацию/фрагментацию пакетов никто не применяет. Механизм есть, но его игнорируют.

Patch MTU Discovery

Технология PMTU discovery призвана существенно снять нагрузку с маршрутизаторов за счёт отказа фрагментировать пакеты.

Когда по пути следования размер пакета в какой то момент превысит значение MTU маршрутизатора, последний отправит сообщение “ICMP error: packet too big “. К сообщению так же будет прикреплена рекомендация “Use MTU = 1300” – используй MTU 1300. Эта процедура может происходить от узла к узлу несколько раз пока пакет успешно не достигнет хоста получателя. Технология PMTUD срабатывает только в сторону уменьшения.

PMTUD

Patch MTU Blackhole Detection

Patch MTU Blackhole буквально можно перевести как “чёрная дыра”. Собственно это определение подходит как нельзя кстати, т.к. в этом случае передаваемые пакеты теряются в никуда. Пакеты “дропаются” – отсекаются, уничтожаются, выбрасываются.

Чаще всего это происходит по простой причине – блокировкой протокола ICMP на каком либо участке следования пакетов. Это может оказаться специально/неверно настроенный файрволл, политика какого либо из узлов маршрутизатора. Данный феномен считается недружелюбным и вредным. Блокировать ICMP – плохой тон в современном Интернете. Но тем не менее, блокировки встречаются, в большинстве случаев вы никак на это не сможете повлиять.

Patch MTU Blackhole Detection (PMTUBD) – это механизм, который детектирует описанное выше явление и выставляет MTU 576 байт. Это повышает вероятность, что такой маленький пакет “пролезет”, и да, в большинстве случаев так и происходит. Но вы и сами уже, наверное, уже догадались, что скорость передачи существенно упадёт. Поэтому рекомендация, если у вас это параметр включен – отключать. И остаётся только вариант – настраивать MTU ручками.

На уровне L2, например, коммутаторы доступа, нет способа сообщить, что пакет большой, поэтому все пакеты превышающие MTU будут отброшены. Потому что ICMP - протокол L3 уровня и ждать от него сообщений на уровне L2 нет смысла 🙂

Как определить оптимальное значение MTU

Для определения значения MTU мы воспользуемся свойством утилиты PING, а именно тем, что она умеет отправлять пакеты заданные вручную, а также выставлять в пакете флаг запрещающий фрагментацию – DF. Будем отправлять пакеты с высоким значением MTU постепенно снижая,  и будет наблюдать когда фрагментация закончится. Впрочем, можно начинать и с меньших значений, постепенно увеличивая пока пакеты не начнут разбиваться на фрагменты.

В общем, наша задача – Определите максимальное значение MTU, при котором пакеты не фрагментируются и успешно доставляются.

Очевидно, что для разных Операционных Систем (ОС) команда будет несколько различаться.

Для ОС Windows

Синтаксис — ping <addr> -f -l <MTU-28>
Пример — ping <addr> -f -l 1452

От реального значения MTU, которое мы задаём, нужно отнять 28 байт. Именно столько тратиться на заголовки IP и ICMP

Win_pppoe_1452

Суть подбора в том, что начиная с максимального MTU – 1500 байт (не забыв отнять 28), мы пингуем хост. ICMP нам присылает сообщение “требуется фрагментация пакета”. После этого, мы начинаем понемногу снижать MTU. Сперва можно по 10 или по 5, пока не увидим ответ от хоста. Затем начинаем понемногу добавлять следя за ответами ICMP. Ну, полагаю, что логику вы поняли 🙂

Не стоит удивляться, если вы будете получать только сообщение “Превышен интервал ожидания”. Это просто протокол ICMP где то заблокирован (у вас файрволлом или где то в интернете).

На рисунке вы видите, что у меня это цифра равна 1452 байта. Прибавляем 28 байт, которые Windows сама добавляет уже на интерфейсе, и получаем оптимальное значение MTU 1452 + 28 = 1480 байт. Такой размер MTU характерен когда подключение к провайдеру (ISP) происходит посредством PPPoE

Для ОС Linux

Синтаксис — ping -M do <addr> -s <MTU>
Пример — ping -M do yandex.ru -s 1452

Linux MTU

В ОС Linux всё обстоит аналогичным образом, за исключением подсказок самой системы какой MTU следует установить и не забыть добавить 28 байт.

Для RouterOS (Mikrotik)

Синтаксис — ping <addr> do-not-fragment size=<MTU>
Пример — ping yandex.ru do-not-fragment size=1500

Mikrotik MTU

В Mikrotik есть особенность – не нужно ничего вычитать, MTU устанавливается с учётом заголовков. На примере выше также подключение через PPoE и, как видите, фрагментация прекращается при стандартном MTU = 1480 байт (остальные 20 байт съедают заголовки PPoE).

Ниже на рисунке случай когда мы подключены к провайдеру (ISP) напрямую, посредством Ethernet.

Mikrotik MTU 1500

Как изменить MTU

Важно! Не меняйте MTU если в этом необходимости. Если решили попробовать, обязательно зафиксируйте все значение на всех интерфейсах чтобы можно было вернуть назад !

Прежде чем изменять MTU на сетевой карте или беспроводном адаптере, выполните в командной строке команду netsh interface ipv4 show subinterfaces и зафиксируйте текущие данные.

Смена MTU обычно не требует перезагрузки, изменения применяются сразу.

Для Windows проще всего скачать бесплатную утилиту TCP Optimizer которая не требует установки.
Далее, запустить и выполнить как на скриншоте.

TCPOptimizer

Признаки неправильного значения MTU

Многие сталкивались с ситуацией когда ping, например, ping yandex.ru,  проходит до нужных сайтов, что исключает проблему с DNS. Но ни один сайт в браузере не открывается. Впрочем, некоторые всё таки открываются:

lite.duckduckgo.com – лёгкая версия поисковика DuckDuckGo
maddo.xxx – сайт Chris Maddox
wiby — поисковик wiby

Почему же работает ping и открываются некоторые сайты?
Команда ping выполняет отправку сообщения типа Echo Request (эхо запрос). В ответ на такой запрос, опрашиваемый узел должен отправить ICMP пакет с теми же данными, которые были приняты, и типом сообщения Echo Reply (эхо ответ). Пакеты ICMP Request и Relpy имеют размер от 32 до 64 байтов, поэтому фрейм оказывается очень маленьким и по размеру меньше чем 1500 байт. В связи с этим, свободно проходит сквозь “бутылочное горлышко”. То же самое касается и легковесных сайтов. Ya.ru если раньше открывался, то на данный момент он “растолстел” до более чем 1,5 мегабайта, и, разумеется, не пролезет через стандартное MTU в 1500 килобайт.

Jumbo Frames

В заключении, хотелось бы затронуть такое явление как “гигантские кадры”. Рано или поздно вы натолкнётесь в интернете на тот факт, что размер MTU можно назначить в 9 000 байт.
Речь о Jumbo-кадр (jumbo frame) – технологии позволяющей передавать пакеты размером больше, нежели в стандарте IEEE 802.3. Если стандартный кадр равен 1500 байт, то Jumbo-кадр чаще всего имеет размер 9 000 байт.
Прочитав информацию выше, вы уже понимаете, что все сетевые устройства (интерфейсы) должны уметь поддерживать такой MTU. В глобальной сети Интернет кадры такой длины вы не встретите, но применение им всё таки есть. Это в основном сетевые хранилища данных, крупные дата центры, виртуальные системы. В общем, те сетевые пространства, где существует единое административное управление, и где системные администраторы позаботились, чтобы все их устройства были согласованы для работы с такими пакетами.

Если мы сменим стандартный MTU 1500 байт на 9000 байт, то получим прирост производительности канала около 7% (на скорости 1 Гбит/с).

Как посчитали
При стандартном кадре 1500 байт и интервале между кадрами 96 бит максимально возможное число кадров составит 81 538 в секунду. А полезная скорость передачи данных будет равна 1500 байт (данные в кадре) * 81 538 (число кадров в секунду) = 122 млн байт/с или 977 Мбит/с При использовании Jumbo Frame с 9000 байтами полезной нагрузки, число кадров в секунду составит 14 583. Полезная скорость передачи вырастет до: 9000 байт * 14 583 кадра/с = 131 млн байт/с или 1048 Мбит/с
Вы в своей локальной сети можете смело поэксперементировать. Условие – чтобы ваша сеть имела скорость не менее 1 Гбит/с и наличие поддерживаемых устройств.
В Windows jumbo frame называется “большой кадр” и включается в свойствах адаптера.
Виндовс - большой кадр

Ссылки

О PPPoE, MTU и проблеме Path MTU Discovery Black Hole (pppoe mtu)
PMTUD (Path MTU Discovery) и проблема фрагментации пакетов
MTU – сети для самых маленьких
Еще несколько слов о Path MTU Discovery Black Hole
Всё про MTU и фрагментацию


Проблемы MTU и MSS. Оптимизация работы VPN