So erfahren Sie, welche MTU in Windows XP verwendet wird

154770
andygeers

Ich habe ein wirklich komisches Problem, bei dem ich zufällig die Fehlermeldung "Die Verbindung zum Server wurde zurückgesetzt" beim Zugriff auf Webseiten erhalten habe (HTTP-Fehler 12031 gemäß dem Windows-Netzwerkdiagnosetool). Dies geschieht unabhängig davon, ob die Webseite angezeigt wird Ich versuche, auf das externe Internet zuzugreifen oder auch, wenn es sich um eine lokale Apache-Instanz handelt, die auf localhost ausgeführt wird. Dies betrifft alle Computer in unserem lokalen Netzwerk (Ethernet, nicht Wireless), auf denen Windows XP ausgeführt wird.

Es wurde mir vorgeschlagen, dass dies mit der für den Netzwerkverkehr verwendeten MTU zusammenhängt. Wenn ich den Ping-Test durchführe, um das größte Paket herauszufinden, das unfragmentiert durchlaufen kann, kann ich den localhost mit einem Paket von 1492 Bytes (+28 Bytes für einen Header?) Pingen, und ich kann unseren Router mit einem Paket von 1462 Bytes anpingen (Dies sind 1490 Bytes, wenn Sie den 28-Byte-Header einschließen). Wenn ich etwas von außen anpinge, wie Google, kann ich nichts größer als 1430 (mit dem Header 1458) erreichen.

Ich habe versucht, verschiedene Anweisungen zu befolgen, um die Windows XP-Registrierung mit dieser MTU-Einstellung zu aktualisieren HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\\MTU. Ich habe kein Ende der alternativen Werte ausprobiert: Der offensichtlichste korrekte Wert scheint 1490 zu sein, aber ich habe auch 1462, 1458, 1430 usw. versucht. Wenn ich den Computer neu starte, damit die Änderung wirksam wird, wird er übernommen scheint für ein paar Minuten zu funktionieren (schwer zu sagen, da es immer zufällig und nicht konstant ist), aber es dauert nie lange.

Anfangs, als ich 1430 als Wert ausprobierte, sanken die Ergebnisse des Ping-Tests nach ein paar Minuten der Feinarbeit um 28 Bytes - plötzlich würde ich feststellen, dass ich nur ein Paket von 1402 Bytes an Google weitergeben konnte. Wenn ich die MTU-Registrierungseinstellung auf 1402 aktualisiert habe, habe ich nach einem Neustart und ein paar Minuten gewartet, dann wären es 1374, dann 1346 usw. usw. Andere Computer im Netzwerk blieben unberührt (immer noch um 1430) und die MTU-Einstellung wurde entfernt von der Registry würde alles wieder normal (und immer noch kaputt).

Am schwierigsten finde ich bei der Diagnose all dies, dass es sehr schwer zu sagen ist, ob ich überhaupt mit der richtigen Registrierungseinstellung spiele. Am einfachsten wäre meine Frage: Wie kann ich herausfinden, welche MTU-Einstellung Windows verwendet?

Wenn jemand eine Idee hat, warum die MTU ständig um 28 sinkt, wäre dies ebenfalls nützlich (z. B. gibt es eine Windows-Protokolldatei, an der etwas an der Stelle protokolliert, an der sich der Wert ändert?)

Wenn mir irgendjemand definitiv sagen kann, welche MTU-Einstellung ich verwenden sollte, wäre das großartig!

20
FWIW, am Ende war es eine zwielichtige Telefonleitung, die das Problem war. Als ich ein Telefon angeschlossen habe, war kein Freizeichen zu hören. andygeers vor 10 Jahren 0

5 Antworten auf die Frage

55
Ian Boyd

Für Windows 7, Windows Vista und Windows XP ist die MTU für verschiedene Schnittstellen von Windows selbst verfügbar netsh.

Windows 7, Windows Vista

So zeigen Sie die aktuelle MTU unter Windows 7 oder Windows Vista an einer Eingabeaufforderung an:

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 

Und für IPv4-Schnittstellen:

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 

Hinweis: In diesem Beispiel weist meine IPv6- Schnittstelle für LAN-Verbindung ( Local Area Connection) eine so niedrige MTU (1280) auf, da ich einen Tunneldienst zum Herstellen einer IPv6-Verbindung verwende .

Sie können auch Ihre MTU (Windows 7, Windows Vista) ändern . Über eine Eingabeaufforderung mit erhöhten Rechten:

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

Getestet mit Windows 7 Service Pack 1

Windows XP

Die netshSyntax für Windows XP ist etwas anders:

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 

Hinweis: Windows XP erfordert, dass der Routing- und RAS- Dienst gestartet wird, bevor Sie Details zu einer Schnittstelle (einschließlich MTU) anzeigen können:

C:\Users\Ian>net start remoteaccesss 

Windows XP bietet keine Möglichkeit, die MTU-Einstellung von innen zu ändern netsh. Dafür können Sie:

Getestet mit Windows XP Service Pack 3

Siehe auch


Kurze Diskussion darüber, was die MTU ist, woher die 28 Bytes kommen.

Ihre Netzwerkkarte (Ethernet) hat eine maximale Paketgröße von 1,500 bytes:

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

Der IP-Teil von TCP / IP erfordert einen 20-Byte-Header (12 Byte Flags, 4 Byte für Quell-IP-Adresse, 4 Byte für Ziel-IP-Adresse). Dadurch bleibt weniger Platz im Paket:

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

Jetzt hat ein ICMP (Ping) -Paket einen 8-Byte-Header (1 Byte type, 1 Byte code, 2 Byte checksum, 4 Byte zusätzliche Daten):

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

Das sind die "fehlenden" 28 Bytes - es ist die Größe der Header, die zum Senden eines Ping-Pakets erforderlich sind.

Wenn Sie ein Ping-Paket senden, können Sie angeben, wie viele zusätzliche Nutzdaten Sie einschließen möchten. In diesem Fall, wenn Sie alle 1472 Bytes angeben:

>ping -l 1472 obsidian 

Dann ist das resultierende Ethernet- Paket bis zu den Kiemen voll. Jedes letzte Byte des 1500-Byte-Pakets wird gefüllt:

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

Wenn Sie versuchen, ein weiteres Byte zu senden

>ping -l 1473 obsidian 

Das Netzwerk muss dieses 1501-Byte-Paket in mehrere Pakete aufteilen:

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

Diese Fragmentierung geschieht im Hintergrund, idealerweise ohne dass Sie es wissen.

Sie können aber gemein sein und dem Netzwerk mitteilen, dass das Paket nicht fragmentiert werden darf:

>ping -l 1473 -f obsidian 

Das Flag -f bedeutet nicht fragmentieren . Wenn Sie nun versuchen, ein Paket zu senden, das nicht in das Netzwerk passt, wird der Fehler angezeigt:

>ping -l 1473 -f obsidian   Packet needs to be fragmented but DF set. 

Das Paket muss fragmentiert sein, aber das Flag " Nicht fragmentieren" wurde gesetzt.

Wenn irgendwo entlang der Linie ein Paket fragmentiert werden muss, sendet das Netzwerk tatsächlich ein ICMP-Paket, das Ihnen mitteilt, dass eine Fragmentierung stattgefunden hat. Ihr Computer erhält dieses ICMP-Paket, teilt Ihnen mit, was die größte Größe war, und soll das Senden von zu großen Paketen beenden. Leider blockieren die meisten Firewalls diese "Path MTU Discovery" ICMP-Pakete, so dass Ihre Maschine niemals erkennt, dass die Pakete fragmentiert sind (oder, was noch schlimmer ist: sie fallen gelassen werden, weil sie nicht fragmentiert werden konnten).

Das ist der Grund, warum der Webserver nicht funktioniert. Sie können die ersten kleinen Antworten (<1280 Byte) erhalten, größere Pakete können jedoch nicht durchkommen. Die Firewalls des Webservers sind falsch konfiguriert und blockieren ICMP-Pakete. Der Webserver erkennt also nicht, dass Sie das Paket nie erhalten haben.

Die Fragmentierung von Paketen ist in IPv6 nicht zulässig. Jeder muss ICMP-mtu-Erkennungspakete (richtig) zulassen.

8
JMM

@ian Ich bin mir nicht so sicher, ob netshtatsächlich die aktuell verwendete MTU angezeigt wird. Auf meinem Windows XP Pro SP3-Rechner habe ich netsh interface ip show interfaceden MTU-Wert für die betreffende Schnittstelle als ausgeführt 1500. Ich habe dann die folgenden Registrierungsschlüssel hinzugefügt:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\EnablePMTUDiscovery value: 0  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\\MTU  value: various (e.g. 1200) 

Microsoft sagt, dass die Einstellung EnablePMTUDiscoveryauf 0 die MTU auf 576 setzt.

Durch das Festlegen des MTURegistrierungseintrags wird die MTU manuell festgelegt. Ich habe verschiedene Werte für den MTUEintrag versucht (jedes Mal neu gestartet).

In beiden Fällen - dem Hinzufügen des ersten Eintrags und dann des zweiten Eintrags - wurde netshdie MTU immer noch mit 1500 gemeldet. Beim Testen mit Ping wurde bestätigt (oder zumindest vorgeschlagen), dass der in der Registrierung konfigurierte MTU-Wert tatsächlich verwendet wurde.

Als ich dies zum ersten Mal auf meinem Computer ausprobierte, wurde der Routing- und RAS-Dienst deaktiviert, sodass ich ihn nicht anhand Ihrer Anweisungen starten konnte. Ich habe es über die Systemsteuerung> Verwaltungstools> Computerverwaltung> Dienste und Anwendungen> Dienste aktiviert. Ich habe den "Starttyp" von "Deaktiviert" in "Manuell" geändert. Ich habe den Dienst dann auch von diesem Dialog aus gestartet.

Ich bin mir auch nicht sicher, ob KB283165 notwendigerweise die richtigen Anweisungen zum Wechseln der MTU ist. Sind diese Anweisungen nicht nur beim Ausführen des Windows PPPoE-Clients relevant? Wenn Sie sich über einen Router mit dem Internet verbinden, bei dem der Router der PPPoE-Client ist (wie in meinem Fall), wären diese Anweisungen nicht relevant, oder?

Die Anweisungen, die ich befolgte und die oben genannten Änderungen an der Registrierung vorgenommen haben, befinden sich in KB900926: Empfohlene TCP / IP-Einstellungen für WAN-Verbindungen mit einer MTU-Größe von weniger als 576 (Methoden 2 und 3).


Bearbeiten von @ian

Sieht so aus, als hättest du recht. Konfigurieren Sie für 1.200, aber netshBerichte 1500.

>ping -l 1173 -f obsidian  Packet needs to be fragmented but DF set. 

Ich denke, die Antwort auf die ursprüngliche Frage ist, dass Sie unter Windows XP Trial-and-Error mit dem Flag " Nicht fragmentieren" verwenden müssen, um das größte Paket zu finden, das Sie senden können. Dann haben Sie Ihre MTU.

2
T. Kaltnekar

Sie können MTU mithilfe von Ping mit Versuch und Fehler finden:

ping <address> -f -l nnnn 

Ping :

-f: Gibt an, dass Echoanforderungsnachrichten mit dem Flag Nicht fragmentieren im IP-Header auf 1 gesendet werden. Die Echoanforderungsnachricht kann von Routern im Pfad zum Ziel nicht fragmentiert werden. Dieser Parameter ist nützlich für die Problembehandlung bei Problemen mit der Maximum Transmission Unit (PMTU).

-l Größe: Gibt die Länge des Datenfelds in den gesendeten Echoanforderungsnachrichten in Byte an. Der Standardwert ist 32. Die maximale Größe beträgt 65.527.

Sie erhalten die Meldung "Paket muss fragmentiert, aber DF-Satz", wenn die Länge zu groß ist.

Das habe ich oben gemacht, als ich von "The Ping Test" sprach. andygeers vor 14 Jahren 0
1
nik

Microsoft KB314496: Die MTU-Standardgrößen für verschiedene Netzwerktopologien .
Sie sollten nicht versuchen, mit der MTU-Konfiguration in normalen Netzwerkeinstellungen zu spielen.

Es gibt hier eine VB-Code-Referenz .
Es gibt auch ein Werkzeug namens DrTCP :

Alt-Text


In der Registry

  • Gehe zu HKLM\Software\Microsoft\Windows NT\CurrentVersion\NetworkCards
  • Öffnen Sie den für Sie interessanten Adapter
  • Kopieren Sie die ServiceNameZeichenfolge
  • Suchen Sie diese Zeichenfolge in HKLM\System; Du wirst einen NetCfgInstanceIdSchlüssel finden
  • Ein wenig darüber wird der MaxFrameSizeSchlüssel sein (mein zeigt 1514)

Es gibt auch eine Möglichkeit, dies mit dem netshBefehl zu ändern .

Überprüfen Sie auch Ihre Path MTU Discovery-Konfiguration .

Vielen Dank dafür, aber im Idealfall wäre ich beruhigter, wenn ich Windows tatsächlich dazu bringen könnte, * mir * zu sagen, was MTU eigentlich ist * und nicht nur das, was Sie als Standard erwarten. Vielleicht ist dies jedoch nicht möglich :-( andygeers vor 14 Jahren 0
1
harrymc

Siehe AdapterWatch :

AdapterWatch zeigt nützliche Informationen zu Ihren Netzwerkadaptern an: IP-Adressen, Hardwareadresse, WINS-Server, DNS-Server, MTU-Wert, Anzahl der empfangenen oder gesendeten Bytes, Aktuelle Übertragungsgeschwindigkeit und mehr. Außerdem werden allgemeine TCP / IP / UDP / ICMP-Statistiken für Ihren lokalen Computer angezeigt.