2009-09-08 11:24:00 +0000 2009-09-08 11:24:00 +0000
21
21

Как сказать, какой MTU используется в Windows XP?

Я страдаю от действительно странной проблемы, где я случайно получаю ошибки “Соединение с сервером было сброшено” при попытке доступа к веб-страницам (HTTP ошибка 12031 согласно инструменту диагностики сети Windows) - это происходит независимо от того, находится ли веб-страница, к которой я пытаюсь получить доступ, во внешнем интернете или даже если она от локального экземпляра Apache, запущенного на localhost. Это влияет на все компьютеры в нашей локальной сети (Ethernet, а не беспроводной), все из которых работают под управлением Windows XP.

Мне было подсказано, что это может быть связано с MTU, используемым в сетевом трафике. Если я сделаю Ping Test , чтобы найти самый большой пакет, который может пройти через фрагментированный, я могу пинговать локальный хост с пакетом в 1492 байта (+28 байт для заголовка?) и я могу пинговать наш роутер с пакетом в 1462 байта (что составляет 1490 байт, если вы включите 28 байтный заголовок). Если я попробую пинговать что-нибудь снаружи, например, Google, я не смогу получить ничего больше, чем 1430 (т.е. 1458 с заголовком).

я пытался следовать различным наборам инструкций по обновлению реестра Windows XP с этой настройкой MTU, обновляя HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{AdapterID}\MTU. Я не перепробовал ни одного конца альтернативных значений: наиболее очевидным правильным значением кажется 1490, но я также попробовал 1462, 1458, 1430 и т.д., и т.п. Когда я перезагружаю компьютер, чтобы изменение вступило в силу, он seems работает несколько минут (трудно сказать наверняка, так как он всегда случайный, а не последовательный), но это никогда не длится долго.

Первоначально, когда я пытался 1430 в качестве значения, после нескольких минут нормальной работы, результаты Ping-теста уменьшились бы на 28 байт - вдруг я обнаружил бы, что я смог получить только пакет 1402 байт через Google. Если бы я обновил значение реестра MTU до 1402, когда перезагрузился и подождал несколько минут, то это было бы 1374, затем 1346 и т.д. и т.п. и т.п. Другие компьютеры в сети оставались незатронутыми (все еще в 1430), и удаление параметра MTU из реестра восстановило бы все в нормальном состоянии (и все равно сломалось бы).

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

Кроме того, если у кого-нибудь есть идеи, как сказать, почему MTU продолжает падать на 28, это тоже было бы полезно (например, есть ли где-нибудь лог-файл Windows, где он будет записывать что-нибудь в тот момент, когда значение изменится?).

Наконец, если кто-нибудь может точно сказать мне, как сказать, какие настройки MTU я должен пытаться использовать, это было бы здорово!

Ответы (5)

58
58
58
2011-08-02 02:59:21 +0000

Для Windows 7, Windows Vista и Windows XP MTU для различных интерфейсов доступен из самой Windows с использованием netsh.

Windows 7, Windows Vista

Чтобы показать текущий MTU в Windows 7 или Windows Vista, воспользуйтесь интерпретатором команд:

C:\Users\Ian>netsh interface ipv6 show subinterfaces

       MTU MediaSenseState Bytes In Bytes Out Interface
---------- --------------- --------- --------- -------------
      1280 1 24321220 6455865 Local Area Connection
4294967295 1 0 1060111 Loopback Pseudo-Interface 1
      1280 5 0 0 isatap.newland.com
      1280 5 0 0 6TO4 Adapter

И для интерфейсов IPv4:

C:\Users\Ian>netsh interface ipv4 show subinterfaces

       MTU MediaSenseState Bytes In Bytes Out Interface
---------- --------------- --------- --------- -------------
      1500 1 146289608 29200474 Local Area Connection
4294967295 1 0 54933 Loopback Pseudo-Interface 1

Note: В данном примере мой интерфейс Local Area Connection IPv6 имеет такой низкий MTU (1280), потому что я использую туннельную службу для получения IPv6-подключения .

Вы также можете изменить свой MTU (Windows 7, Windows Vista). Из командной строки elevated:

>netsh interface ipv4 set subinterface "Local Area Connection" mtu=1492 store=persistent
Ok.

Tested with Windows 7 Service Pack 1

Windows XP

Синтаксис netsh для Windows XP немного отличается:

C:\Users\Ian>netsh interface ip show interface

Index: 1
User-friendly Name: Loopback
Type: Loopback
MTU: 32767
Physical Address:                       

Index: 2
User-friendly Name: Local Area Connection
Type: Etherenet
MTU: 1500
Physical Address: 00-03-FF-D9-28-B7

Заметка: ** Windows XP требует, чтобы служба **маршрутизации и удаленного доступа была запущена, прежде чем вы сможете увидеть подробную информацию о интерфейсе (включая MTU): 0x2 и 0x2 и 0x1 и 0x2 и 0x2 и 0x2 и Windows XP не предоставляет способ изменить настройки MTU с 0x6 и 0x2. Для этого вы можете:

Tested with Windows XP Service Pack 3

См. также


Краткая дискуссия о том, что такое MTU, откуда идет 28 байт.

Ваша сетевая карта (Ethernet) имеет максимальный размер пакета netsh:

C:\Users\Ian>net start remoteaccesss

IP-адрес TCP/IP требует 20-байтного заголовка (12 байт флагов, 4 байта для IP-адреса источника, 4 байта для IP-адреса получателя). Это оставляет меньше места в пакете:

+---------+
| 1500 |
| byte |
| payload |
| |
| |
| |
+---------+

Теперь ICMP (ping) пакет имеет 8-байтный заголовок (1 байт 1,500 bytes, 1 байт type, 2 байта code, 4 байта дополнительных данных):

+------------------------+
| 12 bytes control flags | \
| 4 byte from address | |- IP header: 20 bytes
| 4 byte to address | /
|------------------------|
| 1480 byte payload |
| |
| |
| |
+------------------------+

Вот где “недостающие” 28 байт - это размер заголовков, необходимых для отправки ping пакета.

Когда вы посылаете ping пакет, вы можете указать, сколько данных extra полезной нагрузки вы хотите включить. В этом случае, если вы включите все 1472 байта:

+------------------------+
| 12 bytes control flags | \
| 4 byte from address | |
| 4 byte to address | |- IP and ICMP header: 28 bytes
|------------------------| |
| 8 byte ICMP header | /
|------------------------|
| 1472 byte payload |
| |
| |
| |
+------------------------+

Тогда результирующий ethernet пакет будет полон до жабргонов. Будет заполнен каждый последний байт пакета размером 1500 байт:

>ping -l 1472 obsidian

Если вы попытаетесь послать one more byte

+------------------------+
| 12 bytes control flags | \
| 4 byte from address | |
| 4 byte to address | |- IP and ICMP header: 28 bytes
|------------------------| |
| 8 byte ICMP header | /
|------------------------|
|........................|
|........................|
|. 1472 bytes of junk....|
|........................|
|........................|
|........................|
|........................|
+------------------------+

сеть должна будет фрагментировать этот 1501-байтовый пакет на несколько пакетов:

>ping -l 1473 obsidian

Эта фрагментация произойдет за кулисами, в идеале без вашего ведома.

Но вы можете быть подлым и сказать сети, что пакет не может быть фрагментирован:

Packet 1 of 2
+------------------------+
| 20 bytes control flags | \
| 4 byte from address | |
| 4 byte to address | |- IP and ICMP header: 28 bytes
|------------------------| |
| 8 byte ICMP header | /
|------------------------|
|........................|
|........................|
|..1472 bytes of payload.|
|........................|
|........................|
|........................|
|........................|
+------------------------+

Packet 2 of 2
+------------------------+
| 20 bytes control flags | \
| 4 byte from address | |
| 4 byte to address | |- IP and ICMP header: 28 bytes
|------------------------| |
| 8 byte ICMP header | /
|------------------------|
|. |
| 1 byte of payload |
| |
| |
| |
| |
| |
+------------------------+

Флаг -f означает do not fragmgment. Теперь, когда вы пытаетесь отправить пакет, который не помещается в сети, вы получаете ошибку:

>ping -l 1473 -f obsidian

Пакет должен быть фрагментирован, но установлен флаг Do not Fragment.

Если где-то в линии пакет должен быть фрагментирован, сеть на самом деле посылает ICMP пакет, говорящий вам, что произошла фрагментация. Ваша машина получает этот ICMP пакет, получает информацию о самом большом размере и должна перестать посылать пакеты слишком большого размера. К сожалению, большинство брандмауэров блокируют эти ICMP пакеты “Path MTU discovery”, поэтому ваша машина никогда не понимает, что пакеты фрагментируются (или, что еще хуже: отсылаются, потому что не могут быть фрагментированы).

Это то, что заставляет веб-сервер не работать. Вы можете получить начальные небольшие (<1280 байт) ответы, но большие пакеты не могут пройти. А брандмауэры веб-сервера неправильно настроены, блокируя ICMP пакеты. Поэтому веб-сервер не понимает, что вы так и не получили пакет.

Фрагментация пакетов не разрешена в IPv6, все required, чтобы (правильно) разрешить ICMP mtu-пакеты обнаружения.

8
8
8
2011-11-07 19:52:04 +0000

Я не уверен, что netsh на самом деле показывает используемый в настоящее время MTU. На моей машине Windows XP Pro SP3 я выполнил netsh interface ip show interface, и она сообщила значение MTU для соответствующего интерфейса как 1500. Затем я добавил следующие ключи реестра:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\EnablePMTUDiscovery
    value: 0

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{ID}\MTU 
    value: various (e.g. 1200)

В Microsoft говорят что установка значения EnablePMTUDiscovery на 0 установит MTU на 576.

Установка записи реестра MTU устанавливает MTU вручную. Я попробовал несколько значений для записи MTU (перезагрузка каждый раз).

В обоих случаях – добавляя первую запись, затем вторую – netsh все равно сообщает MTU как 1500. Тестирование с помощью ping подтвердило (или, по крайней мере, предположило), что значение MTU, настроенное в реестре, на самом деле использовалось.

Также, когда я впервые попробовал это на своей машине, служба маршрутизации и удаленного доступа была отключена, поэтому я не смог запустить ее с помощью ваших инструкций. Я включил ее, перейдя в Панель управления > Администрирование > Управление компьютером > Службы и приложения > Службы. Я изменил “Тип запуска” с “Отключен” на “Вручную”. Затем я также запустил службу из этого диалога.

я также не уверен, что KB283165 обязательно является правильной инструкцией по изменению MTU. Разве эти инструкции не относятся только к запуску клиента Windows PPPoE? Если подключение к Интернету через маршрутизатор, где маршрутизатор является PPPoE клиентом (как в моем случае), эти инструкции не будут иметь отношения к делу, не так ли?

Инструкции, которым я следовал, что привело меня к внесению вышеуказанных изменений в реестр, были в KB900926: Рекомендуемые TCP/IP настройки для WAN-соединений с размером MTU менее 576 (методы 2 и 3).


Правка @ian

Похоже, вы правы. Настройтесь на 1200, но netsh сообщает 1500.

>ping -l 1173 -f obsidian

Packet needs to be fragmented but DF set.

Так что, наверное, ответ на исходный вопрос заключается в том, что в Windows XP вы должны использовать пробную версию с флагом Do not fragmgment, чтобы найти самый большой пакет, который вы можете отправить. Тогда у вас есть ваш MTU.

2
2
2
2009-09-08 11:47:58 +0000

Вы можете найти MTU, используя ping с методом проб и ошибок:

ping <address> -f -l nnnn

-f : Указывает, что сообщения Echo Request отправляются с флагом Don’t Fragment в IP-заголовке, установленном в 1. Сообщение Echo Request не может быть фрагментировано маршрутизаторами в пути к месту назначения. Этот параметр полезен для поиска и устранения неисправностей пути Максимальный блок передачи (PMTU).

-l Размер: Указание длины в байтах поля “Данные” в отправленном сообщении “Эхозапрос”. По умолчанию - 32. Максимальный размер 65 527.

Вы получите сообщения “Пакет должен быть фрагментирован, но установлен DF”, когда длина будет слишком большой.

1
1
1
2009-09-08 11:28:05 +0000

Microsoft KB314496: Размеры MTU по умолчанию для различных сетевых топологий .
Вам не следует пытаться играть с конфигурацией MTU в обычных сетевых настройках.

Здесь есть VB код ссылки .
Есть также инструмент под названием DrTCP :


В реестре,

  • Переходим к HKLM\Software\Microsoft\Windows NT\CurrentVersion\NetworkCards
  • Открываем интересующий вас адаптер
  • Скопируем строку ServiceName
  • Ищем эту строку в HKLM\System; вам подойдет ключ NetCfgInstanceId
  • Немного выше будет ключ MaxFrameSize (мой показывает 1514)

Также есть способ изменить это с помощью команды netsh.

Также проверьте вашу Path MTU Discovery configuration .

1
1
1
2009-09-08 11:41:12 +0000

См. раздел AdapterWatch :

AdapterWatch отображает полезную информацию о ваших сетевых адаптерах: IP-адреса, Аппаратный адрес, WINS-серверы, DNS-серверы, значение MTU, количество полученных или отправленных байтов, текущая скорость передачи данных и многое другое. Кроме того, он отображает общую статистику TCP/IP/UDP/ICMP для вашего локального компьютера.

Похожие вопросы

3
9
13
5
16