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:
Mentre questo è un ping riuscito, e viene restituito se il pacchetto ha dimensioni pari o inferiori a quelle dell'MTU massimo supportato dalla rete:
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:
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.
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.
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:
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:
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.
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. ;)