MTU обозначает максимальную единицу передачи, т.е. ограничение размера IP датаграммы (в байтах). Максимальное значение MTU по умолчанию для Ethernet составляет 1500.
Давайте представим, что у нас есть сеть, подобная приведенной ниже. C является клиентом; S является сервером; X и Y - маршрутизаторы.
___ ___ ___ ___
| C | | X | | Y | | S |
|___|========|___|--------|___|========|___|
Между C и S имеется четыре сети. В трех из них максимальное значение MTU составляет 1500, а в одной - более низкое значение MTU, равное 1200 (только пример). Сеть с низким MTU отмечена тире.
C пытается найти MTU пути на пути к S. Он отправляет дейтаграмму IP с заголовком 20 B и полезной нагрузкой 1480 B, всего 1500 B. Флаг Не фрагментировать (DF) устанавливается в заголовке IP.
Дейтаграмма достигает X. X пытается передать его дальше Y, но Y отвечает сообщением ICMP, необходимым для фрагментации, потому что его MTU слишком низок и установлен флаг DF. C получает это сообщение и узнает, что MTU пути меньше 1500. Затем он повторяет попытку с меньшей полезной нагрузкой, каждый раз получая необходимую фрагментацию, пока размер полезной нагрузки не достигнет 1180 B. 1180 + 20 = 1200, поэтому дейтаграмма в конце концов успешно достигает S и обнаруживается MTU пути.
PMTUD работает, только если Y отвечает с фрагментацией необходимыми сообщениями ICMP. В противном случае C не узнает, что датаграмма была отброшена.
Ваш маршрутизатор отправляет правильные сообщения ICMP, все работает, как задумано, нет никаких причин, по которым Интернет может быть нарушен из-за более низкого MTU.
Что произойдет, если PMTUD не работает? (например, из-за того, что ICMP заблокирован в любом направлении)
Ни один конец соединения на самом деле не должен знать MTU пути. Протокол IP может справиться с этим. Это может быть неоптимальным, но это будет работать.
IP способен передавать полезную нагрузку любого размера, независимо от того, каков MTU пути. Это свойство обеспечивается моделью OSI: IP работает на уровне 3. Уровень 4 не должен заботиться о базовом протоколе, поэтому на полезную нагрузку нельзя накладывать ограничения по размеру.
Основной IP-заголовок имеет длину 20 байтов. В этот заголовок включены два интересных флага: Не фрагментировать (DF) и Больше фрагментов (MF), а также поле смещения фрагмента (FO). Я уже упоминал размер заголовка 20 B и флаг DF раньше. (Я говорю о заголовке IPv4, IPv6 отличается)
IP способен разбивать большую полезную нагрузку на фрагменты и собирать ее в месте назначения.
Допустим, мы хотим передать полезную нагрузку 5000 B от C к D, которые оба находятся в одной сети (т. Е. Подключены через коммутатор или концентратор). MTU сетевых карт C и D составляет 1500. Заголовок каждого фрагмента имеет длину 20 B, поэтому максимальный размер данных для одной дейтаграммы составляет 1480 B (1500 - 20). Полезная нагрузка будет отправлена в 4 дейтаграммах: (MF - больше фрагментов, FO - смещение фрагмента)
- Байты 1-1480, MF: 1, FO: 0
- Байты 1481-2560, MF: 1, FO: 1480
- Байты 2561-4440, MF: 1, FO: 2560
- Байты 4441-5000, MF: 0, FO: 4440
Флаг DF в данном случае не имеет значения. MF равно 0 для последнего фрагмента, 1 в противном случае. FO - смещение первого байта во фрагменте (смещения индексируются, начиная с 0). Эти дейтаграммы будут автоматически собраны на целевой сетевой карте.
Теперь C хочет отправить полезную нагрузку 5000 B на S. Предположим, что он магически знает MTU пути (или NIC C настроен с MTU = 1200, поэтому C отправляет 1200 B дейтаграмм). Это фрагментирует полезную нагрузку следующим образом:
- Байты 1-1180, MF: 1, FO: 0
- Байты 1181-2360, MF: 1, FO: 1180
- Байты 2361-3540, MF: 1, FO: 2360
- Байты 3541-4720, MF: 1, FO: 3540
- Байты 4721-5000, MF: 0, FO: 4720
Это наиболее оптимальная фрагментация полезной нагрузки.
Если C не знает и не может определить MTU пути, он должен полагаться на промежуточные узлы, чтобы правильно фрагментировать полезную нагрузку. C имеет MTU = 1500, поэтому он отправляет 4 дейтаграммы, как показано в примере C → D выше. Однако эти дейтаграммы должны быть снова фрагментированы для передачи через соединение X-Y. Каждая датаграмма, полученная Y, должна иметь длину не более 1200 B, поэтому дейтаграммы длиной 1500 B будут разбиты на две части: 1200 B и 320 B (дополнительно 20 B для второго заголовка). Эта фрагментация приводит к передаче 7 дейтаграмм (и, следовательно, 7 заголовков) от X к S вместо оптимальных 5:
- Байты 1-1180, MF: 1, FO: 0
- Байты 1181-1480, MF: 1, FO: 1180
- Байты 1481-2260, MF: 1, FO: 1480
- Байты 2261-2560, MF: 1, FO: 2260
- Байты 2561-4140, MF: 1, FO: 2560
- Байты 4141-4440, MF: 1, FO: 4140
- Байты 4441-5000, MF: 0, FO: 4440
Обратите внимание, что на этот раз фрагменты не равны. Датаграммы не рекомбинируются и снова оптимально фрагментируются в промежуточных узлах, выполняется только фрагментация.
На практике промежуточные маршрутизаторы могут быть настроены так, чтобы самим отказываться от выполнения фрагментации и требовать, чтобы конечные точки передачи использовали оптимальный MTU, поэтому на фрагментацию промежуточного узла не следует полагаться. PMTUD является предпочтительным.