domenica 28 novembre 2010

Ping e Traceroute: mini-geografia di una rete

PING (aka "ICMP echo request")

Molto spesso sentiamo ormai parlare di PING in rete, ovvero di una tecnica per sondare se un certo computer (a volte, generalizzando, un certo servizio, ma non è di questo che parleremo in questo articolo) "risponde" in rete.

Strettamente parlando, il comando PING è l'interfaccia utente (a riga di comando) per generare un determinato tipo di pacchetti ICMP (vedi dettagli): esattamente viene generato un ICMP di tipo 8 ("echo request"), attraverso il quale si chiede al computer (host) destinatario di rispondere con un pacchetto ICMP di tipo 0 ("echo reply"). A questo punto, il nostro pacchetto ICMP viaggia in rete, seguendo la "strada" di un normale pacchetto IP (istradamento, e a volte filtraggio e prioritizzazione, a seconda dei casi). Sono possibili diversi scenari:

  1. il pacchetto ICMP tipo 8 arriva a destinazione, e il destinatario risponde con un pacchetto ICMP tipo 0 di ritorno (cioè scambiando IP di origine e destinazione); nel caso più semplice, tale risposta ritorna correttamente e l'utente viene informato con apposito messaggio, che riporta il cosiddetto RTT (round trip time), ossia il tempo lordo di andata-e-ritorno; diversamente, il pacchetto di ritorno può andare perduto, perché filtrato da firewall o scartato da router.

  2. il pacchetto ICMP tipo 8 non arriva a destinazione, perché filtrato da firewall o scartato da router nel suo viaggio di andata.


In tutti i casi in cui il pacchetto ICMP non "ritorna" al mittente entro un tempo prestabilito, l'utente viene informato con apposito messaggio. In questi casi, ovviamente, non è possibile avere informazioni sul RTT (tempo di andata-e-ritorno).

Bisogna inoltre tenere presente che, come tutti i pacchetti IP, il pacchetto ICMP porta con sé l'informazione di TTL (time to live), ovvero il massimo numero di "router" che può attraversare senza essere scartato. Questo valore viene solitamente impostato a 255, che consente di attraversare la rete in condizioni normali. Vedremo che proprio il TTL minore di 255 costituirà la tecnica per il tracciamento del percorso che descriveremo in seguito.

TRACEROUTE (aka "TTL expired")

Naturalmente, oltre a sapere se e come un computer (host) in rete "risponde" alle sollecitazioni di tipo PING viste sopra, risulta spesso interessante scoprire quale percorso sta seguendo il generico pacchetto IP dal nostro computer a quello che vogliamo raggiungere. Si parla quindi di Tracerouting (tracciare la rotta). Una tecnica semplice ma efficace per ottenere queste informazioni, consiste nell'inviare un pacchetto IP avente come valore del TTL un numero basso: se per esempio inviamo in ICMP echo request (PING) con TTL = 1, il primo router attraversato dal pacchetto decrementerà il TTL e, vedendolo arrivare a zero, risponderà con un ICMP tipo 11 (TTL expired), mettendo come destinazione l'IP originario e come sorgente il proprio IP (quello del router): in questo modo, sarà noto l'indirizzo IP del primo router attraversato dal pacchetto. Analogamente, facendo partire un successivo pacchetto con TTL = 2, il primo router verrà attraversato senza problemi, mentre il secondo risponderà con un ICMP tipo 11, rendendoci noto il suo IP. Proseguendo con la generazione di pacchetti aventi TTL via via crescenti, potremo ricostruire la catena di router attraversati per arrivare a destinazione.

Naturalmente, questa tecnica si basa sull'ipotesi che le reti attraversate facciano passare pacchetti ICMP e che i router rispettino lo standard che richiede di decrementare il TTL e di inviare ICMP tipo 11 "TTL expired" nel caso in cui il TTL vada a zero. Capita invece di trovarsi di fronte ad apparati che filtrano il traffico (firewall), a router che non rispondono in caso di TTL uguale a zero, e perfino a router che non decrementano il TTL. In questi casi, le informazioni sull'istradamento verso quella destinazione saranno incomplete o poco precise. Bisogna inoltre tenere presente che nello scenario "Big Internet" non è affatto detto che per andare da una certa origine a una certa destinazione i pacchetti passino sempre per lo stesso percorso: esistono ben noti algoritmi di ottimizzazione del traffico che possono istradare i pacchetti su percorsi diversi a seconda delle condizioni della rete e delle caratteristiche dei pacchetti stessi.

In definitiva: i comandi ping e traceroute (tracert sui sistemi Windows) possono essere utili strumenti per una prima diagnosi di raggiungibilità in rete, ma non costituiscono la "prova provata" di eventuali problemi di connettività, anche se spesso forniscono agli specialisti utili indizi per approfondire l'analisi.

Per la cronaca, il comando traceroute in uso sui sistemi *nix e Linux non utilizza (se non a richiesta) pacchetti ICMP, bensì pacchetti UDP, allo scopo di tentare di attraversare più router/firewall possibili verso la propria destinazione.

(vedi anche un mio documento: traceroute )