Содержание
Определение MTU
Информация в локальной сети и интернете передаётся не сплошным потоком, а небольшими пакетами.
MTU (Maximum Transmission Unit) определяет максимальный размер пакета данных, который может быть передан через сеть без фрагментации (дробления).
Если размер пакета будет превышать MTU интерфейса, то незамедлительно начнётся процесс дефрагментации. Пакет будет разбит на более мелкие части, помечен специальными метками чтобы на стороне приёма хост их мог правильно собрать воедино.
В далёком 1980 году IT сообщество решило, что стандартный размер L3-интерфейса будет равен 1500 байт. То есть пакет размером в 1500 байт пройдёт через интерфейс, а пакет в 1501 байт будет фрагментирован либо отброшен. Также определились с тем, что самый маленький размер MTU – 68 байт. Записали эту умную мысль в документ RFC 1191
В самом начале хотелось бы отметить, что тема MTU довольна непростая, содержащая кучу нюансов, и мы не будем сильно углубляться. Но следует себе представлять, что MTU бывает для L2 (frame size) и L3 (packet size) и размеры будут отличаться. Сложней когда рассматриваем MTU при туннелирование трафика, при использовании VPN. Описанные сложности, в основном, связаны с наличием заголовков в пакетах, которые уменьшают размер полезных данных.
Способы добиться правильного MTU
Кадр с большим MTU может быть:
- Фрагментирован (разбит на кусочки)
- Автоматически выставлен в нужный размер (технология Patch MTU Discovery (PMTUD))
- Полностью отброшен (drop – “дропнуть”)
- Фиксировано настроен вручную
Фрагментация пакетов
При превышении размера MTU стандартом предусмотрен механизм разбивки большого пакета на маленькие кусочки. Далее следует сборка из кусочков первоначального пакета – дефрагментация.
Маршрутизаторы и коммутаторы не занимаются дефрагментацией пакетов, у них и так хлопот хватает, поэтому разбивкой и сборкой пакетов занимается отправитель и тот, кому предназначается сообщение.
Patch MTU Discovery
Технология PMTU discovery призвана существенно снять нагрузку с маршрутизаторов за счёт отказа фрагментировать пакеты.
Когда по пути следования размер пакета в какой то момент превысит значение MTU маршрутизатора, последний отправит сообщение “ICMP error: packet too big “. К сообщению так же будет прикреплена рекомендация “Use MTU = 1300” – используй MTU 1300. Эта процедура может происходить от узла к узлу несколько раз пока пакет успешно не достигнет хоста получателя. Технология PMTUD срабатывает только в сторону уменьшения.
Patch MTU Blackhole Detection
Patch MTU Blackhole буквально можно перевести как “чёрная дыра”. Собственно это определение подходит как нельзя кстати, т.к. в этом случае передаваемые пакеты теряются в никуда. Пакеты “дропаются” – отсекаются, уничтожаются, выбрасываются.
Чаще всего это происходит по простой причине – блокировкой протокола ICMP на каком либо участке следования пакетов. Это может оказаться специально/неверно настроенный файрволл, политика какого либо из узлов маршрутизатора. Данный феномен считается недружелюбным и вредным. Блокировать ICMP – плохой тон в современном Интернете. Но тем не менее, блокировки встречаются, в большинстве случаев вы никак на это не сможете повлиять.
Patch MTU Blackhole Detection (PMTUBD) – это механизм, который детектирует описанное выше явление и выставляет MTU 576 байт. Это повышает вероятность, что такой маленький пакет “пролезет”, и да, в большинстве случаев так и происходит. Но вы и сами уже, наверное, уже догадались, что скорость передачи существенно упадёт. Поэтому рекомендация, если у вас это параметр включен – отключать. И остаётся только вариант – настраивать MTU ручками.
Как определить оптимальное значение MTU
Для определения значения MTU мы воспользуемся свойством утилиты PING, а именно тем, что она умеет отправлять пакеты заданные вручную, а также выставлять в пакете флаг запрещающий фрагментацию – DF. Будем отправлять пакеты с высоким значением MTU постепенно снижая, и будет наблюдать когда фрагментация закончится. Впрочем, можно начинать и с меньших значений, постепенно увеличивая пока пакеты не начнут разбиваться на фрагменты.
В общем, наша задача – Определите максимальное значение MTU, при котором пакеты не фрагментируются и успешно доставляются.
Очевидно, что для разных Операционных Систем (ОС) команда будет несколько различаться.
Для ОС Windows
Синтаксис — ping <addr> -f -l <MTU-28>
Пример — ping <addr> -f -l 1452
От реального значения MTU, которое мы задаём, нужно отнять 28 байт. Именно столько тратиться на заголовки IP и ICMP
Суть подбора в том, что начиная с максимального 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 следует установить и не забыть добавить 28 байт.
Для RouterOS (Mikrotik)
Синтаксис — ping <addr> do-not-fragment size=<MTU>
Пример — ping yandex.ru do-not-fragment size=1500
В Mikrotik есть особенность – не нужно ничего вычитать, MTU устанавливается с учётом заголовков. На примере выше также подключение через PPoE и, как видите, фрагментация прекращается при стандартном MTU = 1480 байт (остальные 20 байт съедают заголовки PPoE).
Ниже на рисунке случай когда мы подключены к провайдеру (ISP) напрямую, посредством Ethernet.
Как изменить MTU
Прежде чем изменять MTU на сетевой карте или беспроводном адаптере, выполните в командной строке команду netsh interface ipv4 show subinterfaces и зафиксируйте текущие данные.
Смена MTU обычно не требует перезагрузки, изменения применяются сразу.
Для Windows проще всего скачать бесплатную утилиту TCP Optimizer которая не требует установки.
Далее, запустить и выполнить как на скриншоте.
Признаки неправильного значения 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 Гбит/с).
Вы в своей локальной сети можете смело поэксперементировать. Условие – чтобы ваша сеть имела скорость не менее 1 Гбит/с и наличие поддерживаемых устройств.В Windows jumbo frame называется “большой кадр” и включается в свойствах адаптера.
Ссылки
О PPPoE, MTU и проблеме Path MTU Discovery Black Hole (pppoe mtu)
PMTUD (Path MTU Discovery) и проблема фрагментации пакетов
MTU – сети для самых маленьких
Еще несколько слов о Path MTU Discovery Black Hole
Всё про MTU и фрагментацию