Як сказати, що MTU використовується в Windows XP


21

Я страждаю від дійсно дивної проблеми, коли я випадково отримую помилки "З'єднання з сервером було скинуто" під час спроби отримати доступ до веб-сторінок (помилка HTTP 12031 відповідно до інструмента діагностики мережі Windows) - це відбувається незалежно від того, веб-сторінка Я намагаюся отримати доступ у зовнішньому Інтернеті або навіть якщо це з локального екземпляра Apache, який працює на localhost. Це впливає на всі комп’ютери нашої локальної мережі (Ethernet, не бездротові), усі вони працюють під керуванням Windows XP.

Мені було запропоновано, що це може бути пов'язано з MTU, який використовується для мережевого трафіку. Якщо я роблю тест Ping, щоб дізнатися про найбільший пакет, який може пройти нефрагментований, я можу пінг локального хосту з пакетом 1492 байта (+28 байт для заголовка?), І я можу пінг наш маршрутизатор з пакетом 1462 байти (що становить 1490 байт, якщо включити заголовок 28 байт). Якщо я спробую і надішлю щось із зовнішньої сторони, як Google, я не можу отримати нічого більше, ніж 1430 (це 1458 із заголовком).

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

Спочатку, коли я пробував 1430 як значення, після декількох хвилин роботи, результати тесту Ping зменшились би на 28 байт - раптом я виявив, що мені вдалося отримати лише пакет з 1402 байтів до Google. Якщо я оновив налаштування реєстру MTU до 1402, коли я перезавантажився і зачекав кілька хвилин, це буде 1374, потім 1346 і т. Д. І т.д. Інші комп'ютери в мережі залишилися без змін (досі в 1430) і видалили налаштування MTU з реєстру відновили б речі в нормі (і досі порушені).

Справа в тому, що мені все важче поставити діагноз - це те, що дуже важко сказати, чи я навіть граю з правильним налаштуванням реєстру. Тож найпростіше моє запитання було б: Як я можу сказати, яку налаштування MTU намагається використовувати Windows?

Крім того, якщо у когось є ідеї, як сказати, чому MTU продовжує падати на 28, це також було б корисно (наприклад, чи є десь файл журналу Windows, де він щось запише в точку, де змінюється значення?)

Нарешті, якщо хтось може остаточно підказати мені, як сказати, яку настройку MTU я повинен намагатися використовувати, це було б чудово!


FWIW, врешті-решт, це була хитра телефонна лінія. Коли я підключив телефон, тону набору не було.
andygeers

Відповіді:


58

Для 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

Примітка. У цьому прикладі мій інтерфейс IPv6 локального з’єднання має такий низький MTU (1280), оскільки я використовую тунельну послугу для отримання з'єднання IPv6 .

Ви також можете змінити MTU (Windows 7, Windows Vista). З підвищеного командного рядка:

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

Тестовано з пакетом оновлень 1 для Windows 7

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):

C:\Users\Ian>net start remoteaccesss

Windows XP не забезпечує спосіб змінити налаштування MTU зсередини netsh. Для цього ви можете:

Тестовано з пакетом оновлення 3 для Windows XP

Дивись також


Коротке обговорення того, що таке MTU, звідки походить 28 байт.

Ваша мережева карта (Ethernet) має максимальний розмір пакета 1,500 bytes:

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

Для IP-частини TCP / IP потрібен 20-байтний заголовок (12 байт прапорів, 4 байти для вихідної IP-адреси, 4 байти для IP-адреси призначення). Це залишає менше місця в пакеті:

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

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

+------------------------+
| 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      |
|                        |
|                        |
|                        |
+------------------------+

Ось тут "пропущені" 28 байт - це розмір заголовків, необхідних для надсилання пакета ping.

Відправляючи пакет ping, ви можете вказати, скільки додаткових даних корисного навантаження ви хочете включити. У цьому випадку, якщо ви включите всі 1472 байти:

>ping -l 1472 obsidian

Тоді отриманий пакет Ethernet буде наповнений зябрами. Кожен останній байт 1500-байтного пакету буде заповнений:

+------------------------+
| 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....|
|........................|
|........................|
|........................|
|........................|
+------------------------+

Якщо ви спробуєте надіслати ще один байт

>ping -l 1473 obsidian

мережа повинна буде фрагментувати цей пакет 1501 байт на кілька пакетів:

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      |
|                        |
|                        |
|                        |
|                        |
|                        |
+------------------------+

Ця фрагментація відбудеться за лаштунками, в ідеалі, не знаючи.

Але ви можете бути злісними і сказати мережі, що пакет не може бути фрагментований:

>ping -l 1473 -f obsidian

У -f означає прапор НЕ фрагментировать . Тепер, коли ви намагаєтесь надіслати пакет, який не вміщується в мережі, ви отримуєте помилку:

>ping -l 1473 -f obsidian  

Packet needs to be fragmented but DF set.

Пакет потрібно фрагментувати, але прапор Do not Fragment був встановлений.

Якщо десь уздовж лінії потрібен фрагментарний пакет, мережа насправді надсилає пакет ICMP, який повідомляє вам, що трапилася фрагментація. Ваша машина отримує цей пакет ICMP, повідомляється про те, який був найбільший розмір, і повинен припинити надсилання пакетів занадто великим. На жаль, більшість брандмауерів блокують ці ICMP-пакети "Відкриття Шляху MTU", тому Ваша машина ніколи не усвідомлює, що пакети фрагментовані (або ще гірше: випали, тому що їх не вдалося фрагментувати).

Ось чому веб-сервер не працює. Ви можете отримати початкові невеликі (<1280 байт) відповіді, але більші пакети не можуть пройти. І брандмауери веб-сервера неправильно налаштовані, блокуючи пакети ICMP. Таким чином, веб-сервер не розуміє, що ви ніколи не отримали пакет.

Фрагментація пакетів заборонена в IPv6, кожен повинен (правильно) дозволити пакети виявлення ICMP mtu.


8

@ian Я не дуже впевнений, що 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 заявляє, що для параметра EnablePMTUDiscovery0 буде встановлено значення 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 вам потрібно використовувати пробну і помилку з прапором " Не фрагментуйте", щоб знайти найбільший пакет, який ви можете надіслати. Тоді у вас є свій MTU.


2

Ви можете знайти MTU за допомогою ping із методом проб та помилок:

ping <address> -f -l nnnn

Пінг :

-f: Вказує, що повідомлення Echo Request надсилаються із прапором Don't Fragment у заголовку IP, встановленому на 1. Повідомлення Echo Request не може бути фрагментоване маршрутизаторами на шляху до пункту призначення. Цей параметр корисний для усунення неполадок шляху максимальної передачі (PMTU).

-l Розмір: Вказує довжину в байтах поля Дані в надісланих повідомленнях Echo Request. За замовчуванням - 32. Максимальний розмір - 65 527.

Ви отримаєте повідомлення "Пакет потрібно фрагментарно, але встановити DF", коли довжина занадто велика.


Це те, що я робив вище, коли згадував про "Пінг-тест"
andygeers

1

Див. AdapterWatch :

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


1

Microsoft KB314496: розміри MTU за замовчуванням для різних мережевих топологій .
Не слід намагатися грати з конфігурацією MTU у звичайних мережних налаштуваннях.

Тут є посилання на код VB .
Також є інструмент під назвою DrTCP :

alt текст


У реєстрі

  • Йти до HKLM\Software\Microsoft\Windows NT\CurrentVersion\NetworkCards
  • Відкрийте адаптер, який вас цікавить
  • Скопіюйте ServiceNameрядок
  • Шукайте в цьому рядку HKLM\System; ти відповідатимеш NetCfgInstanceIdключем
  • Трохи вище, що буде MaxFrameSizeключовим (шахта показує 1514)

Існує також спосіб змінити це за допомогою netshкоманди.

Також перевірте свою конфігурацію Path MTU Discovery .


Дякую за це, але в ідеалі я був би більш заспокоєний, якби я міг змусити Windows насправді сказати мені, що MTU він насправді використовує, а не просто те, що ви очікуєте за замовчуванням. Можливо, це не можливо :-(
andygeers
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.