Cosa è l`MTU

Transcript

Cosa è l`MTU
Cosa è l'MTU
Scritto da Administrator
Sabato 15 Settembre 2007 19:51 - Ultimo aggiornamento Lunedì 17 Ottobre 2011 08:22
Tutte le comunicazioni basate su TCP/IP implicano il passaggio di pacchetti che vengono
confezionati dagli host partendo dai dati creati dai programmi applicativi e aggiungendo strati su
strati durante la discesa del pacchetto verso il livello fisico. Il processo viene descritto tramite il
modello a strati del TCP/IP.
L'ultimo strato che un pacchetto raggiunge prima di uscire da un host è il network layer, gestito
direttamente dall'interfaccia di rete. Mentre gli strati più alti sono sostanzialmente indipendenti
dall'hardware e dipendono dal sistema operativo e dalle applicazioni, lo strato della rete è per
forza di cose legato all'hardware e al mezzo di trasmissione che utilizza l'host per comunicare,
sia esso una rete ethernet o una connessione ADSL PPoE.
La voce italiana di Wikipedia è sufficientemente esaustiva per gli scopi di questo post:
“Maximum Transmission Unit (MTU) indica le dimensioni massime in byte di un pacchetto
dati che può essere inviato attraverso un protocollo di comunicazione. Tale parametro è di solito
associato alle interfacce di comunicazione quali schede di rete o porte seriali. Se un router deve
trasmettere un pacchetto su una interfaccia che ha un MTU inferiore alla dimensione del
pacchetto, il protocollo Internet effettua automaticamente la frammentazione, ovvero divide il
pacchetto in due o più pacchetti più piccoli. I frammenti del pacchetto originale sono
contrassegnati, così il protocollo IP di destinazione è in grado di riassemblare i pacchetti
nell'originale. Un qualsiasi router lungo il cammino potrebbe dover frammentare un pacchetto, e
l'host di destinazione dovrà ricostruire il pacchetto originale dai frammenti. … La
frammentazione consente a IP di lavorare correttamente su una rete composta di collegamenti
con MTU eterogenea, ma è una operazione onerosa per i router e per l'host che riceve i
pacchetti frammentati, quindi si cerca di evitarla quando possibile.”
In poche parole: nel caso di una rete ethernet, ad esempio, l'MTU è 1500 byte, ed è la
dimensione massima di un “pezzo” coerente di dati che l'interfaccia riesce a immettere sul cavo
di rete.
Ciascun tipo di interfaccia ha il proprio MTU, quindi ne consegue che lungo il cammino che
separa due host il valore massimo dell'MTU prima di frammentare un pacchetto, sarà quello
dell'interfaccia con MTU più basso. Mi spiego meglio con un esempio: se in una strada che
1/6
Cosa è l'MTU
Scritto da Administrator
Sabato 15 Settembre 2007 19:51 - Ultimo aggiornamento Lunedì 17 Ottobre 2011 08:22
separa due città ci sono tre gallerie che permettono rispettivamente il passaggio di mezzi alti 4,
3 e 5 metri, il carico più alto che posso portare su un camion prima di doverlo dividere, misura 3
metri di altezza. Questo valore massimo è detto MTU path, e se tutte le interfacce coinvolte nel
trasferimento dei dati contengono la dimensione dei loro pacchetti sotto questa soglia, si evita la
frammentazione. La determinazione di questo valore ( MTU path discovery ) avviene per mezzo
di messaggi
ICMP ;
purtroppo, per limitare gli attacchi di tipo
DoS
, alcuni router bloccano il traffico ICMP.
“L' RFC 1191 descrive l'MTU path discovery, una tecnica per determinare il cammino MTU
tra due host
, così che quella frammentazione
possa essere evitata. Un host invia pacchetti IP di dimensioni che aumentano gradualmente,
con il bit DF (Don't Fragment — Non Frammentare) settato a “1?. Se un router lungo il cammino
ha bisogno di frammentare il pacchetto, ma esso ha il bit DF settato a “1?, il router lo
abbandona, e manda un pacchetto ICMP di tipo “datagramma troppo grosso” all'indirizzo
sorgente per segnalare il problema. L'host sorgente in questo modo “impara” il più grosso MTU
che può passare attraverso quel cammino senza frammentarsi.”
L'MTU è un valore chiave nel tuning della velocità della rete, ma va maneggiato con attenzione:
pacchetti grandi aumentano l'efficienza poiché l'overhead diminuisce, ma interfacce non
particolarmente veloci potrebbero avere problemi con MTU elevati. Wikipedia inglese fa
l'esempio di un pacchetto ethernet con un normale MTU a 1500 byte, il quale impiega circa un
secondo (!) a passare per una interfaccia modem a 14,4k.
L'MTU è spesso fonte di problemi in reti complesse e host con parecchie interfacce; non è
semplicissimo diagnosticare questi problemi e spesso si procede per via empirica, anche
perché l'MTU non è la prima cosa a cui si pensa. Connessioni lente, a “strappi”, velocità non
omogenee per diversi applicativi, connessioni che si instaurano con difficoltà a ricevere i dati di
ritorno, sono tutti sintomi di un valore MTU non adeguato. Per controllare e modificare l'MTU in
ambiente Windows si può usare l'utility gratuita DrTCP , semplicissima da usare: basta
selezionare un'interfaccia di rete e impostare l'MTU desiderato, ricordandosi di riavviare il
computer. (Segnatevi il valore che modificate per ripristinare le cose in caso di
malfunzionamenti ancora peggiori.) In Linux si usa il solito ifconfig, ed eventulmente il file
/etc/networks/interfaces.
2/6
Cosa è l'MTU
Scritto da Administrator
Sabato 15 Settembre 2007 19:51 - Ultimo aggiornamento Lunedì 17 Ottobre 2011 08:22
Dopo la teoria, facciamo una prova pratica sull'MTU, visto che l'unico strumento che serve è il
comando ping.
Per comodità mia utilizzo il terminale di un server Ubuntu, ma si può utilizzare tranquillamente il
prompt dei comandi di Windows, sebbene con sintassi diversa.
Anzitutto controlliamo il valore dell'MTU della scheda di rete(*):
root@ginger:~$ ifconfig eth0 | grep MTU
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Ok, è 1500 per default. (Per Windows possiamo utilizzare l'utility gratuita DrTCP .)
Controlliamo che un host esterno risponda al ping:
root@ginger:~# ping www.google.com -c3
PING www.l.google.com (216.239.59.147) 56(84) bytes of data.
64 bytes from gv-in-f147.google.com (216.239.59.147): icmp_seq=1 ttl=243 time=48.5 ms
64 bytes from gv-in-f147.google.com (216.239.59.147): icmp_seq=2 ttl=243 time=47.1 ms
64 bytes from gv-in-f147.google.com (216.239.59.147): icmp_seq=3 ttl=243 time=50.2 ms
--- www.l.google.com ping statistics ---3 packets transmitted, 3 received, 0% packet loss,
time 2004msrtt min/avg/max/mdev = 47.140/48.647/50.295/1.304 ms
Il ping funziona tramite ICMP, che vi ricordo essere un “…protocollo di servizio che si preoccupa
di trasmettere informazioni riguardanti malfunzionamenti, informazioni di controllo o messaggi
tra i vari componenti di una rete di calcolatori.”
Come si può vedere, per impostazione predefinita il comando ping manda un pacchetto di 56
byte, a cui vanno aggiunti 20 byte di intestazione IP e 8 byte relativi al messaggio
ICMP_REQUEST; infatti il manuale del comando ping (man ping) riporta: “ICMP PACKET
DETAILS
- An IP
header without options is 20 bytes. An ICMP ECHO_REQUEST packet contains an additional 8
bytes worth of ICMP header followed by an arbitrary amount of data. When a packetsize is
given, this indicated the size of this extra piece of data (the default is 56). Thus the amount of
data received inside of an IP packet of type ICMP ECHO_REPLY will always be 8 bytes more
than the requested data space (the ICMP header).”
Quindi ping ci informa che sta mandando fuori un pacchetto di 56+28=84 byte.
Adesso proviamo a pingare con pacchetti appena sopra l'MTU della scheda, cioè 1501 byte.
Facciamo due calcoli: 1501 meno 28 (tra intestazione IP e messaggio ICMP) = 1473 byte:
root@ginger:~# ping www.google.com -c3 -s1473
3/6
Cosa è l'MTU
Scritto da Administrator
Sabato 15 Settembre 2007 19:51 - Ultimo aggiornamento Lunedì 17 Ottobre 2011 08:22
PING www.l.google.com (216.239.59.99) 1473(1501) bytes of data. --- www.l.google.com ping
statistics --3 packets transmitted, 0 received, 100% packet loss, time 2006ms
Adesso si comincia a vedere qualcosa di interessante: il pacchetto è troppo grosso e quindi
evidentemente non esce dalla scheda di rete, che avendo MTU a 1500 non riesce a “sparare”
pacchetti da 1501 byte.
Proviamo all'esatto valore di MTU, quindi 1500-28=1472:
root@ginger:~# ping www.google.com -c3 -s1472
PING www.l.google.com (216.239.59.99) 1472(1500) bytes of data.
From 192.168.254.1 icmp_seq=1 Frag needed and DF set (mtu = 1492) --- www.l.google.com
ping statistics --3 packets transmitted, 0 received, +1 errors, 100% packet loss, time 2006ms
Sempre meglio: adesso il pacchetto è uscito, ma l'host 192.168.254.1, che è il mio router, mi
comunica che la sua interfaccia è impostata con un MTU di 1492 byte e non può frammentare i
pacchetti (DF set), quindi il pacchetto viene eliminato ed il ping non funziona. Proviamo a
impostare il flag DF sull'interfaccia locale e vediamo che succede:
root@ginger:~# ping www.google.com -c3 -s1472 -M do
PING www.l.google.com (216.239.59.147) 1472(1500) bytes of data.
From ginger (192.168.254.2) icmp_seq=1 Frag needed and DF set (mtu = 1492)
From ginger (192.168.254.2) icmp_seq=1 Frag needed and DF set (mtu = 1492)
From ginger (192.168.254.2) icmp_seq=1 Frag needed and DF set (mtu = 1492) --www.l.google.com ping statistics --0 packets transmitted, 0 received, +3 errors
Come ci si aspettava, adesso è l'host locale (ginger - 192.168.254.2) che risponde
lamentandosi che per far uscire il pacchetto avrebbe bisogno di frammentarlo, ma il flag DF è
settato quindi non se ne fa nulla. Ma adesso sappiamo che l'MTU è settato a 1492 byte, quindi
1492-28=1464
root@ginger:~# ping www.google.com -c3 -s1464
PING www.l.google.com (216.239.59.104) 1464(1492) bytes of data.
64 bytes from 216.239.59.104: icmp_seq=1 ttl=243 (truncated)
64 bytes from 216.239.59.104: icmp_seq=2 ttl=243 (truncated)
64 bytes from 216.239.59.104: icmp_seq=3 ttl=243 (truncated) --- www.l.google.com ping
statistics --3 packets transmitted, 3 received, 0% packet loss, time 2002ms
Fatto, il pacchetto passa, e passa anche con il flag DF settato localmente:
4/6
Cosa è l'MTU
Scritto da Administrator
Sabato 15 Settembre 2007 19:51 - Ultimo aggiornamento Lunedì 17 Ottobre 2011 08:22
root@ginger:~# ping www.google.com -c3 -s1464 -M do
PING www.l.google.com (216.239.59.104) 1464(1492) bytes of data.
64 bytes from 216.239.59.104: icmp_seq=1 ttl=243 (truncated)
64 bytes from 216.239.59.104: icmp_seq=2 ttl=243 (truncated)
64 bytes from 216.239.59.104: icmp_seq=3 ttl=243 (truncated)
--- www.l.google.com ping statistics --3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 68.888/69.473/70.187/0.618 ms
Come controprova, aumentiamo di 1 byte:
root@ginger:~# ping www.google.com -c3 -s1465
PING www.l.google.com (216.239.59.99) 1465(1493) bytes of data.
From 192.168.254.1 icmp_seq=1 Frag needed and DF set (mtu = 1492)
--- www.l.google.com ping statistics --3 packets transmitted, 0 received, +1 errors, 100% packet loss, time 2006ms
Come volevasi dimostrare. Abbiamo scoperto che l'MTU path della connessione è 1492. Ed
infatti sul mio router:
Con Windows è meno immediato, poichè non restituisce tutti i messaggi ICMP, quindi il valore
dell'MTU path va trovato per tentativi.
In realtà questi esercizi non sono che una diagnostica grossolana, specie in ambienti complessi
con molti salti e architetture complicate, ma uniti ad un po' di pazienza, uno sniffer e un po' di
fortuna permettono di risolvere problemi apparentemente complicatissimi. Inoltre non
sottovalutate il fatto che potete fare parecchio “cinema” con queste manovre.
5/6
Cosa è l'MTU
Scritto da Administrator
Sabato 15 Settembre 2007 19:51 - Ultimo aggiornamento Lunedì 17 Ottobre 2011 08:22
(*)vale anche per l'interfaccia verso un modem ADSL
L'articolo originale l'ha scritto Andrea Beggi e lo trovate nel suo blog .
6/6

Documenti analoghi

fastweb - Alastor2602

fastweb - Alastor2602 > Sintassi x RWIN : echo [valore] > /proc/sys/net/core/rmem_max echo [valore] > /proc/sys/net/core/rmem_default con al posto di [valore] il numero corrispondente alla dimensione RWIN. > Sintassi x ...

Dettagli