doc Ottimizzare MTU e RWIN di una connessione
_ scritto il 19.01.2011 alle ore 22:04 _ 26166 letture
I fattori che concorrono a mantenere stabile e veloce una connessione ad Internet sono molteplici e alcuni di questi, se configurati in maniera errata, sono in grado da soli di creare dei colli di bottiglia che degradano le prestazioni. Uno di questi fattori, stando alla mia esperienza e alle richieste di aiuto che leggo in rete, è anche uno dei parametri più sottovalutati in fase di configurazione di una connessione ADSL: l'MTU (Maximum Transmission Unit).

Le comunicazioni basate su protocollo TCP/IP funzionano grazie allo scambio di pacchetti di dati che viaggiano attraverso le varie interfacce di comunicazione che intercorrono tra la sorgente e la destinazione. Se io sul mio browser digito "www.google.it", il pacchetto di dati relativo alla mia richiesta partirà dall'interfaccia di rete del mio computer, passerà per il router, attraverserà gli apparati del mio Internet Provider, e così via fino ad arrivare a destinazione. L'MTU è un parametro che indica le dimensioni massime (in byte) di un pacchetto di dati inviato tramite un protocollo di comunicazione. Il problema principale è che non è universale, ma ogni interfaccia di comunicazione ha il suo valore di MTU. Quando un router si ritrova a dover trasmettere un pacchetto su un'interfaccia con un MTU più basso rispetto alle dimensioni del pacchetto stesso, il protocollo lo divide (frammenta) in due o più pacchetti più piccoli. Il pacchetto sarà poi ricostruito dall'host di destinazione. Questo processo è piuttosto oneroso per i router e per l'host che riceve i dati, per questo motivo è buona cosa evitare la frammentazione dei pacchetti.

In altre parole bisogna semplicemente trovare il valore MTU più basso tra quelli appartenenti alle interfacce di comunicazione che compongono il "cammino" dei pacchetti di dati che inviamo tramite la nostra connessione. Lasciare il valore di default può comportare la frammentazione continua di qualsiasi pacchetto inviato, e in reti con parecchie interfacce questo potrebbe portare a disomogeneità di velocità tra diverse applicazioni, difficoltà ad instaurare determinate connessioni, lentezza, latenza e prestazioni altalentanti.


Ok, è tutto molto bello... ma nella pratica?


Per calcolare l'MTU ottimale della propria connessione basta il semplice comando ping.

La sintassi generale da utilizzare tramite prompt in Windows (Start > Programmi > Accessori > Prompt dei comandi) è la seguente:


ping -f -l XXXX YYYY



dove XXXX è il valore MTU da provare e YYYY è l'URL di destinazione del pacchetto.

Al valore di MTU utilizzato nel ping vanno tolti 28 byte utilizzati come intestazione dal comando stesso (nello specifico: 20 byte sono di intestazione IP e 8 sono relativi a ICMP_REQUEST).
Partiamo quindi dal valore massimo che può assumere l'MTU di un pacchetto IP su Ethernet: 1500 byte (che all'interno del ping diventano 1472, perché vanno sottratti i 28 dell'intestazione). Il comando da utilizzare sarà quindi:


ping -f -l 1472 www.google.com



Quello che stiamo facendo è inviare un pacchetto di una dimensione stabilita da noi verso un host specifico disattivandone la possibilità di frammentazione. In questo modo, impostando una dimensione superiore a quella supportata da una qualsiasi interfaccia interposta tra noi e l'host di destinazione, riceveremo un chiaro messaggio di errore. La tecnica è quindi quella di abbassare pian piano il valore di MTU del ping fino a trovare quello massimo supportato.

Questo è il messaggio che riceverete nel caso di una dimensione troppo elevata:

img

Mentre questo è un ping riuscito, e viene restituito se il pacchetto ha dimensioni pari o inferiori a quelle dell'MTU massimo supportato dalla rete:

img

Procedendo per tentativi dovreste arrivare a trovare il valore massimo, al quale dovrete aggiungere 28 per ottenere il vostro MTU ottimale.

Il mio, per fare un esempio, è pari a 1400. Come potete vedere infatti se imposto un valore di un solo byte superiore, il ping mi risponde che non può essere inviato:

img

Ora che conoscete il valore ottimale di MTU, dovrete impostarlo sul vostro router e su tutti i computer che accedono alla rete.


Impostare l'MTU su router e PC Windows


L'impostazione dell'MTU sul vostro router è piuttosto semplice. Basta accedere all'interfaccia web del router stesso, entrare nella sezione di configurazione della connessione e impostare il valore nell'apposito campo. Ricordatevi di riavviare il router al termine.

img

Per impostare l'MTU in ambiente Windows vi consiglio di scaricare il comodissimo programma DrTCP, che si presenta con un'interfaccia molto chiara e semplice, e vi consente di modificare vari parametri e poi salvare le impostazioni. Dopo il salvataggio dovrete riavviare il computer.

img

Se avete un sistema operativo Windows Vista o Windows 7 seguite questa guida per modificare il valore di MTU, e siete a posto (gli altri parametri TCP sono gestiti in maniera dinamica dal sistema operativo stesso). La seguente parte di questo post è indirizzata a utenti di sistemi Windows datati. La stessa applicazione DrTCP non funziona né su Vista né su 7.

Come potete vedere dall'immagine, oltre al valora di MTU, ci sono parecchi altri parametri. Il più importante tra quelli è senza dubbio RWIN (TCP Receive Window): si tratta della quantità di dati che il computer può accettare prima di comunicare alla sorgente che è pronto a ricevere altri pacchetti. Questo processo di invio/attesa può rallentare la connessione se non è configurato in modo idoneo alla larghezza di banda disponibile, e sui sistemi Windows datati generalmente è impostato un valore troppo basso. Aumentare il valore di RWIN crea una finestra più larga che consente a un quantitativo maggiore di informazioni di viaggiare senza interruzioni, fino a un certo valore limite. Dopo questo valore non viene percepita alcuna differenza.

Il valore di RWIN non è fisso, ma dipende dalla propria connessione e da alcuni parametri. Un'ottima formula per calcolare quello ottimale è la seguente:


(latenza media x 1,5 x velocità della linea in kbps) / 8



Per calcolare la latenza media è sufficiente utilizzare il comando 'ping' che abbiamo visto in precedenza verso un sito piuttosto lontano, avendo l'accortezza di aggiungere il parametro '-n 10' per ripetere il ping 10 volte. Il valore da prendere in considerazione è quello "Medio" mostrato al termine del processo.

Nell'esempio seguente il valore di latenza media misurato è 47ms:

img

Suggerisco di provare con più siti, e fare un'ulteriore media del ping. Nel mio caso un ping a www.google.com restituisce una media di 50 ms, mentre un ping a www.facebook.com ne restituisce una di 150 ms, e gli stessi valori sono riscontrati facendo il ping verso altri siti lontani. E' ragionevole quindi considerare un valore di latenza media di 100 ms.

La velocità della linea in kbps è molto semplicemente quella dichiarata nel vostro contratto con il gestore telefonico che avete scelto. Se, ad esempio, avete una ADSL da "7 Mega", la vostra velocità è di (1024 x 7) = 7168 kbps.
Tuttavia se avete accesso all'interfaccia di configurazione del vostro modem/router ADSL vi consiglio di controllare l'effettitva velocità di connessione e tenere quella in considerazione. In genere la trovate nella sezione "Stato" o "Informazioni connessione".

Io per esempio ho una ADSL 20 Mega, ma come potete vedere la velocità di connessione effettiva è inferiore:

img

Tutto questo è normale, e dipende dalla vicinanza della mia abitazione alla centralina. Il valore che ho considerato per il calcolo dell'RWIN è quindi 12000 kbps, arrotondando per eccesso da quello mostrato dal mio router, e non quello dichiarato nel contratto (che sarebbe dovuto essere 1024 * 20 = 20480 kbps).

Ora che abbiamo tutti i parametri possiamo agevolmente calcolare il valore RWIN.

Come esempio considererò i valori relativi alla mia connessione: latenza 100 ms, velocità 12000 kbps.


100 x 1,5 = 150
150 x 12000 kbps = 1800000
1800000 / 8 = 225000



Ci siamo quasi. Il valore ottenuto è molto vicino a quello ottimale, ma per una questione di architettura del protocollo TCP è opportuno che sia un multiplo della dimensione massima del corpo dati di un pacchetto (MSS - Maximum Segment Size). L'MSS è facilmente calcolabile: è pari all'MTU meno i 40 byte dell'intestazione. Nel mio caso, quindi, l'MSS è pari a 1360. Per arrotondare il valore di RWIN ottenuto quindi procediamo a dividerlo per l'MSS, arrotondare il valore ottenuto al successivo intero pari e ri-moltiplicarlo per l'MSS. Nel mio caso:


225000 / 1360 (MSS) = 165,44117647058823529411764705882
Arrotondiamo al successivo numero pari = 166
166 x 1360 = 225760 (RWIN ottimale)



Ci siamo! A questo punto abbiamo finalmente il nostro valore ottimale di RWIN (anni luce lontano da quello di default di Windows XP, che è impostato su 17520)! Ora sarà sufficiente eseguire DrTCP, compilare il campo "Tcp Receive Window" con il valore RWIN appena ottenuto, lasciare che il programma compili per noi i due valori "Window Scaling" e "Time Stamping" (per le connessioni wireless io consiglio di impostare quest'ultimo su Yes), selezionare l'adattatore di rete che usiamo per la connessione dall'apposito menu e impostare il valore di MTU che abbiamo trovato nella prima parte di questo post. Salvate, riavviate la macchina e godetevi i frutti della vostra faticaccia!

Se usate Ubuntu potete modificare l'MTU cliccando col destro sull'icona della connessione di rete e selezionare "Modifica conessioni" oppure tramite l'interfaccia Srumenti di Rete (la trovate in Sistema > Amministrazione). Se preferite la riga di comando, ecco una ottima guida. [ringrazio Lyserjik per avermi fatto notare di aver totalmente snobbato gli utenti Linux... -_-' perdono...]

NOTA: per testare i nuovi valori inseriti potete utilizzare il tool di analisi messo a disposizione sullo stesso sito da cui scaricare DrTCP. Vi basta cliccare su "Start", attendere il termine del processo, cliccare su Results, compilare le informazioni richieste e infine cliccare su Reccomend per avere un'analisi dettagliata e utili suggerimenti.

Spero vi sia stato utile. Se avete domande o dubbi, non esistate.
Darsch
_ chiavi di lettura:informatica, pc, internet, reti

_ potrebbero interessarti

_ Commento di Lyserjik _ profilo homepage
_ scritto il 20.01.2011 alle ore 09:15
Complimenti, post davvero molto esauriente e completo.
I parametri di connessione sono sempre stati una bestia nera per me, troppe sigle e troppe cose da sapere, l'attenzione scivola nel sonno già alla seconda definizione. Grazie a te, invece, sono riuscito ad arrivare sveglio fino alla fine! ;D

Vorrei aggiungere un paio di righe, invece, per quanto riguarda l'ottimizzazione in ambiente linux.
Chi usa Ubuntu può modifcare il parametro MTU direttamente cliccando col destro sull'icona della connessione di rete e scegliere "modifica conessioni" oppure tramite la completa interfaccia Srumenti di Rete, contenuta in Sistema/Amministrazione.
Per gli amanti della riga di comando, segnalo questa semplicissima quida qui:
http://monespaceperso.org/blog-en/2009/02/26/how-to-change-the-default-mtu-of-a-network-card-on-ubuntu/

Per quanto riguarda il TCP Receive Window, gli ultimi kernel linux includono l'autotuning che effettua i calcoli automaticamente, per cui non c'è bisogno di modifiche manuali. ;)
_ Commento di jasmines _ profilo
_ scritto il 20.01.2011 alle ore 10:38
Aggiungete una cache dns (http://www.helpwithwindows.com/WindowsXP/tune-24.html, http://vlaurie.com/computers2/Articles/dnscache.htm e http://www.isc.org/downloads/all se siete sotto winzozz, dnsmasq su linux), prefetch al browser (mi auguro usiate mozilla firefox) e andrete ancora meglio;)
_ Commento di Darsch _ profilo
_ scritto il 20.01.2011 alle ore 12:53
@Lyserjik - mi hai fatto notare giustamente di aver completamente ignorato gli utenti Linux... mi cospargo il capo di cenere e mi permetto, se per te va bene, di includere i tuoi suggerimenti in fondo al post principale. Grazie. ^_^

@jasmines - eccellenti consigli i tuoi!
_ Commento di jasmines _ profilo
_ scritto il 20.01.2011 alle ore 12:59
Dimenticavo di dire che il problema dell'MTU/RWIN è relativo alla connessione, al router, a tanti fattori.
Chi usa wi-fi, e cambia spesso punto di accesso (casa/lavoro/viaggi ecc.) non dovrebbe porsi il problema, optando per un valore "standard", cosa che tra l'altro tendono a garantire un po' tutti i fornitori di connettività.
Inoltre, occhio a fare i test senza caching dns, altrimenti il ping vi da' risultati sballati (TTL). Al limite pingate direttamente l'ip anziché il nome!
_ Commento di Lyserjik _ profilo homepage
_ scritto il 20.01.2011 alle ore 14:38
AAARGH!! I pinguini mascherati ti verranno a rapire nel sonno per punirti di questa gravissima dimenticanza!! >:D
_ Commento di Cuocopersonale _ profilo homepage
_ scritto il 21.01.2011 alle ore 01:32
Ti stimo fratello...
Io ci ho provato lo giuro.. ho scoperto che il mio mtu ottimale è 1464.. poi ci devo aggiungere 28.. poi.. poi.. poi non ci capisco nulla..
Aspetta un attimo.. forse è per quello che cucino e non lavoro con i pc...
Ma... ti stimo...
_ Commento di AjejeBrazorv _
_ scritto il 14.10.2012 alle ore 11:42
Ciao! Grazie per la guida, ma ho un problema, non riesco a trovare la mia dannata interfaccia web del router. Ho telecom e sto girando da ore, ma niente, un sito mi manda a un altro -.-
Puoi aiutarmi?
_ Commento di Darsch _ profilo
_ scritto il 15.10.2012 alle ore 23:58
@AjejeBrazorv - Ciao! Dovresti poter raggiungere l'interfaccia del router al solito indirizzo http://192.168.1.1 ... Non ti hanno dato nessun manuale insieme al router? Dovrebbe essere scritto lì.
_ Commento di delgado123 _
_ scritto il 27.12.2012 alle ore 20:11
ciao grazie per le preziose info che hai condiviso.
Sono arrivato al passaggio dove devo inserire il mio valore MTU nel s.o win 7,e qui nasce il problema perchè no mi accetta la stringa che ho copiato ovviamente con il mio valore,ti posto la riga così magari sei in grado di aiutarmi,grazie.
netsh interface ipv4 set subinterface "Local Area Connection" mtu=1492 store=persistent
_ Commento di Darsch _ profilo
_ scritto il 27.12.2012 alle ore 23:16
@delgado123 - ciao! Il nome dell'interfaccia "Local Area Connection" è quello della versione inglese di Windows 7, prova con questa:

netsh interface ipv4 set subinterface "Connessione alla rete locale" mtu=1492 store=persistent

Fammi sapere! :)

commenta

_ Puoi inviare un commento libero oppure accedere o registrarti per avere un tuo profilo e sfruttare appieno le funzionalità del sito.

Inserisci le due parole nell'apposito spazio:
(registrandoti al sito non dovrai più inserirle)

Accedi al sito o registrati

TOP
Utenti online: 42 ospiti
Ultimi utenti registrati: VALEGIU64, elenina75, babyzilla, antonella, La_Ele
Visite univoche ai post da dic. 2007: 2.666.185
Post totali: 1157
Commenti totali: 6747
© darsch.it [2007-2014] _ Powered by Tribe Studio.

Questo blog viene aggiornato senza alcuna periodicità e la frequenza degli articoli non è prestabilita, non può pertanto considerarsi un prodotto editoriale o una testata giornalistica ai sensi della legge n. 62 del 07/03/2001.

I contenuti di questo blog sono rilasciati sotto Licenza Creative Commons Attribuzione-Non commerciale-Non opere derivate 2.5 Italia, ad eccezione dei box 'citazione' o dove diversamente specificato. I commenti degli utenti sono di loro esclusiva proprietà e responsabilità.
Creative Commons License RSS 2.0 Valid XHTML 1.0