mtu mss что это
Провайдеры и MTU/MSS/PMTU
Предыстория
Значит нужен мне второй канал связи, да этак мегабит 300 в секунду. В моём городе немного провайдеров, по этому выбрать не дали и пришлось подключаться к WiFire (он же NetByNet, MegaFon и так далее). Подключился, потестил, 300 мегабит, балдеж. Решил я значит почитать что нового на своем любимом Хабре и опа: он не открывается, но охотно пингуется.
Диагностика
Ну думаю: что-то тут не так. Сетевое у меня Mikrotik, возможностей уйма, пойду искать причину на своей стороне. Лезу в логи и вижу как посыпался DoH (РКН, приветик) и крайне удивляюсь этому. решил временно отрубить DoH и дать 1.1.1.1. Ситуация не изменилась. Начал резолвить адреса хотя бы чего-нибудь, все через раз. Решил прокинуть трейс до Хабра и смотрю на «потяряшки». Думаю дай звякну в поддержку, вдруг умное чего скажут. Те репу почесали, сказали что не видят мою сеть за роутером (nat >> forward >> change ttl >>+1 😀) и изобразили что-то вроде «Мы ХЗ».
Начал копать дальше. Вспомнил всю балду, которую знаю о пакетах и тут осенило.
Что такое MTU и MSS?
MTU (англ. maximum transmission unit) означает максимальный размер полезного блока данных одного пакета (англ. payload), который может быть передан протоколом без фрагментации.
MSS (англ. Maximum segment size) является параметром протокола TCP и определяет максимальный размер полезного блока данных в байтах для TCP-пакета (сегмента). Таким образом этот параметр не учитывает длину заголовков TCP и IP.
Решение проблемы
Топаем в консоль и пишем:
/ip firewall mangle add chain=forward action=change-mss new-mss=clamp-to-pmtu passthrough=no tcp-flags=syn protocol=tcp out-interface=*название WAN интерфеса* tcp-mss=1300-65535 log=no
/ip firewall mangle add chain=forward action=change-mss new-mss=clamp-to-pmtu passthrough=no tcp-flags=syn protocol=tcp in-interface=*название WAN интерфеса* tcp-mss=1300-65535 log=no
Разбираем что написали:
и бинго, наконец-то открывается Хабр и все что мне нужно.
В сетевой части я не «Ас», по этому сумбурно вышло, да и на Хабре статьи не нашел похожей, может будет кому полезно.
Понятия IP фрагментация, MTU, MSS, PMTUD и их связь
Данный пост написан по мотивам статьи «Resolve IP Fragmentation, MTU, MSS, and PMTUD Issues with GRE and IPSEC» c сайта Cisco, рассказывающей про работу механизма Path Maximum Unit Discovery (PMTUD) в связке с разными механизмами туннелирования IP.
IP фрагментация и обратная сборка
Длина IP пакета может достигать 64 Кбайтов, что может превышать размер фрейма (MTU) протокола нижнего уровня, в который инкапсулируется IP. Поскольку IP может передаваться по средам с разными значениями MTU, в него был встроен механизм фрагментации. Задача принимающей стороны обратно собрать фрагменты в оригинальный IP пакет.
При IP фрагментации IP пакет делится на несколько кусочков (фрагментов), оформленных таким образом, чтобы у принимающей машины была возможность их собрать в оригинальный IP пакет. Для ее работы в заголовке IP пакета используются сл. поля: адрес источника и получателя, идентификационный номер, размер пакета, смещение фрагмента и флаги: «не фрагментировать» (DF) и «у пакета еще есть фрагменты»(MF).
Проблемы с IP фрагментацией
При работе с IP фрагментацией следует помнить о нескольких особенностях.
Обход IP фрагментации путем использования TCP MSS.
TCP Maximum Segment Size (MSS) определяет максимальный размер данных, который машина готова получить через один TCP сегмент. Сам TCP сегмент инкапсулируется в IP пакет. Значение MSS передается в заголовке TCP SYN при установлении соединения между двумя узлами (через механизм трехэтапного установления соединения). Обе стороны соединения передают значение своего MSS. В отличие от популярного заблуждения, принимаемое значение MSS не несет характер переговоров. Отправляющий хост обязан ограничить размер своих исходящих TCP сегментов значением равным или меньшим значению, сообщенному ему принимающим хостом.
Значение MSS выбирается таким образом, чтобы предотвратить IP фрагментацию. Механизм работы MSS следующий: при создании TCP соединения, машина определяет размер буфера исходящего интерфейса и MTU этого интерфейса. Дальше эти два числа сравниваются и выбирается наименьшее. Тут следует оговориться, что за MTU выбирается число по формуле MTU минус 40 байт, для учета TCP и IP заголовков. Затем выбранное число сравнивается с размером MSS, переданным принимающей стороной, и снова выберется наименьшее значение.
Пример работы MSS:
Таким образом MSS на обеих сторонах установлено равным 1460 байтам, это наиболее частая ситуация.
В данном примере IP фрагментация не будет происходить, поскольку в процессе установления TCP соединения, размер TCP сегментов был взят с расчетом на вмещение в MTU низлежащей сети. Однако, если IP пакет пойдет через сети с меньшим MTU, то может потребоваться фрагментация.
Что такое PMTUD?
В предыдущем примере TCP MSS выполнил работу по избавлению от IP фрагментации. Однако такая ситуация возможна только если MTU сети на пути между двумя хостами будет не ниже MTU исходящих интерфейсов этих машин. На случай различных значений MTU между двумя узлами был создан PMTUD.
Стоит отметить, что PMTUD поддерживается только TCP протоколом, UDP и другие протоколы его не поддерживают. Если машина поддерживает PMTUD, то все TCP IP пакеты помечаются флагом DF («не фрагментировать»).
Когда машина отправляет пакет с DF флагом, работа PMTUD заключается в том, чтобы уменьшать значение MSS в исходящем TCP сегменте, если будет получена информация о том, что пакет нуждается в фрагментации. Машина запоминает значение MTU создавая строчку в таблице маршрутизации до соответствующего получателя.
Если маршрутизатор получает IP пакет, с установленным флагом DF, который он не может передать дальше из-за малого значения MTU исходящего интерфейса, он сбрасывает пакет и отправляет ICMP сообщение «Destination Unreachable» к источнику этого IP пакета указывая «fragmentation needed and DF set» как код ошибки (type 3, code 4). Когда машина, отправлявшая IP пакет, получит данное сообщение, она уменьшит значение MSS, в последующем TCP сегменте.
В соответствии с RFC 1191, маршрутизатор отправляющий ICMP сообщение «fragmentation needed and DF set», должен указать значение MTU исходящего интерфейса.
Механизм PMTUD работает постоянно, поскольку путь от одной машины к другой может измениться. Получив сообщение «Can’t Fragment» он обновляет таблицу маршрутизации машины.
PMTUD выполняется для обоих направлений TCP независимо, т.к. пути входящего и исходящего трафика могут различаться.
Проблемы PMTUD
В процессе работы PMTUD могут произойти три проблемы:
Из описанных выше проблем, вторая является наиболее частой. Все ICMP пакеты просто отфильтровываются межсетевым экраном и не доходят до отправителя отброшенного пакета.
Если возможности пропускать ICMP сообщения нет, то могут применяться другие способы.
С распространением различного вида туннелирования трафика проблема IP фрагментации стала более насущной. Из-за появления допольнительных заголовков размер IP пакета увеличивался и уже не влезал в MTU сети. Например, GRE добавляет 24 байта к пакету, что может привести к IP фрагментации из-за того, что MTU исходящего интерфейса не способно передать пакет целиком.
Что такое туннель?
Туннель представляет из себя виртуальный интерфейс, который позволяет инкапсулировать пассажирский пакет в транспортный протокол. Этот механизм используется в схемах инкапсуляции типа точка-точка.
Туннель состоит из следующих частей:
Инкапсуляция трафика при работе туннеля используется, в частности, для связи географически разнесенных сетей (VPN).
Роль маршрутизатора при работе PMTUD на концах туннеля
Маршрутизатор может играть две роли при работе PMTUD на концах туннеля
Общая последовательность действий маршрутизатора при работе с инкапсуляцией.
Стоит отметить что ICMP сообщения передаются между двумя адресатами, и не передаются дальше, увеличивая кол-во шагов.
Чистый IPsec в туннельном режиме
IPsec позволяет осуществлять подтверждение подлинности (аутентификацию), проверку целостности и/или шифрование IP-пакетов, включая данную информацию в IP пакеты, увеличивая тем самым их размер. Получившийся размер варьируется в зависимости от используемых протоколов.
IPsec может работать в двух режимах:
IPsec также поддерживает механизмы PMTUD и изменения флага DF у своих пакетов.
Пример.
Совместная работа GRE и IPsec
Несколько сложнее дела обстоят, когда IPsec используется для шифрования GRE туннелей. Совместная работа этих технологий необходима, поскольку IPsec не поддерживает IP мультикаст, на котором основываются протоколы динамической маршрутизации, которые могут использоваться в VPN сети. GRE с другой стороны поддерживает мультикаст и может быть использован, для того чтобы сначала инкапсулировать мультикастовый пакет протокола динамической маршрутизации в юникастовый пакет GRE, который затем шифруется IPsec. В данной связке IPsec обычно используется в транспортном режиме, поскольку точки туннеля GRE и пиры IPsec одни и те же, что позволит сохранить 20 байт на излишней IPsec информации.
Может так случиться, что IP пакет разделен на два фрагмента, каждый из которых инкапсулирован GRE. В таком случае IPsec зашифрует каждый из пакетов по отдельности. Получившееся после шифрования пакеты, могут быть слишком большими и потребовать повторной фрагментации. Такая «двойная фрагментация» уменьшает эффективность работы маршрутизаторов и снижает пропускную способность.
Для того, чтобы избежать данной ситуации можно вручную указать MTU виртуального туннельного интерфейса GRE, чтобы нивелировать размер дополнительной информации, добавляемой GRE и IPsec в пакет. Рекомендуемое значение MTU для GRE в таком случае составляет 1400 байт, для ситуаций, когда MTU исходящего интерфейса равно 1500 байтам.
Пример.
Вывод
Суммируя вышенаписанное можно подвести некоторые итоги:
Что такое MTU и как установить оптимальный размер пакета в роутере?
Всем привет! Начнем, пожалуй, с вопроса – а что же такое MTU? MTU (от английского Maximum transmission unit) – это максимальный объем в пакете, который может передавать в той или иной сетевой среде. Как вы знаете, все данные передаются определенными пакетами – будь это интернет, Wi-Fi или локальная сеть дома. Все как на почте – почтальон не может переносить больше определенного веса.
Конечно, тут идут и некоторые ограничения. Например, в PPPoE обычно используется 1492 байта. При Ethernet подключении 1500 байта, а в беспроводной сети MTU равен 2304. Если же сетевому устройству нужно передать куда больше информации, то все делится как раз на эти MTU блоки.
Размер MTU зачастую определяется самим отправляющим устройством. MTU в настройках роутера также задается по умолчанию значением заданным разработчиками. Если говорить проще, то происходит следующее:
Также нужно знать, что в размер MTU входит:
К чему может привести неправильное значение MTU? Если на роутере, который чаще всего является шлюзом между интернетом и локальной сетью, выставлено неправильное значение, то могут наблюдаться проблемы со связью и интернетом. Например, нельзя зайти на какой-то сайт, некоторые службы в локальной сети перестают работать. Но само значение можно выставить вручную в настройках маршрутизатора.
Также вы можете встретить параметр MRU (maximum receive unit) – это максимальный размер пакета, который может принять устройство. Все по аналогии с MTU. Далее я расскажу, как узнать оптимальный размер MTU в вашей сети и как установить это значение в роутере.
ВНИМАНИЕ! Это нужно делать только в том случае, если у вас наблюдаются проблемы с интернетом, сетью или какими-то сетевыми службами. Если у вас все в порядке, то лучше ничего не делать, так как дальнейшие действия могут привести к ухудшению связи.
Определение идеального MTU
Способ достаточно простой – мы будем использовать встроенную утилиту в Windows «ping» с помощью командной строки. Нажмите на клавиши «Win» (находится в нижнем ряду между «Ctrl» и «Alt») и английскую «R».
В окошке введите команду «cmd» и нажмите «ОК». Командную строку также можно запустить через «Пуск», введя в поисковую строку эти три буквы.
Для начала давайте узнаем, какой MTU у нас стоит по умолчанию. Для этого вводим команду:
netsh interface ipv4 show subinterfaces
Я подключен по Wi-Fi, поэтому у меня стоит стандартное значение 1500. Если же вы подключены к кабелю провайдера напрямую, то эта команда может вам помочь.
Далее мы будем использовать стандартную команду ping с определенными параметрами. Наша задача взять за основу какое-то определенное значение MTU и увеличивать его до тех пор, пока система не сообщит нам, что нам нужно установить параметр фрагментации или разбиения пакета.
Если говорить проще, то мы будем увеличивать пакет до тех пор, пока он проходит по нашему соединению в интернете. Для примера мы будем пинговать всем известный «google.com», но вы можете взять любой другой сайт:
В итоге мы видим, что пакеты с размером в 1440 байтов спокойно отправляются в сеть. Поэтому мы увеличим размер MTU на 1. Немного о команде: значение «-f» – запрещает фрагментировать пакет – это нужно для наших тестов. «-l» (маленькая английская буква «L») – задает размер пакета.
Теперь увеличиваем его на один. Чтобы не прописывать команду постоянно, нажмите на клавиатуре на стрелку вверх, сотрите последнюю цифру и увеличьте её на один:
Как видите этот пакет также свободно проходит. В общем проделываем эту процедуру до тех пор, пока вы сами не найдете идеальный параметр для вашей среды. В самом конце вы должны увидеть сообщение:
«Требуется фрагментация пакета, но установлен запрещающий флаг»
В моем случае это 1472, но у вас может быть совершенно другой параметр, так что нужно проводить свои тесты.
Но это не окончательное значение MTU – это мы нашли только MSS. Поэтому к нему нам нужно прибавить IP и ICMP заголовки. Для этого просто прибавляем ещё 28 байта:
Теперь данное значение можно установить в вашем домашнем роутере.
Установка MTU в роутере
Для начала нам нужно зайти в настройки роутера – для этого нужно ввести IP или DNS адрес в адресную строку любого браузера. Можете попробовать популярные адреса:
Адрес можно подсмотреть на этикетке под корпусом. Или ввести в консоль команду:
IP маршрутизатора будет в строке 192.168.1.1.
Далее инструкции могут отличаться в зависимости от модели роутера.
Zyxel Keenetic
«Проводной» – «Параметры IP и DNS» (или «Аутентификация у провайдера (PPPoE / PPTP / L2TP)»)
Переходим в раздел «Интернета» – далее на вкладке «Подключение» выбираем активный коннект к интернету.
Что такое MTU? Как найти оптимальный размер MTU для домашней сети?
Информация в компьютерных сетях передается в виде небольших сформированных блоков данных (иначе говоря, пакетов). Каждый пакет помимо пересылаемой информации содержит еще и служебные данные, составляющие так называемый заголовок (header) пакета. Эти служебные данные нужны для определения целостности данных, используемой версии сетевых протоколов и т.д. При этом размер полезного блока данных ограничивается определенным количеством байт. Делается это для того, чтобы снизить вероятность потерь информации и уменьшить время повторной пересылки пакета в случае появления проблем с подключением.
MTU – что это?
MTU (от англ. Maximum transmission unit) – это максимальный объем данных, передаваемый по сети без дальнейшего фрагментирования (одним пакетом). Любая информация, объем которой превышает значение MTU, автоматически разбивается на небольшие блоки данных перед отправкой по сети. Возможные значения MTU зависят от используемого типа подключения к сети. Так, при использовании PPoE (в основном с ADSL и подобными технологиями) максимальное значение параметра MTU составляет 1492 байта (стандартные 1500 байт для Ethernet минус восемь байт заголовков), а при использовании Wi-Fi MTU может достигать 2304 байт.
В современных ОС оптимальное значение MTU зачастую вычисляется самой системой или берется из настроек маршрутизатора (обычно значение MTU задается в разделе WAN сетевых настроек устройства). Если проблем с доступом к Интернету не наблюдается, значение MTU лучше не менять. Однако, если возникли проблемы со связью и вы предполагаете, что они могут быть связаны с фрагментацией сетевых пакетов, попробуйте изменить значение MTU.
Сделать это можно не только через изменение соответствующей настройки маршрутизатора, но и средствами операционной системы. Перед тем как менять MTU, необходимо рассчитать оптимальное значение этого параметра. Расскажем, как это делается.
Рассчитываем значение MTU
Найти оптимальное значение MTU можно с помощью старой-доброй команды ping. Предположим, что мы определяем значение этого параметра для проводного подключения. Открываем командную строку Windows и пишем такую команду:
Запомните полученное значение и прибавьте к нему 28 байт (длина служебных заголовков). Получившееся значение – это оптимальное (или близкое к оптимальному) значение MTU для вашей сети.
Устанавливаем значение MTU
Теперь вы знаете, какое значение MTU можно использовать в вашей домашней сети. Укажем операционной системе, что необходимо использовать именно его (дальнейшие примеры иллюстрируют настройку сети IPv4).
В Windows открываем командную строку с правами администратора и выполняем команду:
netsh interface ipv4 show subinterfaces
На экране появится список всех сетевых подключений, их названия и текущий размер MTU. Запоминаем название нужного нам подключения и пишем следующую команду:
netsh interface ipv4 set subinterface Ethernet mtu=1450 store=persistent
Здесь Ethernet – название интерфейса (может быть другим), 1450 – выбранный размер MTU. Если название состоит из нескольких слов, его надо указывать в кавычках.
Для отключения автоматической настройки MTU можно выполнить команду:
netsh int tcp set global autotuninglevel=disabled
Включить автоматическое определение MTU можно той же командой с параметром autotuninglevel=normal.
Если необходимо сбросить настройки к исходному состоянию, выполняем команду:
В Linux настройка MTU осуществляется с помощью команды ip. Посмотрим текущее значение MTU:
А далее установим желаемое значение:
Здесь eth0 – название интерфейса, оно может быть другим на вашем компьютере. Для того чтобы выбранное значение MTU использовалось постоянно при каждом входе в систему, необходимо прописать значение в файл /etc/network/interfaces, либо создать модуль для systemd. Рекомендуем обратиться к документации используемого дистрибутива для получения более подробной информации.
В macOS посмотреть размер MTU для подключения en0, а затем установить значение параметра можно в терминале:
Вы можете указать размер MTU и в настройках маршрутизатора. Во многих моделях роутеров соответствующая настройка находится в разделе WAN. Более подробную информацию можно получить на сайтах производителей сетевого оборудования.
При ручной настройке MTU учитывайте, что слишком маленький размер блока данных устанавливать не рекомендуется, чтобы не создавать дополнительную нагрузку на процессор маршрутизатора. Также напомним еще раз: если ваше сетевое подключение работает нормально, значение MTU менять не стоит. Параметры, установленные провайдером или производителем маршрутизатора, вполне подходят для подавляющего большинства пользователей.
k4’s blog
JunOS, IOS, Unix, Linux, Windows, routing, switching, security, QoS, network design, telecom.. Статьи, заметки. Решил собрать блог, чтоб разместить полезные статьи в одном месте.
четверг, 21 июня 2012 г.
Предотвращение IP-фрагментации. Что такое TCP MSS и как оно работает
Оригинал тут http://www.cyberguru.ru/networks/protocols/ip-fragmentation-page3.html
Максимальный Размер TCP Сегмента (MSS) определяет максимальное количество данных, которые хост желает принимать в единственной TCP/IP датаграмме. Эта TCP/IP датаграмма может быть фрагментирована в уровне IP. Значение MSS посылают как опциию TCP заголовка только в сегменте TCP SYN. Каждая сторона на TCP соединении сообщает свое значение MSS другой стороне. Хост отправитель обязан ограничивать размер данных в единственном TCP сегменте в значение, меньшем или равном MSS, о котором сообщает хост получатель.
Первоначально, значение MSS означало, сколько памяти нужно выделить (больше или равной 65496 КБ) на станции получателя, чтобы в состоянии хранить TCP данные, содержавшиеся в пределах единственной IP датаграммы. MSS был максимальным сегментом (кусочком) данных, которые желал принимать TCP получатель. Этот TCP сегмент мог быть огромным, примерно до 64 КБ (максимальный размер IP датаграммы), и его необходимо было фрагментировать на уровне IP, чтобы передать по сети к хосту получателю. Принимающий хост повторно должен был собрать IP датаграмму прежде, чем передать полный TCP сегмент на уровень TCP.
Рассмотрим ниже несколько показательных сценариев, от том как установливаются и используются значения MSS, чтобы ограничить размеры TCP сегмента, и соотвественно, размеры IP датаграммы.
Способ которым теперь работает MSS это то, что каждый хост сначала сравнивает свой MTU исходящего интерфейса с его собственным буфером и выберет самое низкое значение в качестве MSS, для посылки. Затем хосты сравнят полученный размер MSS, с их собственным MTU интерфейса и снова выберут меньшее из двух значений.
Сценарий 2 иллюстрирует этот дополнительный шаг, сделанный отправителем, чтобы избежать фрагментации на локальных и удаленных каналах. Посмотрите, как принимается во внимание MTU исходящего интерфейса каждым хостом (прежде, чем хосты пошлют друг другу свои значения MSS), и как это помогает избежать фрагментации.
В Сценарии 2, фрагментация не происходит, потому что хостами были приняты во внимание MTU обоих интерфейсов. Пакеты могут все еще фрагментироваться в сети между Router A и Router B, если они встретят линк с более низким MTU.