So können Sie feststellen, welche MTU in Windows XP verwendet wird

21

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!

andygeers
quelle
FWIW, am Ende war es eine zweifelhafte Telefonleitung, die das Problem war. Als ich ein Telefon anschloss, war kein Wählton zu hören.
Andygeers

Antworten:

58

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:

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

>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 unterscheidet sich geringfügig:

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 MTU ist, wo die 28 Bytes herkommen.

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 die Quell-IP-Adresse, 4 Byte für die Ziel-IP-Adresse). Dadurch bleibt weniger Speicherplatz im Paket verfügbar:

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

Jetzt hat ein ICMP-Paket (Ping) 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      |
|                        |
|                        |
|                        |
+------------------------+

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:

>ping -l 1472 obsidian

Dann ist das resultierende Ethernet- Paket bis zum Anschlag 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 fragmentieren:

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

Aber Sie können 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, erhalten Sie den Fehler:

>ping -l 1473 -f obsidian  

Packet needs to be fragmented but DF set.

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.

Ian Boyd
quelle
8

@ian Ich bin mir nicht so sicher, ob netshtatsächlich die aktuell verwendete MTU angezeigt wird. Auf meinem Windows XP Pro SP3-Computer habe ich ausgeführt netsh interface ip show interfaceund es hat den MTU-Wert für die relevante Schnittstelle als gemeldet 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\{ID}\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 mehrere Werte für den MTUEintrag ausprobiert (jedes Mal neu starten).

In beiden Fällen - Hinzufügen des ersten Eintrags, dann des zweiten Eintrags - wurde netshdie 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 netshBerichte 1500.

Bildbeschreibung hier eingeben

>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 hast du deine MTU.

JMM
quelle
2

Sie finden MTU mithilfe von Ping mit Trial-and-Error-Ansatz:

ping <address> -f -l nnnn

Ping :

-f: Gibt an, dass Echo-Anforderungsnachrichten mit dem Flag "Nicht fragmentieren" im IP-Header auf 1 gesendet werden. Die Echo-Anforderungsnachricht kann nicht von Routern im Pfad zum Ziel fragmentiert werden. Dieser Parameter ist hilfreich für die Fehlerbehebung bei PMTU-Problemen (Maximum Transmission Unit).

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

Wenn die Länge zu groß ist, erhalten Sie die Meldung "Paket muss fragmentiert, aber DF gesetzt sein".

T. Kaltnekar
quelle
Das habe ich oben gemacht, als ich mich auf "The Ping Test" bezog
andygeers
1

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.

Harrymc
quelle
1

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 :

Alt-Text


In der Registrierung,

  • Gehe zu HKLM\Software\Microsoft\Windows NT\CurrentVersion\NetworkCards
  • Öffnen Sie den gewünschten Adapter
  • Kopieren Sie die ServiceNameZeichenfolge
  • Suchen Sie diesen String in HKLM\System; Du wirst einen NetCfgInstanceIdSchlüssel finden
  • Ein wenig darüber wird der MaxFrameSizeSchlüssel sein (meiner zeigt 1514)

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

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

nik
quelle
Vielen Dank dafür, aber im Idealfall wäre es beruhigender, wenn Windows mir mitteilen könnte, welche MTU tatsächlich verwendet wird, und nicht nur, was Sie als Standard erwarten würden. Vielleicht ist das aber nicht möglich :-(
andygeers