in

Всё про MTU и фрагментацию

Когда размер имеет значение

«Мы не знаем что это такое, если бы мы знали что это такое, мы не знаем что это такое». Примерно так можно описать параметр MTU, если не читать текст ниже. Какой вариант выбрать — решать только тебе.

Что такое MTU

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

Типичный размер, являющийся неким стандартом, MTU для физического L3-интерфейса 1500 байт (т.е. максимальный размер L3 пакета, который может передаваться в L2 фрейм).

Стоп, но ведь мы же писали, что максимальный размер Ethernet-фрейма может быть 1518 байт? Дело в том, что размер 1500 байт — это размер полезных данных в кадре Ethernet, куда входят заголовки IP-пакетов, но зато не входят заголовок Ethernet и FSC.

Картинка побольше и попроще:

Считается, что MTU является характеристикой канального уровня модели OSI. Но на вышестоящих уровнях (L3 и L4) тоже есть своё понятие MTU. Так же этот параметр может быть вообще не связан с определенным уровнем. Существуют такие понятия как: tunnel mtu, vlan mtu, routing mtu, mpls mtu (где может добавляться l2+ заголовок, т.н. mpls-метка).

Когда сетевой уровень (IP) хочет послать дейтаграмму — он смотрит через какой интерфейс пакет будет маршрутизироваться. Если IP дейтаграмма больше, чем MTU канального уровня, то осуществляется фрагментация (о ней мы тоже поговорим ниже).

Дейтаграмма разбивается на меньшие части (фрагменты) и пакет как бы пересобирается заново. Каждый фрагмент должен быть меньше чем MTU, что не просто, учитывая, что многие вышестоящие протоколы часто создают пакеты большего размера.

При использовании туннелирования, размер пакета увеличивается за счёт дополнительных заголовков (GRE, IPSec и т.д.). Или, например, при работе протокола PPPoE (часто используется провайдерами) максимальное значение параметра MTU составляет 1492 байта — то есть стандартные 1500 байт для Ethernet за вычетом восьми байт заголовков.

Понятие IP MTU

У сетевого протокола есть своё понятие MTU. Максимальный размер пакета с IP-заголовком, который может передать сетевой интерфейс без фрагментации называется IP MTU.

Как правило, IP MTU устанавливают меньше или равное MTU на канальном уровне чтобы избежать фрагментации пакетов — для этого размер IP MTU выставляют на 20 байт меньше, чем на уровне L2.

Если уровень IP получает данные, он проверяет, будет ли после добавления собственной информации размер пакета больше, чем MTU для канального уровня (и при условии, что бит «Не фрагментировать» установлен в ноль), дейтаграмма IP фрагментируется на размеры, которые подходят для нижележащего слоя.

Протоколы транспортного уровня (протоколы TCP или UDP), пользующиеся сетевым уровнем для отправки пакетов, считают, что максимальный размер поля данных IP-пакета равен 65535, и поэтому могут передать ему сообщение такой длины для транспортировки.

В функции уровня IP входит разбиение слишком длинного для конкретного типа составляющей сети сообщения на более короткие пакеты с созданием соответствующих служебных полей, нужных для последующей сборки фрагментов в исходное сообщение

Понятие MSS

МSS (Maximum Segment Size) — максимальный размер данных (без TCP-заголовка), которое хост сможет принять в одной TCP/IP дейтаграмме. Рассчитывается по формуле:

МSS = IP MTU — IP заголовок (20 байт) — размер TCP-заголовка (20 байт) ≈ 1460 байт.

TCP/IP-дейтаграмма может быть фрагментирована на уровне IP, также значение MSS может передаваться в качестве отдельной опции TCP-заголовка, но только в сегментах TCP SYN. Каждая сторона на TCP соединении сообщает свое значение MSS другой стороне. Хост отправитель обязан ограничивать размер данных в единственном TCP сегменте в значение, меньшем или равном MSS, о котором сообщает хост получатель.

Как всё это работает? При создании TCP соединения, машина определяет размер буфера исходящего интерфейса и MTU этого интерфейса. Дальше эти два числа сравниваются и выбирается наименьшее. Как мы помним, MTU высчитывается с учетом минуса IP и TCP-заголовка (-40 байт). Затем выбранное число сравнивается с размером MSS, переданным принимающей стороной, и снова выберется наименьшее значение, если у принимающей машины он меньше.

Через Wireshark можно посмотреть на длину сегмента TCP MSS. Например, при открытии страницы в браузере:

Фрагментация

Фрагментация  — это разбиение блока данных пакета при его отправке, размер которого превышает значение MTU сетевого интерфейса. Стек TCP/IP разобьет этот пакет на более мелкие части (фрагменты), соответствующие MTU интерфейса.

Фрагментация происходит на уровне IP-адреса и не зависит от базового протокола, например, в стеке TCP/IP, например, эту задачу решает протокол транспортного уровня TCP. Этот протокол может разбивать поток байтов, передаваемый ему с прикладного уровня на сообщения нужного размера (например, на 1460 байт для протокола Ethernet).

Если 2000-байтовый пакет передается через сетевой интерфейс с MTU 1500, он будет разбит на фрагменты в 1500 и 500 байт. Сетевые устройства на маршруте между источником и назначением могут либо отбрасывать пакеты, превышающие MTU, либо фрагментировать их.

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

Таким образом, когда IP-пакет отправляется, он устанавливает в поле Identification значение, которое должно быть уникальным для данной пары отправитель — получатель. Кроме этого отправитель в заголовке пакета устанавливает время, в течение которого пакет может быть активным в сети.

Поле смещения фрагмента (Fragment Offset) сообщает получателю положение фрагмента в исходном пакете. Смещение фрагмента и длина определяют часть исходного пакета, принесенную этим фрагментом.

Флаг More fragments показывает появление последнего фрагмента. Модуль протокола IP, отправляющий неразбитый на фрагменты пакет, устанавливает в нуль флаг More fragments и смещение во фрагменте.

Чтобы разделить на фрагменты большой пакет, модуль протокола IP, установленный, например, на маршрутизаторе, создает несколько новых пакетов и копирует содержимое полей IP-заголовка из большого пакета в IP-заголовки всех новых пакетов. Данные из старого пакета делятся на соответствующее число частей, размер каждой из которых, кроме самой последней, обязательно должен быть кратным 8 байт.

Размер последней части данных равен полученному остатку, а каждая из полученных частей данных помещается в новый пакет.

Процесс фрагментации может изменить значения данных, расположенных в поле параметров, и значение контрольной суммы заголовка, изменить значение флага More fragments и смещение фрагмента, изменить длину IP-заголовка и общую длину пакета.

В заголовок каждого пакета заносятся соответствующие значения в поле смещения «fragment offset», а в поле общей длины пакета помещается длина каждого пакета.

Таким образом, первый фрагмент будет иметь в поле Fragment Offset нулевое значение. Во всех пакетах, кроме последнего, флаг More fragments устанавливается в единицу, а в последнем фрагменте — в нуль.

Сборка фрагментов пакета происходит в обратном порядке: IP-протокол объединяет IP-пакеты, имеющие одинаковые значения в полях идентификатора, отправителя, получателя и протокола. Процедура объединения заключается в помещении данных из каждого фрагмента в позицию, указанную в заголовке пакета в поле Fragment Offset.

Почему могут не фрагментироваться пакеты? У вашего провайдера может стоять запрет на приём фрагментированных пакетов. Для сетевого устройства фрагментация — довольно затратный процесс, особенно, если задействовано CPU, да и rate limit’ы никто не отменял

Проверяем MTU на железе

Сложившаяся практика гласит, что разные вендоры устанавливают разные MTU для сетевых интерфейсов по умолчанию. Возьмем два самых распространённых — Cisco и Juniper.

Оборудование Cisco рассматривает параметр MTU в соответствии c классическим определением от IEEE, то есть по дефолту на интерфейсах установлено 1500 байт, заголовок L2 кадра при этом не учитывается.

Оборудование от Juniper Networks. наоборот, считает MTU вместе с L2 заголовком —  по умолчанию задано 1518 байт, где 18 байт — размер L2 заголовка с 802.1q тегом. Если пинговать джунипер, то можно заметить, что максимум он даёт 1472 байта. Всё потому, что он учитывает еще 20 байт IP заголовка + 8 байт ICMP (1500-28 = 1472)

Отдельно можно посмотреть на MPLS MTU

Проверить MTU на интерфейсе Juniper можно с помощью команды show configuration interfaces или show interfaces:

@RTR-DEST> show configuration interfaces ge-3/0/0
description «## to RTR-DEST2 ##»;
mtu 9100;
hold-time up 1000 down 0;
unit 0 {
family ethernet-switching {
port-mode trunk;
@RTR-TRZ> show interfaces xe-0/1/0
Physical interface: xe-0/1/0, Enabled, Physical link is Up
Interface index: 257, SNMP ifIndex: 814
Description: << 10GE to RTR-TRZ2 xe-0/1/0 >>
Link-level type: Ethernet, MTU: 9100, Speed: 10Gbps, Duplex: Full-Duplex, BPDU Error: None, MAC-REWRITE Error: None, Loopback: Disabled,

На оборудовании CIsco это можно сделать командой sh int

RTR-CIS2#sh int Fa0/7
Load for five secs: 5%/0%; one minute: 4%; five minutes: 4%
Time source is NTP, 14:54:09.951 MSK Tue Jul 14 2015
FastEthernet0/7 is up, line protocol is up (connected)
Description: ## LM:  TESTED ##
MTU 1998 bytes, BW 100000 Kbit, DLY 100 usec,
reliability 255/255, txload 21/255, rxload 7/255
RTR-CIS2#sh int Gi0/1
Load for five secs: 4%/0%; one minute: 5%; five minutes: 5%
Time source is NTP, 14:54:19.497 MSK Tue Jul 14 2015
GigabitEthernet0/1 is up, line protocol is up (connected)
Description: << To backbone >>
MTU 1998 bytes, BW 1000000 Kbit, DLY 10 usec,
reliability 255/255, txload 1/255, rxload 3/255

Для того что бы изменить MTU на маршрутизаторах под управлением Cisco IOS используется команда интерфейс уровня:

R01(config)#interface gigabitEthernet 5/1
R01(config-if)#mtu 1532
R01(config-if)#exit

Чтобы транзитное устройство не дропало пакеты с малым MTU, необходимо, чтобы маршрутизатор прослушивал TCP SYN пакеты и подменять значения MSS анонсируемые конечным устройством

 

Какой у меня сейчас размер MTU

Предположим, что вы подключены к PON-сети какого-либо провайдера. Какой MTU используется в вашей сети? Проверить можно с помощью команды PING

ping [url] -f -l <размер_пакета>

Начинаем тест и перебираем значения до тех пор, пока не увидите, сообщение о необходимости фрагментации пакета.

Как видите, наш провайдер запрещает фрагментацию пакетов по умолчанию. Смещаем параметр на единицу и всё прошло. Получается, что наш оптимальный размер пакета  без фрагментации 1464 байта?

Это не совсем так. Размер 1456 байт — это еще не MTU. Это значение MSS. Дело в том, что Флаг -l в Windows-версии ping указывает не MTU, а размер ICMP Payload, т.е.чистую полезную нагрузку и не учитывает заголовки ICMP и IP.

Сейчас командой ping yandex.ru -f -l 1464 мы сгенерировали пакеты не 1464 байта, а 1492 байта, т.к. сюда добавляется ICMP заголовок (8 байт) и заголовок IP (20 байт). Как итог — наш оптимальный MTU — 1492 байта. Также нужно помнить, что DF (запрещающий/разрешающий фрагментацию) флаг пакета может быть модифицирован на транзитных маршрутизаторах

Чтобы посмотреть MTU на сетевой карте или беспроводном адаптере, выполните в командной строке команду netsh interface ipv4 show subinterfaces

В Windows открываем командную строку с правами администратора и выполняем команду:

netsh interface ipv4 show subinterfaces

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

netsh interface ipv4 set subinterface <имя_интерфейса> mtu=1450 store=persistent

Если необходимо сбросить настройки к исходному состоянию, выполняем команду:

netsh interface ipv4 reset

FIN.

Добавить комментарий

Ваш адрес email не будет опубликован.