2009-09-08 11:24:00 +0000 2009-09-08 11:24:00 +0000
21
21

Hoe kan ik zien welke MTU wordt gebruikt in Windows XP?

Ik heb een heel vreemd probleem waarbij ik willekeurig “De verbinding met de server werd gereset” fouten krijg wanneer ik webpagina’s probeer te openen (HTTP fout 12031 volgens het Windows netwerk diagnostisch hulpprogramma) - dit gebeurt ongeacht of de webpagina die ik probeer te openen op het externe internet staat of zelfs als het van een lokale Apache instantie is die op localhost draait. Het heeft effect op alle computers in ons lokale netwerk (Ethernet, niet draadloos), die allemaal Windows XP draaien.

Er is mij gesuggereerd dat het te maken zou kunnen hebben met de MTU die gebruikt wordt op het netwerkverkeer. Als ik de Ping Test doe om het grootste pakket te vinden dat ongefragmenteerd kan passeren, kan ik de localhost pingen met een pakket van 1492 bytes (+28 bytes voor een header?) en kan ik onze router pingen met een pakket van 1462 bytes (dat is 1490 bytes als je de header van 28 bytes meerekent). Als ik iets van buitenaf probeer te pingen, zoals Google, krijg ik niets door dat groter is dan 1430 (dat is 1458 met de header).

Ik heb geprobeerd verschillende instructies te volgen om het Windows XP Register te updaten met deze MTU instelling, waarbij ik HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{AdapterID}\MTU heb geupdate. Ik heb eindeloos veel alternatieve waarden geprobeerd: de meest voor de hand liggende correcte waarde lijkt 1490 te zijn, maar ik heb ook 1462, 1458, 1430, etc., etc. geprobeerd. Als ik de computer herstart om de verandering van kracht te laten worden, lijkt het een paar minuten te werken (moeilijk met zekerheid te zeggen, omdat het altijd willekeurig is in plaats van consistent), maar het duurt nooit lang.

In het begin, toen ik 1430 als waarde probeerde, na een paar minuten prima te hebben gewerkt, verminderden de resultaten van de Ping Test met 28 bytes - plotseling ontdekte ik dat ik slechts een pakket van 1402 bytes door Google kon krijgen. Als ik de MTU register instelling bijwerkte naar 1402, wanneer ik opnieuw opstartte en een paar minuten wachtte, zou het dan 1374 zijn, dan 1346, enz. enz. Andere computers op het netwerk bleven onaangetast (nog steeds op 1430) en het verwijderen van de MTU instelling uit het register zou alles weer normaal maken (en nog steeds kapot).

Wat ik het moeilijkste vind aan het diagnosticeren van dit alles is dat het erg moeilijk is om te zeggen of ik wel met de juiste register instelling aan het spelen ben. Dus op zijn eenvoudigst, zou mijn vraag zijn: **Hoe kan ik zien welke MTU-instelling Windows probeert te gebruiken?

Als iemand een idee heeft waarom de MTU steeds met 28 daalt, zou dat ook nuttig zijn (is er bijvoorbeeld ergens een Windows log-bestand waar het iets logt op het punt waar de waarde verandert)?

Tenslotte, als iemand me definitief kan vertellen hoe ik kan zien welke MTU instelling ik zou moeten proberen te gebruiken, zou dat geweldig zijn!

Antwoorden (5)

58
58
58
2011-08-02 02:59:21 +0000

Voor Windows 7, Windows Vista en Windows XP is de MTU voor verschillende interfaces beschikbaar vanuit Windows zelf met behulp van netsh.

Windows 7, Windows Vista

Om de huidige MTU op Windows 7 of Windows Vista te tonen, vanaf een opdrachtprompt:

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

En voor IPv4 interfaces:

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

Note: In dit voorbeeld heeft mijn Local Area Connection IPv6 interface zo'n lage MTU (1280) omdat ik een tunneldienst gebruik om IPv6 connectiviteit te krijgen .

Je kunt je MTU ook wijzigen (Windows 7, Windows Vista). Vanaf een verhoogde opdrachtprompt:

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

Getest met Windows 7 Service Pack 1

Windows XP

De netsh syntaxis voor Windows XP is iets 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 vereist dat de **Routing and Remote Access service gestart is voordat je details over een interface (inclusief MTU) kunt zien:

C:\Users\Ian>net start remoteaccesss

Windows XP voorziet niet in een manier om de MTU instelling te wijzigen vanuit netsh. Daarvoor kunt u:

Tested with Windows XP Service Pack 3

Zie ook

Korte discussie over wat MTU is, waar de 28 bytes vandaan komen.

Je netwerkkaart (Ethernet) heeft een maximale pakketgrootte van 1,500 bytes:

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

Het IP gedeelte van TCP/IP heeft een header van 20 bytes nodig (12 bytes voor vlaggen, 4 bytes voor bron IP adres, 4 bytes voor bestemming IP adres). Hierdoor blijft er minder ruimte beschikbaar in het pakket:

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

Nu heeft een ICMP (ping) pakket een 8 byte header (1 byte type, 1 byte code, 2 byte checksum, 4 byte extra data):

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

Dat is waar de “ontbrekende” 28 bytes zijn - het is de grootte van de headers die nodig zijn om een ping pakket te versturen.

Wanneer je een ping pakket verstuurt, kun je aangeven hoeveel extra payload data je mee wilt sturen. In dit geval, als je alle 1472 bytes meezendt:

>ping -l 1472 obsidian

Dan zal het resulterende ethernet pakket tot de nok toe gevuld zijn. Elke laatste byte van het 1500 byte pakket zal gevuld zijn:

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

Als je probeert om nog een byte meer te sturen

>ping -l 1473 obsidian

zal het netwerk dat 1501 byte pakket moeten fragmenteren in meerdere pakketten:

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

Deze fragmentatie gebeurt achter de schermen, idealiter zonder dat jij het weet.

Maar je kunt ook gemeen zijn, en het netwerk vertellen dat het pakket niet gefragmenteerd mag worden:

>ping -l 1473 -f obsidian

De -f vlag betekent niet fragmenteren. Als je nu een pakket probeert te versturen dat niet op het netwerk past, krijg je de foutmelding:

>ping -l 1473 -f obsidian  

Packet needs to be fragmented but DF set.

Het pakket moet gefragmenteerd worden, maar de Do not Fragment flag was gezet.

Als ergens langs de lijn een pakket gefragmenteerd moest worden, stuurt het netwerk een ICMP pakket om je te vertellen dat er een fragmentatie is gebeurd. Je machine krijgt dit ICMP pakket, wordt verteld wat de grootste grootte was, en wordt verondersteld te stoppen met het versturen van te grote pakketten. Helaas blokkeren de meeste firewalls deze “Path MTU discovery” ICMP pakketten, zodat je machine nooit doorheeft dat de pakketten gefragmenteerd worden (of erger: gedropt worden omdat ze niet gefragmenteerd konden worden).

Dat is wat er voor zorgt dat de web-server niet werkt. Je kunt de eerste kleine (<1280 byte) antwoorden krijgen, maar grotere pakketten komen er niet doorheen. En de firewalls van de web-server zijn verkeerd geconfigureerd, waardoor ICMP pakketten worden geblokkeerd. Dus de web-server realiseert zich niet dat je het pakket nooit gekregen hebt.

Fragmentatie van pakketten is niet toegestaan in IPv6, iedereen is vereist om (correct) ICMP mtu discovery pakketten toe te staan.

8
8
8
2011-11-07 19:52:04 +0000

@ian Ik ben er niet zo zeker van dat netsh werkelijk de huidig gebruikte MTU toont. Op mijn Windows XP Pro SP3 machine, voerde ik netsh interface ip show interface uit en het rapporteerde de MTU waarde voor de relevante interface als 1500. Vervolgens heb ik de volgende registersleutels toegevoegd:

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 zegt dat het instellen van EnablePMTUDiscovery op 0 de MTU op 576 zal zetten.

Door de MTU registry entry in te stellen wordt de MTU handmatig ingesteld. Ik heb verschillende waarden voor de MTU entry geprobeerd (telkens opnieuw opstarten).

In beide gevallen – het toevoegen van de eerste entry, dan de tweede entry – gaf netsh nog steeds aan dat de MTU 1500 was. Testen met ping bevestigde (of suggereerde tenminste) dat de MTU waarde die in het register geconfigureerd was, ook werkelijk gebruikt werd.

Toen ik dit voor het eerst op mijn machine probeerde, was de Routing and Remote Access service uitgeschakeld, dus ik was niet in staat om deze met jouw instructies te starten. Ik heb hem aangezet door naar Configuratiescherm te gaan -> Beheerprogramma’s -> Computerbeheer -> Diensten en toepassingen -> Diensten. Ik veranderde “Opstarttype” van Uitgeschakeld naar Handmatig. Daarna heb ik de service ook vanuit dat dialoogvenster gestart.

Ik ben er ook niet zeker van dat KB283165 noodzakelijkerwijs de juiste instructies zijn voor het veranderen van de MTU. Zijn die instructies niet alleen relevant als je de Windows PPPoE client gebruikt? Als je verbinding maakt met het internet via een router waarbij de router de PPPoE client is (zoals in mijn geval), dan zouden die instructies niet relevant zijn, toch?

De instructies die ik volgde, en die mij ertoe brachten de bovenstaande wijzigingen in het register aan te brengen, stonden in KB900926: Aanbevolen TCP/IP instellingen voor WAN verbindingen met een MTU grootte van minder dan 576 (methode 2 & 3).


Edit by @ian

Het lijkt erop dat je gelijk hebt. Configureer voor 1.200, maar netsh rapporteert 1500.

>ping -l 1173 -f obsidian

Packet needs to be fragmented but DF set.

Dus ik denk dat het antwoord op de oorspronkelijke vraag is dat je op Windows XP trial-and-error moet gebruiken met de Do not fragment flag om het grootste pakket te vinden dat je kunt verzenden. Dan heb je je MTU.

2
2
2
2009-09-08 11:47:58 +0000

Je kunt MTU vinden met behulp van ping met trial en error aanpak:

ping <address> -f -l nnnn

-f : Specificeert dat Echo Verzoek berichten worden verzonden met de Don’t Fragment vlag in de IP header ingesteld op 1. Het Echo Verzoek bericht kan niet worden gefragmenteerd door routers op het pad naar de bestemming. Deze parameter is nuttig voor het oplossen van problemen met de path Maximum Transmission Unit (PMTU).

-l Size : Specificeert de lengte, in bytes, van het Data veld in de verzonden Echo Request berichten. De standaardwaarde is 32. De maximale grootte is 65.527.

U krijgt “Packet needs to be fragmented but DF set” berichten als de lengte te groot is.

1
1
1
2009-09-08 11:28:05 +0000

Microsoft KB314496: De standaard MTU groottes voor verschillende netwerk topologieën .
Je moet niet proberen te spelen met de MTU configuratie in normale netwerk setups.

Er is een VB code referentie hier .
Er is ook een tool genaamd DrTCP :

  • *

In het register,

  • Ga naar HKLM\Software\Microsoft\Windows NT\CurrentVersion\NetworkCards
  • Open de adapter waarin je geïnteresseerd bent
  • Kopieer de ServiceName string
  • Zoek die string in HKLM\System; je zult een NetCfgInstanceId key vinden
  • Een beetje daarboven zal de MaxFrameSize key zijn (de mijne laat 1514 zien)

Er is ook een manier om dit te veranderen met het netsh commando.

Controleer ook uw Path MTU Discovery configuratie .

1
1
1
2009-09-08 11:41:12 +0000

Zie AdapterWatch :

AdapterWatch toont nuttige informatie over uw netwerkadapters: IP-adressen, Hardware-adres, WINS-servers, DNS-servers, MTU-waarde, Aantal ontvangen of verzonden bytes, De huidige overdrachtssnelheid, en meer. Bovendien geeft het algemene TCP/IP/UDP/ICMP-statistieken voor uw lokale computer weer.