Come sapere quale MTU viene utilizzato in Windows XP


21

Soffro di un problema davvero strano in cui ricevo casualmente errori "La connessione al server è stata ripristinata" quando provo ad accedere alle pagine Web (errore HTTP 12031 secondo lo strumento di diagnostica della rete Windows) - questo accade indipendentemente dal fatto che la pagina Web Sto provando ad accedere su Internet esterno o anche se proviene da un'istanza Apache locale in esecuzione su localhost. Colpisce tutti i computer della nostra rete locale (Ethernet, non wireless), su cui è in esecuzione Windows XP.

Mi è stato suggerito che potrebbe avere a che fare con l'MTU utilizzato sul traffico di rete. Se eseguo il Ping Test per scoprire il pacchetto più grande che può passare senza frammentazione, posso eseguire il ping dell'host locale con un pacchetto di 1492 byte (+28 byte per un'intestazione?) E posso eseguire il ping del nostro router con un pacchetto di 1462 byte (che è 1490 byte quando si include l'intestazione da 28 byte). Se provo a eseguire il ping di qualcosa all'esterno come Google, non riesco a ottenere nulla di più grande di 1430 (che è 1458 con l'intestazione).

Ho provato a seguire vari set di istruzioni per aggiornare il registro di Windows XP con questa impostazione MTU, aggiornando HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{AdapterID}\MTU. Non ho provato la fine di valori alternativi: il valore corretto più ovvio sembra essere 1490, ma ho anche provato 1462, 1458, 1430, ecc. Ecc. Quando riavvio il computer per rendere effettive le modifiche, sembra funzionare per alcuni minuti (difficile da dire perché è sempre casuale piuttosto che coerente) ma non dura mai a lungo.

Inizialmente, quando stavo provando il 1430 come valore, dopo alcuni minuti di lavoro soddisfacente, i risultati del Ping Test diminuivano di 28 byte - improvvisamente scoprivo che avrei potuto ottenere un pacchetto di 1402 byte solo su Google. Se avessi aggiornato l'impostazione del registro MTU al 1402, quando ho riavviato e atteso qualche minuto, sarebbe stato 1374, quindi 1346, ecc. Altri computer della rete sarebbero rimasti inalterati (ancora al 1430) e rimuovendo l'impostazione MTU dal registro ripristinerebbe le cose alla normalità (e ancora rotto).

La cosa che trovo più difficile nella diagnosi di tutto ciò è che è molto difficile dire se sto giocando con le impostazioni di registro corrette. Quindi, nella maniera più semplice, la mia domanda sarebbe: come posso sapere quale impostazione MTU Windows sta cercando di usare?

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

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


FWIW, alla fine era il problema il problema era una linea telefonica instabile. Quando ho collegato un telefono non c'era il segnale di linea.
Andygeers,

Risposte:


58

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

Windows 7, Windows Vista

Per mostrare la MTU corrente 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 di connessione alla rete locale ha un MTU così basso (1280) perché sto usando un servizio tunnel per ottenere la connettività IPv6 .

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

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

Testato con Windows 7 Service Pack 1

Windows XP

La netshsintassi 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 l' avvio del servizio Routing e Accesso remoto prima di poter visualizzare i dettagli di un'interfaccia (incluso MTU):

C:\Users\Ian>net start remoteaccesss

Windows XP non fornisce un modo per modificare l'impostazione MTU dall'interno netsh. Per questo puoi:

Testato con Windows XP Service Pack 3

Guarda anche


Breve discussione su cos'è MTU, da dove provengono i 28 byte.

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

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

La parte IP di TCP / IP richiede un'intestazione di 20 byte (12 byte di flag, 4 byte per l'indirizzo IP di origine, 4 byte per l'indirizzo IP di 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 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 si trovano i 28 byte "mancanti": è la dimensione delle intestazioni richieste per inviare un pacchetto ping.

Quando si invia un pacchetto ping, è possibile specificare la quantità di dati di payload extra che si desidera includere. In questo caso, se si includono tutti i 1472 byte:

>ping -l 1472 obsidian

Quindi il pacchetto Ethernet risultante sarà pieno fino alle branchie. Verrà riempito ogni ultimo byte del pacchetto di 1500 byte:

+------------------------+
| 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 si tenta di inviare un altro byte

>ping -l 1473 obsidian

la rete dovrà frammentare quel pacchetto di 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 a tua insaputa.

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 provi a inviare un pacchetto che non si adatta alla rete ottieni l'errore:

>ping -l 1473 -f obsidian  

Packet needs to be fragmented but DF set.

Il pacchetto deve essere frammentato, ma è stata impostata la bandiera Non frammentare .

Se in qualsiasi punto della linea un pacchetto dovesse essere frammentato, la rete in realtà invia un pacchetto ICMP che ti dice che si è verificata una frammentazione. La tua macchina ottiene questo pacchetto ICMP, 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", quindi la tua macchina non si rende mai conto che i pacchetti vengono frammentati (o peggio: eliminati perché non possono essere frammentati).

Questo è ciò che impedisce al web server di non funzionare. È possibile ottenere le risposte iniziali piccole (<1280 byte), ma i pacchetti più grandi non possono passare. E i firewall del web server sono configurati in modo errato, bloccando i pacchetti ICMP. Quindi il web server non si rende conto che non hai mai ricevuto il pacchetto.

La frammentazione dei pacchetti non è consentita in IPv6, tutti sono tenuti a consentire (correttamente) i pacchetti di rilevamento mtu ICMP.


8

@ian Non sono così sicuro che netshmostri effettivamente l'MTU attualmente in uso. Sul mio computer Windows XP Pro SP3, ho eseguito netsh interface ip show interfacee ha riportato il valore MTU per l'interfaccia pertinente come 1500. Ho quindi 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 afferma che l'impostazione EnablePMTUDiscoverysu 0 imposterà MTU su 576.

L'impostazione della MTUvoce di registro imposta manualmente l'MTU. Ho provato diversi valori per la MTUvoce (riavvio ogni volta).

In entrambi i casi, aggiungendo la prima voce, quindi la seconda, è stato netshcomunque riportato l'MTU come 1500. I test con ping hanno confermato (o almeno suggerito) che il valore MTU configurato nel registro fosse effettivamente utilizzato.

Inoltre, quando l'ho provato per la prima volta sulla mia macchina, il servizio Routing e Accesso remoto è stato disabilitato, quindi non sono stato in grado di avviarlo seguendo le vostre istruzioni. L'ho abilitato andando su Pannello di controllo> Strumenti amministrativi> Gestione computer> Servizi e applicazioni> Servizi. Ho cambiato "Tipo di avvio" da Disabilitato a Manuale. Ho quindi avviato il servizio anche da quella finestra di dialogo.

Inoltre, non sono sicuro che KB283165 sia necessariamente le istruzioni corrette per modificare l'MTU. Queste istruzioni non sono pertinenti solo quando si esegue il client PPPoE di Windows? Se ti connetti a Internet attraverso un router in cui il router è il client PPPoE (come nel mio caso), tali istruzioni non sarebbero pertinenti, giusto?

Le istruzioni che ho seguito, che mi hanno portato a apportare le modifiche di cui sopra al registro, erano in KB900926: impostazioni TCP / IP consigliate per collegamenti WAN con dimensioni MTU inferiori a 576 (metodi 2 e 3).


Modifica di @ian

Sembra che tu abbia ragione. Configurare per 1.200, ma netshrapporti 1500.

inserisci qui la descrizione dell'immagine

>ping -l 1173 -f obsidian

Packet needs to be fragmented but DF set.

Quindi suppongo che la risposta alla domanda originale sia che su Windows XP è necessario utilizzare tentativi ed errori con il flag Non frammentare per trovare il pacchetto più grande che è possibile inviare. Allora hai il tuo MTU.


2

Puoi trovare MTU usando il ping con approccio di prova ed errore:

ping <address> -f -l nnnn

Ping :

-f: specifica che i messaggi di richiesta eco vengono inviati con il flag Non frammentare nell'intestazione IP impostata su 1. Il messaggio di richiesta eco non può essere frammentato dai router nel percorso verso la destinazione. Questo parametro è utile per la risoluzione dei problemi relativi al PMTU (Maximum Transmission Unit) del percorso.

-l Dimensione: specifica la lunghezza, in byte, del campo Dati nei messaggi di richiesta eco inviati. Il valore predefinito è 32. La dimensione massima è 65.527.

Riceverai i messaggi "Il pacchetto deve essere frammentato ma DF impostato" quando la lunghezza è troppo grande.


Questo è quello che stavo facendo sopra quando ho fatto riferimento a "The Ping Test"
andygeers

1

Vedi AdapterWatch :

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


1

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

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

testo alternativo


Nel registro,

  • Vai a HKLM\Software\Microsoft\Windows NT\CurrentVersion\NetworkCards
  • Apri l'adattatore che ti interessa
  • Copia la ServiceNamestringa
  • Cerca quella stringa in HKLM\System; abbinerai una NetCfgInstanceIdchiave
  • Un po 'sopra sarà la MaxFrameSizechiave (il mio mostra il 1514)

C'è anche un modo per cambiarlo con il netshcomando.

Inoltre, controlla la configurazione di Disco MTU Discovery .


Grazie per questo, ma idealmente sarei più rassicurato se potessi convincere Windows a dirmi effettivamente quale MTU sta effettivamente usando, piuttosto che solo quello che ti aspetteresti che sia l'impostazione predefinita. Forse questo non è possibile però :-(
andygeers
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.