Адаптер 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 байт?