Ich habe ein wirklich seltsames Problem, bei dem ich beim Versuch, auf Webseiten zuzugreifen, zufällig die Fehlermeldung "Die Verbindung zum Server wurde zurückgesetzt" bekomme (HTTP-Fehler 12031 laut Windows-Netzwerkdiagnosetool) - dies geschieht unabhängig davon, ob die Webseite geöffnet ist Ich versuche, über das externe Internet oder von einer lokalen Apache-Instanz, die auf localhost ausgeführt wird, darauf zuzugreifen. Dies betrifft alle Computer in unserem lokalen Netzwerk (Ethernet, nicht drahtlos), auf denen Windows XP ausgeführt wird.
Es wurde mir vorgeschlagen, dass dies mit der MTU zu tun haben könnte, die für den Netzwerkverkehr verwendet wird. 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?) Anpingen und unseren Router mit einem Paket von 1462 Bytes anpingen (Das sind 1490 Byte, wenn Sie den 28-Byte-Header einfügen). Wenn ich versuche, etwas wie Google von außen anzupingen, kann ich nichts über 1430 (das ist 1458 mit dem Header) hinwegbekommen.
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\{AdapterID}\MTU
. Ich habe versucht, alle alternativen Werte auszuschließen: Der offensichtlichste richtige Wert scheint 1490 zu sein, aber ich habe auch versucht, 1462, 1458, 1430 usw. usw. Wenn ich den Computer neu starte, damit die Änderung wirksam wird, wird es scheint ein paar Minuten zu arbeiten (schwer zu sagen, da es immer zufällig und nicht beständig ist), aber es hält nie lange an.
Anfangs, als ich 1430 als Wert ausprobierte, sanken die Ergebnisse des Ping-Tests nach ein paar einwandfreien Minuten um 28 Bytes - plötzlich stellte ich fest, dass ich nur ein Paket mit 1402 Bytes an Google weiterleiten konnte. Wenn ich die MTU-Registrierungseinstellung auf 1402 aktualisiere, wenn ich neu gestartet und ein paar Minuten gewartet habe, dann sind es 1374, dann 1346 usw. usw. Andere Computer im Netzwerk sind nicht betroffen (immer noch um 1430) und entfernen die MTU-Einstellung von der Registrierung würde die Dinge wieder normal (und immer noch defekt).
Das Schwierigste an der Diagnose ist, dass es sehr schwer zu sagen ist, ob ich überhaupt mit der richtigen Registrierungseinstellung spiele. Im einfachsten Fall würde meine Frage lauten: Wie kann ich feststellen, welche MTU-Einstellung Windows verwendet?
Auch wenn jemand eine Idee hat, warum die MTU immer wieder um 28 sinkt, wäre dies hilfreich (zB gibt es irgendwo eine Windows-Protokolldatei, in der etwas protokolliert wird, wenn sich der Wert ändert?).
Wenn mir jemand definitiv sagen kann, welche MTU-Einstellung ich verwenden soll, wäre das großartig!
quelle
Antworten:
Für Windows 7, Windows Vista und Windows XP ist die MTU für verschiedene Schnittstellen über 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:
Und für IPv4-Schnittstellen:
Hinweis: In diesem Beispiel hat meine IPv6- Schnittstelle für LAN- Verbindungen eine so niedrige MTU (1280), weil ich einen Tunneldienst verwende, um IPv6-Konnektivität zu erhalten .
Sie können auch Ihre MTU ändern (Windows 7, Windows Vista). An einer Eingabeaufforderung mit erhöhten Rechten:
Getestet mit Windows 7 Service Pack 1
Windows XP
Die
netsh
Syntax für Windows XP unterscheidet sich geringfügig:Hinweis: Windows XP erfordert, dass der Routing- und RAS- Dienst gestartet wird, bevor Sie Details zu einer Schnittstelle (einschließlich MTU) anzeigen können:
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 MTU ist, wo die 28 Bytes herkommen.
Ihre Netzwerkkarte (Ethernet) hat eine maximale Paketgröße von
1,500 bytes
:Der IP-Teil von TCP / IP erfordert einen 20-Byte-Header (12 Byte Flags, 4 Byte für die Quell-IP-Adresse, 4 Byte für die Ziel-IP-Adresse). Dadurch bleibt weniger Speicherplatz im Paket verfügbar:
Jetzt hat ein ICMP-Paket (Ping) einen 8-Byte-Header (1 Byte
type
, 1 Bytecode
, 2 Bytechecksum
, 4 Byte zusätzliche Daten):Hier 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 einschließen:
Dann ist das resultierende Ethernet- Paket bis zum Anschlag voll. Jedes letzte Byte des 1500-Byte-Pakets wird gefüllt:
Wenn Sie versuchen, ein weiteres Byte zu senden
Das Netzwerk muss dieses 1501-Byte-Paket in mehrere Pakete fragmentieren:
Diese Fragmentierung geschieht im Hintergrund, idealerweise ohne dass Sie es merken.
Aber Sie können gemein sein und dem Netzwerk mitteilen, dass das Paket nicht fragmentiert werden darf:
Das Flag -f bedeutet , nicht fragmentieren . Wenn Sie nun versuchen, ein Paket zu senden, das nicht in das Netzwerk passt, erhalten Sie den Fehler:
Das Paket muss fragmentiert werden, aber das Flag Nicht fragmentieren wurde gesetzt.
Wenn irgendwo entlang der Linie ein Paket fragmentiert werden musste, sendet das Netzwerk tatsächlich ein ICMP-Paket, das Ihnen mitteilt, dass eine Fragmentierung stattgefunden hat. Ihr Computer erhält dieses ICMP-Paket, erhält Informationen zur größten Größe und soll das Senden von zu großen Paketen einstellen. Leider blockieren die meisten Firewalls diese ICMP-Pakete für die "Pfad-MTU-Erkennung", sodass Ihr Computer nie merkt, dass die Pakete fragmentiert werden (oder schlimmer: fallengelassen, weil sie nicht fragmentiert werden konnten).
Dies führt dazu, dass der Webserver nicht funktioniert. Sie können die ersten kleinen (<1280 Byte) Antworten erhalten, aber größere Pakete können nicht durchkommen. Die Firewalls des Webservers sind falsch konfiguriert und blockieren ICMP-Pakete. Der Webserver merkt also nicht, dass Sie das Paket nie bekommen haben.
Die Fragmentierung von Paketen ist in IPv6 nicht zulässig. Jeder muss ICMP mtu-Erkennungspakete (korrekt) zulassen.
quelle
@ian Ich bin mir nicht so sicher, ob
netsh
tatsächlich die aktuell verwendete MTU angezeigt wird. Auf meinem Windows XP Pro SP3-Computer habe ich ausgeführtnetsh interface ip show interface
und es hat den MTU-Wert für die relevante Schnittstelle als gemeldet1500
. Ich habe dann die folgenden Registrierungsschlüssel hinzugefügt:Microsoft sagt, dass die Einstellung
EnablePMTUDiscovery
auf 0 die MTU auf 576 setzt.Durch das Festlegen des
MTU
Registrierungseintrags wird die MTU manuell festgelegt. Ich habe mehrere Werte für denMTU
Eintrag ausprobiert (jedes Mal neu starten).In beiden Fällen - Hinzufügen des ersten Eintrags, dann des zweiten Eintrags - wurde
netsh
die MTU weiterhin als 1500 gemeldet. Das Testen mit Ping bestätigte (oder schlug zumindest vor), dass der in der Registrierung konfigurierte MTU-Wert tatsächlich verwendet wurde.Als ich dies zum ersten Mal auf meinem Computer versuchte, war der Routing- und RAS-Dienst deaktiviert, sodass ich ihn nicht anhand Ihrer Anweisungen starten konnte. Ich habe es unter Systemsteuerung> Verwaltungstools> Computerverwaltung> Dienste und Anwendungen> Dienste aktiviert. Ich habe den Starttyp von Deaktiviert in Manuell geändert. Ich habe dann den Dienst auch über diesen Dialog gestartet.
Ich bin mir auch nicht sicher, ob KB283165 unbedingt die richtige Anleitung zum Ändern der MTU ist. Sind diese Anweisungen nicht nur für die Ausführung des Windows PPPoE-Clients relevant? Wenn Sie eine Verbindung zum Internet über einen Router herstellen, auf dem der Router der PPPoE-Client ist (wie in meinem Fall), sind diese Anweisungen nicht relevant, oder?
Die Anweisungen, die ich befolgt habe und die mich dazu veranlassten, die obigen Änderungen an der Registrierung vorzunehmen , befanden 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
netsh
Berichte1500
.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 hast du deine MTU.
quelle
Sie finden MTU mithilfe von Ping mit Trial-and-Error-Ansatz:
Ping :
Wenn die Länge zu groß ist, erhalten Sie die Meldung "Paket muss fragmentiert, aber DF gesetzt sein".
quelle
Siehe AdapterWatch :
quelle
Microsoft KB314496: Die Standard-MTU-Größen für verschiedene Netzwerktopologien .
Sie sollten nicht versuchen, mit der MTU-Konfiguration in normalen Netzwerk-Setups zu spielen.
Hier gibt es eine VB-Code-Referenz .
Es gibt auch ein Tool namens DrTCP :
In der Registrierung,
HKLM\Software\Microsoft\Windows NT\CurrentVersion\NetworkCards
ServiceName
ZeichenfolgeHKLM\System
; Du wirst einenNetCfgInstanceId
Schlüssel findenMaxFrameSize
Schlüssel sein (meiner zeigt 1514)Es gibt auch eine Möglichkeit, dies mit dem
netsh
Befehl zu ändern .Überprüfen Sie auch Ihre Path MTU Discovery-Konfiguration .
quelle