1. Panoramica
In questo breve tutorial esploreremo come il comando ping di Linux può aiutarci a diagnosticare e risolvere i problemi di rete.
2. Sintassi
Cominciamo dando un'occhiata alla sintassi di base:
ping [OPTIONS] DESTINATION
Il comando ping (Packet INternet Groper) utilizza il protocollo ICMP (Internet Control Message) per inviare pacchetti a un server.
Per illustrare il comando ping , proviamo a effettuare il ping su www.ipfireitalia.it :
$ ping www.ipfireitalia.it
PING www.ipfireitalia.it (194.76.116.194): 56 data bytes
64 bytes from 194.76.116.194: icmp_seq=0 ttl=54 time=202.324 ms
64 bytes from 194.76.116.194: icmp_seq=1 ttl=54 time=171.035 ms
^C
--- www.ipfireitalia.it ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 171.035/181.566/202.324 /11.452 ms
Innanzitutto, il comando ping determina l'indirizzo IP dal nome di dominio specificato.
Successivamente, inizia a inviare pacchetti ICMP al server.
Quando il pacchetto raggiunge la destinazione, il server risponde e il comando ping visualizza una riga sulla nostra console.
Per impostazione predefinita, stampa una riga che include le seguenti informazioni:
- Numero di byte inviati , che per impostazione predefinita è 64 byte di dati ICMP
- Indirizzo IP di destinazione , in questo caso, 194.76.116.194
- Numero di sequenza del pacchetto ICMP , ad esempio, icmp_seq=0
- Tempo di vita (TTL) , indica il numero di salti prima che il pacchetto venga eliminato, qui è 54
- Tempo di andata e ritorno del comando ping , in questo caso 202.324 ms
Quindi, possiamo vedere che invia pacchetti ICMP in modo continuo e dobbiamo interrompere manualmente l'invio dei pacchetti utilizzando Ctrl + C (Windows) o Comando + C (Mac).
Inoltre, mostra la percentuale di pacchetti persi a causa di problemi di rete.
3. Utilizzo di base
Ora che abbiamo visto l'output predefinito, è il momento di vedere alcune delle opzioni in azione.
3.1. Specifica dell'intervallo tra i pacchetti
Per impostazione predefinita, il comando ping invia un nuovo pacchetto ogni secondo.
Usiamo il flag -i per modificare l'intervallo del ping :
$ ping -i 3 www.ipfireitalia.it
PING www.ipfireitalia.it (194.76.116.194): 56 data bytes
64 bytes from 194.76.116.194: icmp_seq=0 ttl=54 time=190.037 ms
64 bytes from 194.76.116.194: icmp_seq=1 ttl=54 time=186.061 ms
64 bytes from 194.76.116.194: icmp_seq=2 ttl=54 time=187.458 ms
^C
--- www.ipfireitalia.it ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 186.061/187.852/190.037/1.647 ms
Ora non c'è alcun output che lo dimostri, ma eseguendolo possiamo vedere che otteniamo una nuova riga di output ogni tre secondi.
3.2. Controllo del numero di pacchetti
In pratica, utilizziamo spesso l' opzione -c per specificare il numero di pacchetti ICMP che vogliamo inviare al server di destinazione:
$ ping -c 3 www.ipfireitalia.it
PING www.ipfireitalia.it (194.76.116.194): 56 data bytes
64 bytes from 194.76.116.194: icmp_seq=0 ttl=54 time=191.813 ms
64 bytes from 194.76.116.194: icmp_seq=1 ttl=54 time=177.645 ms
64 bytes from 194.76.116.194: icmp_seq=2 ttl=54 time=186.750 ms
--- www.ipfireitalia.it ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 177.645/185.403/191.813/5.862 ms
Come possiamo vedere sopra, abbiamo inviato solo 3 pacchetti ICMP anziché un flusso continuo di pacchetti.
3.3. Specificazione della dimensione del pacchetto
Inoltre, il ping ci consente anche di specificare la dimensione del pacchetto utilizzando il -s flag :
$ ping -s 40 -c 4 www.ipfireitalia.it
PING www.ipfireitalia.it (194.76.116.194): 40 data bytes
48 bytes from 194.76.116.194: icmp_seq=0 ttl=54 time=180.801 ms
48 bytes from 194.76.116.194: icmp_seq=1 ttl=54 time=181.822 ms
48 bytes from 194.76.116.194: icmp_seq=2 ttl=54 time=175.019 ms
48 bytes from 194.76.116.194: icmp_seq=3 ttl=54 time=172.405 ms
--- www.ipfireitalia.it ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 172.405/177.512/181.822/3.927 ms
Nell'esempio precedente abbiamo utilizzato sia l'opzione -s che -c insieme. Di conseguenza, sono stati inviati solo quattro pacchetti, ciascuno di 40 byte (ICMP: 48 byte).
Questo può essere utilizzato per determinare la latenza nella rete a diverse dimensioni di pacchetto.
Ad esempio, in molte reti complesse, si verificano problemi quando la dimensione del pacchetto supera i 1500 byte. Modificando la dimensione del pacchetto, possiamo determinare la dimensione ideale per il nostro sistema.
4. Utilizzo avanzato
Diamo ora un'occhiata alle opzioni più avanzate.
4.1 Specificare un timeout
In pratica, su una rete congestionata, potrebbe essere utile impostare un timeout per la risposta dopo un periodo di attesa specifico . Possiamo farlo con l' -W : opzione
$ ping -c 4 -W 2 www.ipfireitalia.it
PING www.ipfireitalia.it (194.76.116.194): 56 data bytes
--- www.ipfireitalia.it ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss, 4 packets out of wait time
round-trip min/avg/max/stddev = 192.397/195.137/198.573/2.480 ms
Per prima cosa, inviamo la richiesta al server.
Poi, aspettiamo due secondi per ricevere una risposta.
Grazie alla bassa latenza della nostra rete, abbiamo ricevuto tutti i pacchetti correttamente senza alcuna perdita.
4.2. Inondazione della rete tramite ping
A volte vogliamo testare le prestazioni della rete inviando quanti più pacchetti possibile.
Per illustrare questo concetto, eseguiamo il comando ping utilizzando l' opzione -f :
$ ping -f localhost
PING localhost (127.0.0.1): 56 data bytes
..Request timeout for icmp_seq 250
.Request timeout for icmp_seq 251
.Request timeout for icmp_seq 252
.Request timeout for icmp_seq 253
...
^C
--- localhost ping statistics ---
271 packets transmitted, 250 packets received, 7.7% packet loss
round-trip min/avg/max/stddev = 0.010/0.019/0.049/0.005 ms
In questo caso specifico, abbiamo inviato 271 pacchetti con un tempo medio di andata e ritorno di 0,019 secondi.
4.3. Recupero del riepilogo di rete
Successivamente, possiamo recuperare il riepilogo della rete utilizzando il comando con l'aiuto del flag -q :
Per prima cosa, eseguiamo il comando ping utilizzando entrambi i flag -c e -q :
$ ping -c 4 -q www.ipfireitalia.it
PING www.ipfireitalia.it (194.76.116.194): 56 data bytes
--- www.ipfireitalia.it ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 180.232/189.512/206.033/10.120 ms
Pertanto, questa opzione viene utilizzata per eseguire il comando in modalità silenziosa.
In questo caso, otteniamo solo un riepilogo e non vediamo i dettagli dei singoli pacchetti inviati.
4.4. Utilizzo del ping udibile
Eseguiamo l' utilità ping in modalità udibile utilizzando il flag -a :
$ ping -a www.google.com
PING www.google.com (172.217.163.164): 56 data bytes
64 bytes from 172.217.163.164: icmp_seq=0 ttl=54 time=107.001 ms
64 bytes from 172.217.163.164: icmp_seq=1 ttl=54 time=52.143 ms
64 bytes from 172.217.163.164: icmp_seq=2 ttl=54 time=54.163 ms
^C
--- www.google.com ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 52.143/71.102/107.001/25.398 ms
Qui possiamo sentire un segnale acustico ogni volta che il nostro client riesce a raggiungere il server host.
5. Conclusion
In questo breve tutorial abbiamo visto come utilizzare il comando ping .
Per prima cosa abbiamo visto come controllare l'intervallo, la dimensione e il numero di pacchetti che inviamo nel comando.
Infine, abbiamo esplorato alcuni utilizzi avanzati, come il recupero del riepilogo della rete e il flooding della rete.
