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

Jak sprawdzić jakie MTU jest używane w Windows XP

Cierpię z powodu naprawdę dziwnego problemu, w którym losowo dostaję błędy “Połączenie z serwerem zostało zresetowane” podczas próby dostępu do stron internetowych (błąd HTTP 12031 zgodnie z narzędziem diagnostycznym sieci Windows) - dzieje się tak niezależnie od tego, czy strona internetowa, do której próbuję uzyskać dostęp, znajduje się w zewnętrznym Internecie, czy nawet pochodzi z lokalnej instancji Apache działającej na localhost. Dotyczy to wszystkich komputerów w naszej sieci lokalnej (Ethernet, nie bezprzewodowej), z których wszystkie pracują pod kontrolą systemu Windows XP.

Zasugerowano mi, że może to być związane z MTU używanym w ruchu sieciowym. Jeśli wykonam test ping , aby znaleźć największy pakiet, który może przejść bez fragmentacji, mogę pingować localhost z pakietem 1492 bajtów (+28 bajtów dla nagłówka?) i mogę pingować nasz router z pakietem 1462 bajtów (co daje 1490 bajtów, gdy uwzględnimy 28-bajtowy nagłówek). Jeśli spróbuję pingować coś na zewnątrz, jak Google, nie mogę uzyskać nic większego niż 1430 (co jest 1458 z nagłówkiem).

Próbowałem postępować zgodnie z różnymi zestawami instrukcji, aby zaktualizować rejestr Windows XP z tym ustawieniem MTU, aktualizując HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{AdapterID}\MTU. Próbowałem bez końca alternatywnych wartości: najbardziej oczywistą poprawną wartością wydaje się być 1490, ale próbowałem też 1462, 1458, 1430, itd. itp. Kiedy ponownie uruchamiam komputer, aby zmiana zaczęła obowiązywać, to wydaje się działać przez kilka minut (trudno powiedzieć na pewno, ponieważ zawsze jest to losowe, a nie spójne), ale nigdy nie trwa długo.

Początkowo, gdy próbowałem 1430 jako wartość, po kilku minutach pracy w porządku, wyniki testu pingowego zmniejszyłyby się o 28 bajtów - nagle odkryłbym, że mogę tylko uzyskać pakiet 1402 bajtów do Google. Gdybym zaktualizował ustawienie MTU w rejestrze do 1402, po ponownym uruchomieniu i odczekaniu kilku minut, byłoby to 1374, potem 1346, itd. itd. Inne komputery w sieci pozostały nienaruszone (wciąż na poziomie 1430), a usunięcie ustawienia MTU z rejestru przywróciłoby rzeczy do normy (i wciąż zepsute).

Rzeczą, która jest dla mnie najtrudniejsza w diagnozowaniu tego wszystkiego, jest to, że bardzo trudno jest stwierdzić, czy bawię się nawet z poprawnym ustawieniem rejestru. Tak więc w najprostszym przypadku moje pytanie brzmiałoby: **Jak mogę stwierdzić, jakiego ustawienia MTU próbuje użyć Windows?

Ponadto, jeśli ktoś ma jakiś pomysł, jak stwierdzić, dlaczego MTU spada o 28, to również byłoby przydatne (np. czy istnieje gdzieś plik dziennika Windows, w którym zapisuje on coś w momencie zmiany wartości)?

Wreszcie, jeśli ktokolwiek może mi powiedzieć, jak ostatecznie określić, jakie ustawienie MTU powinienem próbować zastosować, byłoby wspaniale!

Odpowiedzi (5)

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

W systemach Windows 7, Windows Vista i Windows XP, MTU dla różnych interfejsów jest dostępne w samym systemie Windows przy użyciu netsh.

Windows 7, Windows Vista

Aby pokazać aktualne MTU w Windows 7 lub Windows Vista, z wiersza poleceń:

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

A dla interfejsów 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

Uwaga: W tym przykładzie mój interfejs Local Area Connection IPv6 ma tak niskie MTU (1280), ponieważ używam usługi tunelowej, aby uzyskać połączenie IPv6 .

Możesz również zmienić swoje MTU (Windows 7, Windows Vista). Z poziomu wyniesionego wiersza poleceń:

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

Testowane z Windows 7 Service Pack 1

Windows XP

Składnia netsh dla Windows XP jest nieco inna:

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

Uwaga: ** Windows XP wymaga, aby usługa **Routing and Remote Access była uruchomiona, zanim będzie można zobaczyć szczegóły dotyczące interfejsu (w tym MTU):

C:\Users\Ian>net start remoteaccesss

Windows XP nie udostępnia sposobu na zmianę ustawienia MTU z poziomu netsh. W tym celu można:

Testowane z Windows XP Service Pack 3

Zobacz także


Krótkie omówienie czym jest MTU, skąd się bierze 28 bajtów.

Twoja karta sieciowa (Ethernet) ma maksymalny rozmiar pakietów 1,500 bytes:

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

Część IP w TCP/IP wymaga 20 bajtowego nagłówka (12 bajtów flag, 4 bajty na źródłowy adres IP, 4 bajty na docelowy adres IP). To pozostawia mniej wolnego miejsca w pakiecie:

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

Teraz pakiet ICMP (ping) ma 8-bajtowy nagłówek (1 bajt type, 1 bajt code, 2 bajty checksum, 4 bajty danych dodatkowych):

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

To właśnie tam jest “brakujące” 28 bajtów - jest to rozmiar nagłówków wymaganych do wysłania pakietu ping.

Kiedy wysyłasz pakiet ping, możesz określić, jak dużo dodatkowych danych payload chcesz dołączyć. W tym przypadku, jeśli dołączymy wszystkie 1472 bajty:

>ping -l 1472 obsidian

Wtedy wynikowy pakiet ethernet będzie wypełniony po brzegi. Każdy ostatni bajt z 1500 bajtowego pakietu będzie wypełniony:

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

Jeśli spróbujesz wysłać jeden bajt więcej

>ping -l 1473 obsidian

sieć będzie musiała pofragmentować ten 1501-bajtowy pakiet na wiele pakietów:

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

Ta fragmentacja odbędzie się za kulisami, najlepiej bez wiedzy użytkownika.

Ale możesz być złośliwy i powiedzieć sieci, że pakiet nie może być fragmentowany:

>ping -l 1473 -f obsidian

Flaga -f oznacza nie fragmentuj. Teraz, gdy próbujesz wysłać pakiet, który nie mieści się w sieci, otrzymujesz błąd:

>ping -l 1473 -f obsidian  

Packet needs to be fragmented but DF set.

Pakiet wymaga fragmentacji, ale ustawiono flagę Do not Fragment.

Jeśli w którymkolwiek miejscu na linii pakiet wymagał fragmentacji, sieć faktycznie wysyła pakiet ICMP informujący, że doszło do fragmentacji. Twoja maszyna otrzymuje ten pakiet ICMP, dowiaduje się jaki był największy rozmiar i powinna przestać wysyłać zbyt duże pakiety. Niestety większość firewalli blokuje te pakiety ICMP “Path MTU discovery”, więc twoja maszyna nigdy nie zdaje sobie sprawy, że pakiety są fragmentowane (lub co gorsza: porzucane, ponieważ nie mogły być fragmentowane).

To właśnie powoduje, że web-serwer nie działa. Możesz uzyskać początkowe małe (<1280 bajtów) odpowiedzi, ale większe pakiety nie mogą się przedostać. A firewall serwera WWW jest źle skonfigurowany, blokując pakiety ICMP. Więc serwer nie wie, że nie otrzymałeś pakietu.

Fragmentacja pakietów nie jest dozwolona w IPv6, każdy jest wymagany do (prawidłowego) zezwalania na pakiety ICMP mtu discovery.

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

@ian Nie jestem pewien, czy netsh rzeczywiście pokazuje aktualnie używane MTU. Na mojej maszynie Windows XP Pro SP3, wykonałem netsh interface ip show interface i zgłosił on wartość MTU dla odpowiedniego interfejsu jako 1500. Następnie dodałem następujące klucze rejestru:

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 twierdzi że ustawienie EnablePMTUDiscovery na 0 spowoduje ustawienie MTU na 576.

Ustawienie wpisu w rejestrze MTU ustawia MTU ręcznie. Próbowałem kilku wartości dla wpisu MTU (za każdym razem restartując komputer).

W obu przypadkach - dodanie pierwszego wpisu, a następnie drugiego wpisu - netsh nadal zgłaszał MTU jako 1500. Testowanie za pomocą ping potwierdziło (lub przynajmniej zasugerowało), że wartość MTU skonfigurowana w rejestrze jest rzeczywiście używana.

Ponadto, kiedy pierwszy raz próbowałem tego na moim komputerze, usługa Routing i Zdalny Dostęp była wyłączona, więc nie mogłem jej uruchomić używając twoich instrukcji. Włączyłem ją przechodząc do Panelu sterowania ®> Narzędzia administracyjne ®> Zarządzanie komputerem ®> Usługi i aplikacje ®> Usługi. Zmieniłem “Typ uruchamiania” z Wyłączone na Ręczne. Następnie uruchomiłem usługę również z tego okna dialogowego.

Nie jestem też pewien, czy KB283165 jest koniecznie poprawną instrukcją do zmiany MTU. Czy te instrukcje nie są istotne tylko przy uruchamianiu klienta Windows PPPoE? Jeśli łączę się z Internetem przez router, gdzie router jest klientem PPPoE (jak w moim przypadku), te instrukcje nie byłyby istotne, prawda?

Instrukcje, które zastosowałem, a które doprowadziły mnie do wprowadzenia powyższych zmian w rejestrze, znajdowały się w KB900926: Zalecane ustawienia TCP/IP dla łączy WAN o rozmiarze MTU mniejszym niż 576 (metody 2 i 3).


Edit by @ian

Wygląda na to, że masz rację. Skonfiguruj dla 1200, ale netsh zgłasza 1500.

>ping -l 1173 -f obsidian

Packet needs to be fragmented but DF set.

Więc zgaduję, że odpowiedź na oryginalne pytanie jest taka, że w Windows XP musisz użyć metody prób i błędów z flagą Do not fragment, aby znaleźć największy pakiet jaki możesz wysłać. Wtedy masz swoje MTU.

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

Możesz znaleźć MTU używając ping metodą prób i błędów:

ping <address> -f -l nnnn

-f : Określa, że wiadomości Echo Request są wysyłane z flagą Don’t Fragment w nagłówku IP ustawioną na 1. Wiadomość Echo Request nie może być fragmentowana przez routery na ścieżce do miejsca docelowego. Ten parametr jest przydatny do rozwiązywania problemów z maksymalną jednostką transmisyjną ścieżki (PMTU).

-l Size : Określa długość, w bajtach, pola Data w wysyłanych wiadomościach Echo Request. Domyślnie jest to 32. Maksymalny rozmiar to 65,527.

Otrzymasz wiadomości “Packet needs to be fragmented but DF set” kiedy długość jest zbyt duża.

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

Microsoft KB314496: Domyślne rozmiary MTU dla różnych topologii sieci ](http://support.microsoft.com/kb/314496).
Nie powinieneś próbować bawić się konfiguracją MTU w normalnych konfiguracjach sieciowych.

Istnieje Odnośnik do kodu VB tutaj .
Istnieje również narzędzie o nazwie DrTCP :


W rejestrze,

  • Przejdź do HKLM\Software\Microsoft\Windows NT\CurrentVersion\NetworkCards
  • Otwórz adapter, który Cię interesuje
  • Skopiuj ciąg ServiceName
  • Wyszukaj ten ciąg w HKLM\System; dopasujesz klucz NetCfgInstanceId
  • Nieco powyżej tego będzie klucz MaxFrameSize (mój pokazuje 1514)

Istnieje również sposób na zmianę tego za pomocą polecenia netsh.

Sprawdź również swoją konfigurację Path MTU Discovery .

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

Zobacz AdapterWatch :

AdapterWatch wyświetla przydatne informacje o Twoich adapterach sieciowych: Adresy IP, Adres sprzętowy, Serwery WINS, Serwery DNS, Wartość MTU, Liczba odebranych lub wysłanych bajtów, Aktualna prędkość transferu i inne. Dodatkowo, wyświetla ogólne statystyki TCP/IP/UDP/ICMP dla Twojego lokalnego komputera.