Skip to content

Понятия 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 пакета, для того чтобы IP пакет собрать и передать дальше.
  • Другая особенность возникает из-за ненадежности сети передачи данных. Если один из фрагментов IP пакета потеряется, то тогда весь IP пакет должен быть отправлен заново; это означает еще один полный цикл фрагментации - сборки.

Для примера возьмем протокол NFS. NFS по умолчанию работает с блоками размером 8192 байта, что вместе со всеми заголовками увеличивается до примерно 8500 байтов. Для передачи такого пакета по сети Ethernet, у которой размер MTU равен 1500 байтам, потребуется фрагментация пакета на шесть частей: пять по 1500 байт и один на 1100 байт. Если хотя бы один из этих фрагментов потеряется, потребуется повторная передача всего пакета, что в свою очередь означает запуск повторной фрагментации.

Обход 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:

  • Машина А сравнивает размер своего буфера интерфейса (16 Кбайт) со значение MTU этого интерфейса (1500-40 = 1460 байт) и использует наименьшее число как MSS при отправке к машине B.
  • Машина B принимает значение MSS машины A (1460) и сравнивает его со значением MTU своего исходящего интерфейса (4462 - 40 = 4422 байт).
  • Машина B выбирает наименьшее из получившихся значений (1460) как значение MSS при отправке TCP сегментов к машине A.
  • Машина B сравнивает размер своего буфера интерфейса (8 Кбайт) со значение MTU этого интерфейса (4462-40 = 4422 байт) и использует наименьшее число как MSS при отправке к машине A.
  • Машина A принимает значение MSS машины B (4422) и сравнивает его со значение MTU своего исходящего интерфейса (1500 - 40 = 1460 байт).
  • Машина A выбирает наименьшее из получившихся значений (1460) как значение MSS при отправке TCP сегментов к машине B.

Таким образом 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 сообщение, но оно блокируется где-то на пути к месту назначения.
  • ICMP сообщение доходит до машины, но она не предпринимает никаких действий.

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

  • На пограничном к отправителю маршрутизаторе установить политику снятия DF флага для всех исходящих пакетов. Это приведет к фрагментации больших IP пакетов.
  • На пограничном к отправителю маршрутизаторе установить политику указания MSS в исходящих SYN TCP сегментах. Установить MSS таким образом, чтобы один IP пакет вмещался в самый маленький MTU на всем пути следования.

С распространением различного вида туннелирования трафика проблема IP фрагментации стала более насущной. Из-за появления дополнительных заголовков размер IP пакета увеличивался и уже не влезал в MTU сети. Например, GRE добавляет 24 байта к пакету, что может привести к IP фрагментации из-за того, что MTU исходящего интерфейса не способно передать пакет целиком.

Что такое туннель?

Туннель представляет из себя виртуальный интерфейс, который позволяет инкапсулировать пассажирский пакет в транспортный протокол. Этот механизм используется в схемах инкапсуляции типа точка-точка. Туннель состоит из следующих частей:

  • Пассажирский протокол (IP, IPX и пр.)
  • Несущий протокол (GRE, IP in IP)
  • Транспортный протокол (IP)

Инкапсуляция трафика при работе туннеля используется, в частности, для связи географически разнесенных сетей (VPN).

Роль маршрутизатора при работе PMTUD на концах туннеля

Маршрутизатор может играть две роли при работе PMTUD на концах туннеля

  • Первая роль включает в себя передачу пакета от машины. Действие PMTUD заключается в проверке DF флага, размера пакета и, при необходимости, отправки ICMP сообщения.
  • Вторая роль включает в себя работу с инкапсулированным для туннеля пакетом. Действие PMTUD заключается в уменьшении MSS TCP сегмента, если будет получена информация о том, что пакет нуждается в фрагментации.

Общая последовательность действий маршрутизатора при работе с инкапсуляцией.

  • Проверка наличия DF флага
  • Проверка размера пакета, который туннель может передать
  • Фрагментировать, если пакет оказался большой и не установлен DF флаг, инкапсулировать каждый фрагмент и отправить - или - сбросить пакет, если пакет оказался большим и установлен DF флаг, и отправить ICMP сообщения к источнику пакета - или - инкапсулировать пакет, если пакет не очень большой, и отправить.

Пример.

  • Маршрутизатор А получает пакет размером 1500 байт, отбрасывает его поскольку он больше MTU виртуального туннельного интерфейса GRE (1476 байт).
  • Маршрутизатор А отправляет ICMP сообщение машине источнику пакета, с информацией о максимальном MTU 1476 байт.
  • Машина запоминает данное значение MTU в своей таблице маршрутизации. И переотправляет пакет размером 1476 байт.
  • Маршрутизатор получает пакет размером 1476 байт, добавляет 24 байта GRE данных и отправляет инкапсулированный пакет размером 1500 байт в другую точку туннеля.
  • На пути следования инкапсулированного пакета, встречается промежуточный роутер с MTU исходящего интерфейса 1400 байт.
  • Промежуточный маршрутизатор видя DF флаг, сбрасывает пакет и отправляет ICMP сообщение источнику пакета (маршрутизатору А), с информацией о максимальном MTU 1400 байт.
  • Маршрутизатор А запоминает данное значение MTU, как MTU туннельного интерфейса размером 1376 байт.
  • Не получив ответа, машина переотправляет пакет размером 1476 байт.
  • Маршрутизатор А получает пакет размером 1476 байт, отбрасывает его поскольку он больше MTU виртуального туннельного интерфейса GRE (1376 байт).
  • Маршрутизатор А отправляет ICMP сообщение машине источнику пакета, с информацией о максимальном MTU 1376 байт.
  • Машина запоминает данное значение MTU в своей таблице маршрутизации. И переотправляет пакет размером 1376 байт.
  • Маршрутизатор получает пакет размером 1376 байт, добавляет 24 байта GRE данных и отправляет инкапсулированный пакет размером 1400 байт в другую точку туннеля.
  • Маршрутизатор B на другой стороне туннеля получает пакет, декапсулирует и отправляет по назначению.

Стоит отметить что ICMP сообщения передаются между двумя адресатами, и не передаются дальше, увеличивая кол-во шагов.

Чистый IPsec в туннельном режиме

IPsec позволяет осуществлять подтверждение подлинности (аутентификацию), проверку целостности и/или шифрование IP-пакетов, включая данную информацию в IP пакеты, увеличивая тем самым их размер. Получившийся размер варьируется в зависимости от используемых протоколов. IPsec может работать в двух режимах:

  • Туннельный режим. В котором оригинальный IP пакет инкапсулируется целиком. В получившемся новом пакете в качестве адресов источника и назначения указываются точки IPsec туннеля. Туннельный режим используется только с юникастовым IP траффиком. Данный режим используется для организации VPN.
  • Транспортный режим. В этом режиме, только информация внутри оригинального пакета (payload) инкапсулируется, оставляя заголовок оригинального IP пакета. Данный режим используется в рамках одной сети, когда источник и назначение IPsec туннеля (пиры) совпадают с источником и назначением оригинального IP пакета. Также он используется, когда другой туннельный протокол сначала инкапсулирует оригинальный IP пакет, после чего IPsec используется для защиты получившегося туннельного пакета.

IPsec также поддерживает механизмы PMTUD и изменения флага DF у своих пакетов.

Пример.

  • Маршрутизатор А получает пакет размером 1500 байт, отбрасывает его после добавления информации о IPsec (примерно 1558 байт) поскольку он больше MTU исходящего интерфейса (1500 байт).
  • Маршрутизатор А отправляет ICMP сообщение машине источнику пакета, с информацией о максимальном MTU 1442 байта (1500-58).
  • Машина запоминает данное значение MTU в своей таблице маршрутизации. И переотправляет пакет размером 1442 байта.
  • Маршрутизатор получает пакет размером 1442 байта, добавляет 58 байт IPsec данных и отправляет инкапсулированный пакет размером 1500 байт в другую точку туннеля.
  • На пути следования инкапсулированного пакета, встречается промежуточный роутер с MTU исходящего интерфейса 1400 байт.
  • Промежуточный маршрутизатор видя DF флаг, сбрасывает пакет и отправляется ICMP сообщение источнику пакета (маршрутизатору А), с информацией о максимальном MTU 1400 байт.
  • Маршрутизатор А запоминает данное значение MTU, как MTU в IPsec SA.
  • Не получив ответа, машина переотправляет пакет размером 1442 байта.
  • Маршрутизатор А получает пакет размером 1442 байт, отбрасывает его после добавления информации о IPsec (примерно 1500 байт) поскольку он больше MTU исходящего интерфейса (1400 байт).
  • Маршрутизатор А отправляет ICMP сообщение машине источнику пакета, с информацией о максимальном MTU 1342 байта (1400-58).
  • Машина запоминает данное значение MTU в своей таблице маршрутизации. И переотправляет пакет размером 1342 байт.
  • Маршрутизатор получает пакет размером 1342 байт, добавляет 58 байт IPsec данных и отправляет инкапсулированный пакет размером 1400 байт в другую точку туннеля.
  • Маршрутизатор B на другой стороне туннеля получает пакет, декапсулирует и отправляет по назначению.

Совместная работа 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 байтам.

Пример.

  • Маршрутизатор А получает пакет размером 1500 байт, отбрасывает его поскольку он больше MTU виртуального туннельного интерфейса GRE (1476 байт).
  • Маршрутизатор А отправляет ICMP сообщение машине источнику пакета, с информацией о максимальном MTU 1476 байт.
  • Машина запоминает данное значение MTU в своей таблице маршрутизации. И переотправляет пакет размером 1476 байт.
  • Маршрутизатор A получает пакет размером 1476 байт, добавляет 24 байта GRE данных и отправляет инкапсулированный пакет размером 1500 байт в IPsec обработку.
  • Маршрутизатор А полученный пакет размером 1500 байт, отбрасывается IPsec после добавления информации о IPsec (примерно 1538 байт) поскольку он больше MTU исходящего интерфейса (1500 байт).
  • Маршрутизатор А с уровня IPsec отправляет ICMP сообщение уровню GRE, с информацией о максимальном MTU 1462 байта (1500-38).
  • Маршрутизатор А запоминает данное значение MTU, как MTU туннельного интерфейса размером 1438 байт (1462-24).
  • Не получив ответа, машина переотправляет пакет размером 1476 байт.
  • Маршрутизатор А получает пакет размером 1476 байт, отбрасывает его поскольку он больше MTU виртуального туннельного интерфейса GRE (1438 байт).
  • Маршрутизатор А отправляет ICMP сообщение машине источнику пакета, с информацией о максимальном MTU 1438 байт.
  • Машина запоминает данное значение MTU в своей таблице маршрутизации. И переотправляет пакет размером 1438 байт.
  • Маршрутизатор A получает пакет размером 1438 байт, добавляет 24 байта GRE данных и отправляет инкапсулированный пакет размером 1462 байта в IPsec обработку.
  • Маршрутизатор А полученный пакет размером 1462 байта, после добавления информации о IPsec (примерно 1500 байт) передается второму пиру IPsec.
  • На пути следования зашифрованного пакета, встречается промежуточный роутер с MTU исходящего интерфейса 1400 байт.
  • Промежуточный маршрутизатор видя DF флаг, сбрасывает пакет и отправляется ICMP сообщение источнику пакета (маршрутизатору А), с информацией о максимальном MTU 1400 байт.
  • Маршрутизатор А запоминает данное значение MTU, как MTU в IPsec SA.
  • Не получив ответа, машина переотправляет пакет размером 1438 байт.
  • Маршрутизатор A получает пакет размером 1438 байт, добавляет 24 байта GRE данных и отправляет инкапсулированный пакет размером 1462 байта в IPsec обработку.
  • Маршрутизатор А полученный пакет размером 1462 байта, отбрасывается IPsec после добавления информации о IPsec (примерно 1500 байт) поскольку он больше MTU исходящего интерфейса (1400 байт).
  • Маршрутизатор А с уровня IPsec отправляет ICMP сообщение уровню GRE, с информацией о максимальном MTU 1362байт (1400-38).
  • Маршрутизатор А запоминает данное значение MTU, как MTU туннельного интерфейса размером 1338 байт (1362-24).
  • Не получив ответа, машина переотправляет пакет размером 1438 байт.
  • Маршрутизатор А получает пакет размером 1438 байт, отбрасывает его поскольку он больше MTU виртуального туннельного интерфейса GRE (1338 байт).
  • Маршрутизатор А отправляет ICMP сообщение машине источнику пакета, с информацией о максимальном MTU 1338 байт.
  • Машина запоминает данное значение MTU в своей таблице маршрутизации. И переотправляет пакет размером 1338 байт.
  • Маршрутизатор A получает пакет размером 1338 байт, добавляет 24 байта GRE данных и отправляет инкапсулированный пакет размером 1362 байта в IPsec обработку.
  • Маршрутизатор А полученный пакет размером 1362 байта, после добавления информации о IPsec (примерно 1400 байт) передается второму пиру IPsec.

Вывод

Суммируя вышенаписанное можно подвести некоторые итоги:

  • Не блокируйте IMCP сообщения. Вреда от этого больше, чем пользы.
  • Включите поддержку PMTUD на интерфейсах маршрутизатора.
  • Если вы хотите избежать фрагментации, и знаете MTU на всем пути следования, можете задать вручную MTU исходящего интерфейса.
  • На пограничном к отправителю маршрутизаторе установить политику снятия DF флага для всех исходящих пакетов.
  • На пограничном к отправителю маршрутизаторе установить политику указания MSS в SYN TCP сегментах.