1

Я просто пытаюсь разобраться с MTU, MRU и MSS.

Мой интерес изначально исходил из ответа на этот пост: Угроза безопасности PING?:

НЕОБХОДИМО блокировать некоторые типы пакетов ICMP, в частности, сообщение ICMP "пункт назначения недоступен", поскольку блокирование этого сообщения нарушает обнаружение MTU пути, а симптомы состоят в том, что пользователи DSL (за уровнем PPPoE, который ограничивает MTU до 1492 байтов) не могут получить доступ к веб-сайтам, которые блокировать эти пакеты (если они не используют веб-прокси, предоставленный их провайдером).

С тех пор я нашел эту статью, которая подтверждает это:

Некоторые люди, использующие веб-серверы (особенно некоторые банки), настраивают свою сеть так, чтобы они блокировали сообщение об ошибке, которое отправляется обратно, когда пакет слишком велик. Это было бы неплохо, если бы они также не пытались отправлять 1500 байт-пакетов с установленным битом DF. В результате пакет отбрасывается, когда он попадает на канал длиной менее 1500 MTU и должен повторить попытку. В конце концов он может попробовать меньший размер пакета, но это может быть через 20 секунд. Это глупая настройка сети со стороны человека, работающего с веб-сервером.

Мой вопрос: действительно ли это реальная проблема? Насколько я знаю, я никогда не видел, чтобы это случилось на моем соединении BT Infinity, которое использует PPPoE. Предположительно это имеет те же ограничения, что и упомянутые выше (мой MTU маршрутизатора установлен на 1492).

Может ли это быть мой маршрутизатор, использующий MSS-зажим?

1 ответ1

5

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. Байты 1-1480, MF: 1, FO: 0
  2. Байты 1481-2560, MF: 1, FO: 1480
  3. Байты 2561-4440, MF: 1, FO: 2560
  4. Байты 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. Байты 1-1180, MF: 1, FO: 0
  2. Байты 1181-2360, MF: 1, FO: 1180
  3. Байты 2361-3540, MF: 1, FO: 2360
  4. Байты 3541-4720, MF: 1, FO: 3540
  5. Байты 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. Байты 1-1180, MF: 1, FO: 0
  2. Байты 1181-1480, MF: 1, FO: 1180
  3. Байты 1481-2260, MF: 1, FO: 1480
  4. Байты 2261-2560, MF: 1, FO: 2260
  5. Байты 2561-4140, MF: 1, FO: 2560
  6. Байты 4141-4440, MF: 1, FO: 4140
  7. Байты 4441-5000, MF: 0, FO: 4440

Обратите внимание, что на этот раз фрагменты не равны. Датаграммы не рекомбинируются и снова оптимально фрагментируются в промежуточных узлах, выполняется только фрагментация.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .