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

Come dire quale MTU è usato in Windows XP

Sto soffrendo di un problema molto strano in cui ottengo casualmente errori “La connessione al server è stata ripristinata” quando cerco di accedere a pagine web (errore HTTP 12031 secondo lo strumento di diagnostica di rete di Windows) - questo accade indipendentemente dal fatto che la pagina web a cui sto cercando di accedere sia su internet esterno o anche se è da un'istanza locale di Apache in esecuzione su localhost. Colpisce tutti i computer della nostra rete locale (Ethernet, non wireless), tutti con Windows XP.

Mi è stato suggerito che potrebbe avere a che fare con l'MTU utilizzato nel traffico di rete. Se faccio il Ping Test per scoprire il più grande pacchetto che può passare senza essere frammentato, posso fare il ping al localhost con un pacchetto di 1492 byte (+28 byte per l'intestazione?) e posso fare il ping al nostro router con un pacchetto di 1462 byte (che è 1490 byte quando si includono i 28 byte di intestazione). Se provo a pingare qualcosa all'esterno come Google, non riesco a far passare niente di più grande di 1430 (che è 1458 con l'intestazione).

Ho provato a seguire varie serie di istruzioni per aggiornare il registro di Windows XP con questa impostazione MTU, aggiornando HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{AdapterID}\MTU. Ho provato un'infinità di valori alternativi: il valore corretto più ovvio sembra essere 1490, ma ho provato anche 1462, 1458, 1430, ecc. Quando riavvio il computer per far sì che la modifica abbia effetto, sembra funzionare per qualche minuto (difficile dirlo con certezza dato che è sempre casuale piuttosto che coerente) ma non dura mai a lungo.

Inizialmente, quando provavo 1430 come valore, dopo qualche minuto di funzionamento, i risultati del Ping Test diminuivano di 28 byte - improvvisamente scoprivo che potevo far passare a Google solo un pacchetto di 1402 byte. Se aggiornavo l'impostazione del registro MTU a 1402, quando riavviavo e aspettavo qualche minuto, era poi 1374, poi 1346, ecc. ecc. Gli altri computer della rete rimanevano inalterati (ancora a 1430) e rimuovendo l'impostazione MTU dal registro le cose tornavano normali (e ancora rotte).

La cosa che trovo più difficile nella diagnosi di tutto questo è che è molto difficile dire se sto giocando con l'impostazione corretta del registro. Quindi, nel modo più semplice, la mia domanda sarebbe: **Come posso dire quale impostazione MTU Windows sta cercando di usare?

Inoltre, se qualcuno ha qualche idea su come dire perché l'MTU continua a diminuire di 28, anche questo sarebbe utile (ad esempio, c'è un file di log di Windows da qualche parte dove registra qualcosa nel punto in cui il valore cambia?)

Infine, se qualcuno può dirmi definitivamente come dire quale impostazione MTU dovrei cercare di usare, sarebbe fantastico!

Risposte (5)

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

Per Windows 7, Windows Vista e Windows XP, l'MTU per varie interfacce è disponibile da Windows stesso usando netsh.

Windows 7, Windows Vista

Per mostrare l'attuale MTU su Windows 7 o Windows Vista, da un prompt dei comandi:

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

E per le interfacce IPv4:

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

Nota: In questo esempio la mia interfaccia IPv6 Local Area Connection ha un MTU così basso (1280) perché sto usando un servizio tunnel per ottenere connettività IPv6 .

Puoi anche cambiare il tuo MTU (Windows 7, Windows Vista). Da un prompt di comando elevato:

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

Testato con Windows 7 Service Pack 1

Windows XP

La sintassi netsh per Windows XP è leggermente diversa:

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

Nota: ** Windows XP richiede che il servizio **Routing and Remote Access sia avviato prima di poter vedere i dettagli di un'interfaccia (incluso l'MTU):

C:\Users\Ian>net start remoteaccesss

Windows XP non fornisce un modo per cambiare l'impostazione dell'MTU da netsh. Per questo è possibile:

Testato con Windows XP Service Pack 3

Vedi anche


Breve discussione su cosa sia l'MTU, da dove vengono i 28 byte.

La tua scheda di rete (Ethernet) ha una dimensione massima dei pacchetti di 1,500 bytes:

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

La parte IP di TCP/IP richiede un'intestazione di 20 byte (12 byte di flags, 4 byte per l'indirizzo IP sorgente, 4 byte per l'indirizzo IP destinazione). Questo lascia meno spazio disponibile nel pacchetto:

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

Ora un pacchetto ICMP (ping) ha un'intestazione di 8 byte (1 byte type, 1 byte code, 2 byte checksum, 4 byte di dati aggiuntivi):

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

Ecco dove sono i 28 byte “mancanti” - è la dimensione dell'intestazione richiesta per inviare un pacchetto ping.

Quando invii un pacchetto ping, puoi specificare quanti dati extra di carico utile vuoi includere. In questo caso, se si includono tutti i 1472 byte:

>ping -l 1472 obsidian

Allora il pacchetto ethernet risultante sarà pieno fino alle branchie. Ogni ultimo byte del pacchetto da 1500 byte sarà riempito:

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

Se provate a inviare un altro byte

>ping -l 1473 obsidian

la rete dovrà frammentare quel pacchetto da 1501 byte in più pacchetti:

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

Questa frammentazione avverrà dietro le quinte, idealmente senza che tu lo sappia.

Ma puoi essere cattivo, e dire alla rete che il pacchetto non può essere frammentato:

>ping -l 1473 -f obsidian

Il flag -f significa non frammentare. Ora quando si cerca di inviare un pacchetto che non entra nella rete si ottiene l'errore:

>ping -l 1473 -f obsidian  

Packet needs to be fragmented but DF set.

Il pacchetto deve essere frammentato, ma il flag Do not Fragment è stato impostato.

Se in qualsiasi punto della linea un pacchetto deve essere frammentato, la rete invia effettivamente un pacchetto ICMP che ti dice che è avvenuta una frammentazione. La vostra macchina riceve questo pacchetto ICMP, le viene detto quale era la dimensione più grande, e si suppone che smetta di inviare pacchetti troppo grandi. Sfortunatamente la maggior parte dei firewall blocca questi pacchetti ICMP “Path MTU discovery”, così la tua macchina non si rende mai conto che i pacchetti sono stati frammentati (o peggio: abbandonati perché non potevano essere frammentati).

Questo è ciò che fa sì che il web-server non funzioni. È possibile ottenere le risposte iniziali piccole (<1280 byte), ma i pacchetti più grandi non possono passare. E i firewall del web-server sono mal configurati, bloccando i pacchetti ICMP. Così il web-server non si rende conto che non ha mai ricevuto il pacchetto.

La frammentazione dei pacchetti non è consentita in IPv6, tutti sono richiesti per consentire (correttamente) i pacchetti ICMP mtu discovery.

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

@ian Non sono così sicuro che netsh mostri effettivamente l'MTU attualmente utilizzato. Sulla mia macchina Windows XP Pro SP3, ho eseguito netsh interface ip show interface e ha riportato il valore MTU per la relativa interfaccia come 1500. Ho poi aggiunto le seguenti chiavi di registro:

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 dice che impostando EnablePMTUDiscovery a 0 si imposta l'MTU a 576.

Impostando la voce di registro MTU si imposta l'MTU manualmente. Ho provato diversi valori per la voce MTU (riavviando ogni volta).

In entrambi i casi – aggiungendo la prima voce, poi la seconda – netsh riportava ancora l'MTU come 1500. Test con ping hanno confermato (o almeno suggerito) che il valore MTU configurato nel registro è stato effettivamente utilizzato.

Inoltre, quando ho provato per la prima volta sulla mia macchina, il servizio Routing and Remote Access era disabilitato, quindi non sono stato in grado di avviarlo usando le tue istruzioni. L'ho abilitato andando in Pannello di controllo > Strumenti di amministrazione > Gestione del computer > Servizi e applicazioni > Servizi. Ho cambiato “Tipo di avvio” da Disabilitato a Manuale. Ho poi avviato il servizio anche da quella finestra di dialogo.

Non sono anche sicuro che KB283165 sia necessariamente le istruzioni corrette per cambiare l'MTU. Quelle istruzioni non sono rilevanti solo quando si esegue il client PPPoE di Windows? Se ci si connette a internet attraverso un router dove il router è il client PPPoE (come nel mio caso), quelle istruzioni non sarebbero rilevanti, giusto?

Le istruzioni che ho seguito, che mi hanno portato a fare le suddette modifiche al registro, erano in KB900926: Recommended TCP/IP settings for WAN links with a MTU size of less than 576 (methods 2 & 3).


Edit by @ian

Sembra che tu abbia ragione. Configura per 1200, ma netsh riporta 1500.

>ping -l 1173 -f obsidian

Packet needs to be fragmented but DF set.

Quindi credo che la risposta alla domanda originale sia che su Windows XP devi usare prove ed errori con il flag Do not fragment per trovare il pacchetto più grande che puoi inviare. Poi hai il tuo MTU.

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

Puoi trovare l'MTU usando il ping con un approccio per tentativi ed errori:

ping <address> -f -l nnnn

-f : Specifica che i messaggi Echo Request sono inviati con il flag Don’t Fragment nell'header IP impostato a 1. Il messaggio Echo Request non può essere frammentato dai router nel percorso verso la destinazione. Questo parametro è utile per la risoluzione di problemi relativi alla PMTU (path Maximum Transmission Unit).

-l Size : Specifica la lunghezza, in byte, del campo Data nei messaggi Echo Request inviati. Il valore predefinito è 32. La dimensione massima è 65.527.

Otterrete messaggi “Packet needs to be fragmented but DF set” quando la lunghezza è troppo grande.

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

Microsoft KB314496: Le dimensioni MTU predefinite per diverse topologie di rete .
Non dovresti provare a giocare con la configurazione MTU nelle normali configurazioni di rete.

C'è un Riferimento al codice VB qui .
C'è anche uno strumento chiamato DrTCP :


Nel registro di sistema,

  • Vai a HKLM\Software\Microsoft\Windows NT\CurrentVersion\NetworkCards
  • Apri l'adattatore che ti interessa
  • Copia la stringa ServiceName
  • Cerca quella stringa in HKLM\System; troverai una chiave NetCfgInstanceId
  • Poco sopra ci sarà la chiave MaxFrameSize (la mia mostra 1514)

C'è anche un modo per cambiare questo con il comando netsh.

Inoltre, controlla la tua configurazione Path MTU Discovery .

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

Vedere AdapterWatch :

AdapterWatch visualizza informazioni utili sulle tue schede di rete: Indirizzi IP, indirizzo hardware, server WINS, server DNS, valore MTU, numero di byte ricevuti o inviati, velocità di trasferimento corrente e altro. Inoltre, visualizza statistiche generali TCP/IP/UDP/ICMP per il tuo computer locale.