Für Windows 7, Windows Vista und Windows XP ist die MTU für verschiedene Schnittstellen von Windows selbst mit netsh
verfügbar.
Windows 7, Windows Vista
Um die aktuelle MTU unter Windows 7 oder Windows Vista anzuzeigen, über eine Eingabeaufforderung:
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 Local Area Connection IPv6-Schnittstelle eine so niedrige MTU (1280), weil ich einen Tunneldienst verwende, um IPv6-Konnektivität zu erhalten .
Sie können Ihre MTU auch ändern (Windows 7, Windows Vista). Von einer erhöhten Eingabeaufforderung aus:
>netsh interface ipv4 set subinterface "Local Area Connection" mtu=1492 store=persistent
Ok.
Tested with Windows 7 Service Pack 1
Windows XP
Die netsh
Syntax 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
Note: *Windows XP erfordert, dass der Dienst *Routing und Remote Access gestartet ist, bevor Sie Details über eine Schnittstelle (einschließlich MTU) sehen können:
C:\Users\Ian>net start remoteaccesss
Windows XP bietet keine Möglichkeit, die MTU-Einstellung von netsh
aus zu ändern. Dafür können Sie:
Tested with Windows XP Service Pack 3
Siehe auch
Kurze Diskussion darüber, was 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 benötigt einen 20-Byte-Header (12 Byte Flags, 4 Byte für die Quell-IP-Adresse, 4 Byte für die Ziel-IP-Adresse). Dadurch steht weniger Platz im Paket zur Verfügung:
+------------------------+
| 12 bytes control flags | \
| 4 byte from address | |- IP header: 20 bytes
| 4 byte to address | /
|------------------------|
| 1480 byte payload |
| |
| |
| |
+------------------------+
Nun 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 ist es, wo die “fehlenden” 28 Bytes sind - es ist die Größe des Headers, die benötigt wird, um ein Ping-Paket zu senden.
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 wird das resultierende Ethernet-Paket voll bis zu den Kiemen sein. Jedes letzte Byte des 1500 Byte großen Pakets wird gefüllt sein:
+------------------------+
| 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
>ping -l 1473 obsidian
zu senden, muss das Netzwerk 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, im Idealfall ohne Ihr Wissen.
Aber Sie können gemein sein und dem Netzwerk sagen, dass das Paket nicht fragmentiert werden darf:
>ping -l 1473 -f obsidian
Das -f Flag bedeutet nicht fragmentieren. Wenn Sie nun versuchen, ein Paket zu senden, das nicht in das Netzwerk passt, erhalten Sie die Fehlermeldung:
>ping -l 1473 -f obsidian
Packet needs to be fragmented but DF set.
Das Paket muss fragmentiert werden, aber das Do not Fragment Flag wurde gesetzt.
Wenn irgendwo auf der Leitung ein Paket fragmentiert werden musste, sendet das Netzwerk tatsächlich ein ICMP-Paket, das Ihnen mitteilt, dass eine Fragmentierung stattgefunden hat. Ihr Rechner erhält dieses ICMP-Paket, erfährt, was die größte Größe war, und soll aufhören, zu große Pakete zu senden. Leider blockieren die meisten Firewalls diese “Path MTU discovery”-ICMP-Pakete, so dass Ihr Rechner nie merkt, dass die Pakete fragmentiert werden (oder schlimmer: verworfen werden, weil sie nicht fragmentiert werden konnten).
Das ist die Ursache dafür, dass der Webserver nicht funktioniert. Sie können die anfänglichen kleinen (<1280 Byte) Antworten bekommen, aber größere Pakete kommen nicht durch. Und die Firewalls des Web-Servers sind falsch konfiguriert und blockieren ICMP-Pakete. Also merkt der Web-Server nicht, dass das Paket nie angekommen ist.
Fragmentierung von Paketen ist in IPv6 nicht erlaubt, jeder ist verpflichtet, ICMP mtu discovery Pakete (korrekt) zu erlauben.