7

Адаптер Ethernet моего компьютера использует 1500-байтовые кадры Ethernet. Обычно это означает, что MTU моего локального соединения составляет 1500 байт.

Но у моего (IPv4) подключения к Интернету есть некоторые накладные расходы. Это означает, что мой фактический MTU при связи с Интернетом составляет 1492 . Это вызывает все обычные проблемы, которые существуют с неправильно настроенным интерфейсом MTU.

Маршрутизатор может это исправить

Очевидно, я мог бы использовать netsh и переопределить свой сетевой интерфейс с помощью пользовательского MTU. Но я не хочу этого делать. DHCP-сервер моего маршрутизатора уже знает, что MTU равен 1492 . В ответ на запрос DHCP-сервер ответит параметром DHCP 26:

  • 26 MTU Interface = 1492

Так что это сводило меня с ума, почему сервер DHCP не сообщает моей машине с Windows 7 настройку MTU как один из элементов, которые он возвращает в предложении DHCP:

  • 54 Идентификатор сервера DHCP = 192.168.1.1
  • 51 Время аренды IP-адреса = 2 hours
  • 1 маска подсети = 255.255.255.0
  • 15 Доменное имя = example.local
  • 3 Router = 192.168.1.1
  • 6 Сервер доменных имен = 8.8.8.8 , 8.8.4.4 , 74.82.42.42

Нет интерфейса MTU ! Таким образом, Ethernet моей машины застрял на 1500 байт.

DHCP-сервер сделал то, что должен

Это заняло больше копания, но я понял, что DHCP-сервер дает только то, что просил клиент. Во время моего Windows 7 DHCP Discover Windows 7 перечисляет список всех параметров DHCP, которые он хотел бы вернуть:

  • 1 маска подсети
  • 15 Доменное имя
  • 3 роутера
  • 6 Сервер доменных имен
  • 44 NetBIOS через сервер имен TCP/IP
  • 46 NetBIOS через тип узла TCP/IP
  • 47 NetBIOS через область TCP/IP
  • 31 Выполните обнаружение маршрутизатора
  • 33 Статический маршрут
  • 121 Бесклассовый статический маршрут
  • 249 Бесклассовый статический маршрут (Microsoft)
  • 43 Информация о поставщике

Windows 7 даже не запрашивает MTU !

Он должен знать, что он делает

У Windows должна быть причина, почему она не запрашивает MTU; но я не знаю что это. Сначала я подумал, что это потому, что он использует Path Maximum MTU Discovery. Но PMTU работает только для соединений TCP, использует опцию TCP MSS (максимальный размер сегмента) и требует, чтобы локальная опция MSS была правильной.

В моем случае настройка TCP MSS (которая определяется параметром MTU) неверна. Это 1460 bytes

  1500 interface MTU
-   20 bytes IP header = 1480 bytes
-   20 bytes TCP header
= 1460 bytes MSS

что слишком высоко.

Примечание: я могу подтвердить, что Windows использует MSS из 1460 байтов из пакета SYN , когда устанавливается соединение TCP.

Если не PathMTU, то что?

О чем думает Windows 7? Каково предполагаемое поведение здесь? Что, по мнению разработчиков Microsoft, должно произойти в сети?

Теперь представьте, что мой MTU в Интернете на самом деле равен 1472 (что он есть), и представьте, что мой адаптер Ethernet фактически использует кадры Ethernet 8,192 байта (что он и делает). Что должна делать корпорация? Я должен подойти к каждой машине на предприятии и набрать:

>netsh interface ipv4 set interface interface="Local Area Connection" mtu=1472 store=persistent

Это не разумно. И даже если бы это было разумно, я не об этом спрашиваю.

Я пытаюсь понять, чего хочет Windows. Я пытаюсь понять, как это должно вести себя. Я пытаюсь узнать что-то здесь. Представьте, что мой интернет-шлюз - это 576-байтовый банкомат; Как я могу указать машинам Windows 7, что значение MTU, если они хотят отправить в Интернет, составляет 576 байт?

Бонус Чтение

1 ответ1

4

MTU пути не только TCP и не использует MSS (хотя, как вы и предполагали, MSS является производным от MTU). Любой переход, который получает пакет, слишком большой для пересылки, отправит пакет, ICMP fragmentation needed обратно к источнику. Это часть уровня 3 и не зависит от TCP.

Проблема с PMTU заключается в том, что входящие ICMP-пакеты часто отбрасываются или не пересылаются к источнику, и поэтому источник не знает, как уменьшить размер пакета.

Поскольку ваш маршрутизатор знает, что MTU следующего перехода - 1472, он должен отправлять пакеты PMTU вашим клиентам. Вы можете проверить это с помощью wireshark, и если он этого не делает, он нуждается в исправлении.

У вас есть пара обходных путей. Один из них - установить внутренний интерфейс MTU маршрутизатора на 1472, что будет означать, что он будет задействован до того, как маршрутизатор выполнит какую-либо обработку. Другой вариант (если вы можете сделать это с вашим маршрутизатором) - включить бит DF для каждого пакета. Это довольно жестокий обходной путь, так как любые полноразмерные пакеты будут заканчиваться как два отдельных пакета, один маленький, один большой, с результирующими издержками.

В корпоративной обстановке могут использоваться все три подхода, но жесткая настройка mtu на интерфейсе LAN маршрутизатора довольно распространена.

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

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