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