Mam naprawdę dziwny problem polegający na tym, że podczas próby dostępu do stron internetowych losowo dostaję błędy „Połączenie z serwerem zostało zresetowane” (błąd HTTP 12031 według narzędzia diagnostycznego sieci systemu Windows) - dzieje się tak niezależnie od tego, czy strona internetowa Próbuję uzyskać dostęp do zewnętrznego Internetu lub nawet jeśli pochodzi z lokalnej instancji Apache działającej na localhost. Wpływa na wszystkie komputery w naszej sieci lokalnej (Ethernet, a nie bezprzewodowo), wszystkie z systemem 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 przechodzić przez niefragmentowane, mogę pingować hosta lokalnego za pomocą pakietu 1492 bajtów (+28 bajtów dla nagłówka?) I mogę pingować nasz router za pomocą pakietu 1462 bajtów (czyli 1490 bajtów po dodaniu 28-bajtowego nagłówka). Jeśli spróbuję pingować coś na zewnątrz, takiego jak Google, nie mogę uzyskać niczego większego niż 1430 (czyli 1458 z nagłówkiem).
Próbowałem postępować zgodnie z różnymi zestawami instrukcji, aby zaktualizować rejestr systemu Windows XP za pomocą tego ustawienia MTU, aktualizując HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{AdapterID}\MTU
. Nie próbowałem końca alternatywnych wartości: najbardziej oczywistą poprawną wartością wydaje się być 1490, ale próbowałem również 1462, 1458, 1430 itd. Itp. Kiedy uruchamiam ponownie komputer, aby zmiana zaczęła obowiązywać, to wydaje się działać przez kilka minut (trudno powiedzieć na pewno, ponieważ zawsze jest raczej losowy niż spójny), ale nigdy nie trwa długo.
Początkowo, gdy próbowałem 1430 jako wartości, po kilku minutach poprawnego działania wyniki testu ping zmniejszyłyby się o 28 bajtów - nagle okazało się, że mogę przesłać do Google tylko pakiet 1402 bajtów. Gdybym zaktualizował ustawienie rejestru MTU do 1402, po ponownym uruchomieniu i odczekaniu kilku minut będzie to 1374, następnie 1346 itd. Itd. Inne komputery w sieci pozostały niezmienione (nadal w 1430) i usunięcie ustawienia MTU z rejestru przywróciłoby rzeczy do normy (i nadal jest uszkodzone).
Najtrudniejsze w diagnozowaniu tego wszystkiego jest to, że bardzo trudno jest stwierdzić, czy w ogóle bawię się odpowiednim ustawieniem rejestru. Najprościej więc moje pytanie brzmi: w jaki sposób mogę ustalić, jakie ustawienie MTU próbuje użyć Windows?
Również, jeśli ktoś ma jakieś pomysły, jak powiedzieć, dlaczego MTU spada o 28, byłoby to również przydatne (np. Czy istnieje plik dziennika systemu Windows, w którym zapisuje coś w miejscu, w którym zmienia się wartość?)
Wreszcie, jeśli ktoś może mi ostatecznie powiedzieć, jak powiedzieć, jakiego ustawienia MTU powinienem użyć, byłoby świetnie!
źródło
Odpowiedzi:
W systemie Windows 7, Windows Vista i Windows XP MTU dla różnych interfejsów jest dostępne w systemie Windows przy użyciu
netsh
.Windows 7, Windows Vista
Aby wyświetlić bieżącą jednostkę MTU w systemie Windows 7 lub Windows Vista, z wiersza polecenia:
A dla interfejsów IPv4:
Uwaga: W tym przykładzie mój interfejs połączenia lokalnego IPv6 ma tak niską MTU (1280), ponieważ używam usługi tunelowej, aby uzyskać łączność IPv6 .
Możesz także zmienić MTU (Windows 7, Windows Vista). Z wiersza polecenia z podwyższonym poziomem uprawnień:
Testowane z dodatkiem Service Pack 1 dla systemu Windows 7
Windows XP
netsh
Składnia dla systemu Windows XP jest nieco inny:Uwaga: Windows XP wymaga uruchomienia usługi Routing i dostęp zdalny, zanim będzie można wyświetlić szczegółowe informacje o interfejsie (w tym MTU):
Windows XP nie zapewnia sposobu zmiany ustawienia MTU od wewnątrz
netsh
. W tym celu możesz:Testowane z Windows XP Service Pack 3
Zobacz też
Krótka dyskusja na temat tego, czym jest MTU, skąd pochodzi 28 bajtów.
Twoja karta sieciowa (Ethernet) ma maksymalny rozmiar pakietu
1,500 bytes
:Część IP protokołu TCP / IP wymaga 20-bajtowego nagłówka (12 bajtów flag, 4 bajty dla źródłowego adresu IP, 4 bajty dla docelowego adresu IP). To pozostawia mniej miejsca w pakiecie:
Teraz pakiet ICMP (ping) ma 8-bajtowy nagłówek (1 bajt
type
, 1 bajtcode
, 2 bajtychecksum
, 4 bajty dodatkowe dane):Właśnie tam znajduje się „brakujący” 28 bajtów - to rozmiar nagłówków wymaganych do wysłania pakietu ping.
Wysyłając pakiet ping, możesz określić, ile dodatkowych danych ładunku chcesz uwzględnić. W takim przypadku, jeśli podasz wszystkie 1472 bajty:
Następnie powstały pakiet ethernetowy będzie pełny do skrzeli. Każdy ostatni bajt pakietu 1500 bajtów zostanie wypełniony:
Jeśli spróbujesz wysłać jeszcze jeden bajt
sieć będzie musiała podzielić ten 1501 bajtowy pakiet na wiele pakietów:
Ta fragmentacja nastąpi za kulisami, najlepiej bez Twojej wiedzy.
Ale możesz być wredny i powiedzieć sieci, że pakiet nie może zostać podzielony:
W -f środki flag nie fragmentacji . Teraz, gdy próbujesz wysłać pakiet, który nie pasuje do sieci, pojawia się błąd:
Pakiet musi zostać pofragmentowany, ale ustawiono flagę Nie fragmentuj .
Jeśli w dowolnym miejscu linii konieczne jest fragmentowanie pakietu, sieć faktycznie wysyła pakiet ICMP z informacją, że nastąpiła fragmentacja. Twoja maszyna otrzyma ten pakiet ICMP, zostanie poinformowany, jaki był największy rozmiar i ma przestać wysyłać zbyt duże pakiety. Niestety większość zapór blokuje te pakiety ICMP „Path MTU Discovery”, więc twoja maszyna nigdy nie zdaje sobie sprawy z tego, że pakiety są pofragmentowane (lub gorzej: są odrzucane, ponieważ nie można ich pofragmentować).
To powoduje, że serwer WWW nie działa. Możesz uzyskać początkowe małe odpowiedzi (<1280 bajtów), ale większe pakiety nie mogą się przedostać. A zapory ogniowe serwera WWW są źle skonfigurowane, blokując pakiety ICMP. Tak więc serwer sieciowy nie zdaje sobie sprawy, że nigdy nie dostałeś pakietu.
Fragmentacja pakietów nie jest dozwolona w IPv6, każdy musi (poprawnie) zezwolić na pakiety wykrywania ICMP mtu.
źródło
@ian Nie jestem pewien, czy
netsh
faktycznie pokazuje aktualnie używany MTU. Na moim komputerze z systemem Windows XP Pro SP3 wykonałemnetsh interface ip show interface
i zgłosił wartość MTU dla odpowiedniego interfejsu jako1500
. Następnie dodałem następujące klucze rejestru:Microsoft twierdzi, że ustawienie
EnablePMTUDiscovery
na 0 spowoduje ustawienie MTU na 576.Ustawienie
MTU
wpisu rejestru ustawia MTU ręcznie. Próbowałem kilka wartości dlaMTU
wpisu (za każdym razem restart).W obu przypadkach - dodanie pierwszego wpisu, a następnie drugiego wpisu -
netsh
nadal zgłaszało MTU jako 1500. Testowanie za pomocą polecenia ping potwierdziło (lub przynajmniej zasugerowało), że faktycznie użyto wartości MTU skonfigurowanej w rejestrze.Ponadto, kiedy po raz pierwszy wypróbowałem to na moim komputerze, usługa Routing i dostęp zdalny została wyłączona, więc nie byłem w stanie uruchomić jej przy użyciu twoich instrukcji. Włączyłem go, przechodząc do Panelu sterowania> Narzędzia administracyjne> Zarządzanie komputerem> Usługi i aplikacje> Usługi. Zmieniłem „Typ uruchamiania” z Wyłączony na Ręczny. Następnie uruchomiłem usługę również z tego okna dialogowego.
Nie jestem również pewien, czy KB283165 jest koniecznie poprawną instrukcją zmiany MTU. Czy te instrukcje nie są istotne tylko podczas uruchamiania klienta Windows PPPoE? Jeśli łączysz się z Internetem przez router, na którym router jest klientem PPPoE (jak w moim przypadku), te instrukcje nie byłyby istotne, prawda?
Instrukcje, które zastosowałem, które doprowadziły mnie do wprowadzenia powyższych zmian w rejestrze, były w KB900926: Zalecane ustawienia TCP / IP dla łączy WAN o rozmiarze MTU mniejszym niż 576 (metody 2 i 3).
Edytuj przez @ian
Wygląda na to, że masz rację. Skonfiguruj dla 1200, ale
netsh
raportów1500
.Myślę, że odpowiedź na pierwotne pytanie brzmi: w systemie Windows XP musisz użyć metody prób i błędów z flagą Nie fragmentuj, aby znaleźć największy pakiet, jaki możesz wysłać. Masz swój MTU.
źródło
Możesz znaleźć MTU za pomocą polecenia ping z podejściem prób i błędów:
Ping :
Otrzymasz komunikat „Pakiet musi zostać podzielony na fragmenty, ale zestaw DF”, gdy długość jest zbyt duża.
źródło
Zobacz AdapterWatch :
źródło
Microsoft KB314496: Domyślne rozmiary MTU dla różnych topologii sieci .
Nie powinieneś próbować grać z konfiguracją MTU w normalnych konfiguracjach sieciowych.
Jest tutaj odniesienie do kodu VB .
Istnieje również narzędzie o nazwie DrTCP :
W rejestrze
HKLM\Software\Microsoft\Windows NT\CurrentVersion\NetworkCards
ServiceName
ciągHKLM\System
; dopasujeszNetCfgInstanceId
kluczMaxFrameSize
klucz (moja pokazuje 1514)Istnieje również sposób, aby to zmienić za pomocą
netsh
polecenia.Sprawdź także konfigurację Path MTU Discovery .
źródło