Salta al contenuto principale

ping: controlla se un computer risponde in rete

Inviato da tuxsa il

ping invia un piccolo messaggio a un altro computer (o a un sito) e aspetta la risposta. Serve a capire in pochi secondi se un dispositivo è raggiungibile, quanto tempo impiega a rispondere e se per strada si perdono dei pacchetti. È il primo comando che si prova quando "internet non funziona".

Cos'è

Il nome viene dal "ping" del sonar: si lancia un impulso e si misura il tempo dell'eco. Il programma usa il protocollo ICMP ( Internet Control Message Protocol ), pensato per i messaggi di servizio della rete: invia una echo request ("c'è qualcuno?") e attende una echo reply ("ci sono"). Su Debian e Ubuntu fa parte del pacchetto iputils-ping , su Fedora e Arch di iputils . Nelle installazioni minime e nei container può mancare: si installa con sudo apt install iputils-ping .

Cosa fa

Per ogni pacchetto inviato stampa una riga con il tempo di risposta, e alla fine un riepilogo con quanti pacchetti sono partiti, quanti sono tornati e quanto è durato in media il viaggio di andata e ritorno. Non modifica nulla sul tuo sistema e il carico sulla rete è minimo (un pacchetto al secondo di pochi byte).

Una differenza importante per chi arriva da Windows: lì ping si ferma da solo dopo quattro pacchetti, su Linux continua all'infinito finché non premi Ctrl + C , oppure finché non indichi un numero con -c .

Come si usa

$ ping [opzioni] destinazione

La destinazione può essere un indirizzo IP ( 8.8.8.8 ) o un nome ( example.org ). Nel secondo caso il sistema chiede prima l'indirizzo al servizio DNS.

Esempio 1: un ping e come leggerlo

$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=12.4 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=117 time=11.9 ms
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 11.912/12.168/12.424/0.256 ms

Il ^C è il Ctrl + C con cui si interrompe il comando. Le parti dell'output:

  • 56(84) bytes : 56 byte di dati, che diventano 84 con le intestazioni dei protocolli.
  • icmp_seq : numero progressivo del pacchetto. Se manca un numero, quel pacchetto non ha avuto risposta.
  • ttl ( time to live ): numero di "salti" che il pacchetto può ancora fare. Parte da un valore fisso e cala di uno a ogni router attraversato: serve a capire più o meno quanto è lontana la destinazione.
  • time : il tempo di andata e ritorno in millisecondi, detto latenza o RTT ( round trip time ).
  • packet loss : la percentuale di pacchetti che non sono tornati. Su una rete in salute dovrebbe essere 0%.
  • rtt min/avg/max/mdev : tempo minimo, medio, massimo e variazione media. Un mdev alto indica una connessione instabile.

Esempio 2: un numero fisso di pacchetti con -c

$ ping -c 4 example.org
PING example.org (93.184.215.14) 56(84) bytes of data.
64 bytes from 93.184.215.14: icmp_seq=1 ttl=55 time=38.2 ms
64 bytes from 93.184.215.14: icmp_seq=2 ttl=55 time=37.6 ms
64 bytes from 93.184.215.14: icmp_seq=3 ttl=55 time=39.0 ms
64 bytes from 93.184.215.14: icmp_seq=4 ttl=55 time=37.9 ms

--- example.org ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 37.601/38.180/39.012/0.560 ms

Con -c 4 il comando si ferma dopo quattro pacchetti, come su Windows. È la forma da usare negli script. Gli indirizzi e i tempi di questo e degli altri esempi sono solo indicativi: i tuoi saranno diversi.

Esempio 3: capire dove si rompe la connessione

Quando "internet non va", conviene provare a gradini, dal più vicino al più lontano:

$ ping -c 3 127.0.0.1           # 1. il tuo computer
$ ip route | grep default       # 2. quale è il router (gateway)?
default via 192.168.1.1 dev wlp2s0 proto dhcp metric 600
$ ping -c 3 192.168.1.1         # 3. il router di casa
$ ping -c 3 8.8.8.8             # 4. internet, senza usare nomi
$ ping -c 3 example.org         # 5. internet, con la risoluzione dei nomi

Il punto in cui i pacchetti smettono di tornare indica dove cercare:

Cosa non rispondeProbabile causa
Il passo 1Problema nella configurazione di rete del sistema stesso
Il passo 3Cavo, Wi-Fi o router di casa: non sei collegato alla rete locale
Il passo 4 (ma il 3 sì)Il router funziona, ma la connessione verso internet no (problema del provider o del collegamento)
Il passo 5 (ma il 4 sì)Problema di DNS : l'indirizzo funziona, i nomi no

Esempio 4: gli errori più comuni

$ ping example.invalid
ping: example.invalid: Nome o servizio sconosciuto

$ ping 192.168.1.250
PING 192.168.1.250 (192.168.1.250) 56(84) bytes of data.
From 192.168.1.20 icmp_seq=1 Destination Host Unreachable
From 192.168.1.20 icmp_seq=2 Destination Host Unreachable

$ ping 8.8.8.8
ping: connect: La rete non è raggiungibile
  • Nome o servizio sconosciuto ( Name or service not known ): il nome non si traduce in un indirizzo. Nome scritto male, oppure problema di DNS.
  • Destination Host Unreachable : la rete locale non trova il dispositivo (spento, indirizzo sbagliato, non collegato). L'avviso arriva dal tuo stesso computer o dal router.
  • La rete non è raggiungibile ( Network is unreachable ): il sistema non sa da che parte mandare i pacchetti, di solito perché manca la connessione o il router predefinito.
  • Righe che mancano senza messaggi : se i numeri di icmp_seq saltano, il pacchetto si è perso o la destinazione non risponde. Con -O ping segnala i pacchetti ancora in attesa ( no answer yet for icmp_seq=N ).

Esempio 5: limitare l'attesa con -W e -w

$ ping -c 3 -W 2 192.168.1.250
$ ping -w 10 8.8.8.8

Con -W 2 ( timeout ) si aspettano al massimo 2 secondi per ogni risposta. Con -w 10 ( deadline ) il comando termina comunque dopo 10 secondi in totale, qualunque cosa succeda: è utile negli script, per non restare bloccati.

Esempio 6: solo il riepilogo con -q

$ ping -c 10 -q 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

--- 8.8.8.8 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9013ms
rtt min/avg/max/mdev = 11.502/12.347/14.021/0.789 ms

Con -q ( quiet ) non vengono stampate le righe dei singoli pacchetti, e restano solo le statistiche finali.

Esempio 7: cambiare la frequenza dei pacchetti con -i

$ ping -c 5 -i 0.5 8.8.8.8
$ ping -c 5 -i 5 8.8.8.8

Con -i si imposta l'intervallo in secondi tra un pacchetto e l'altro: 1 secondo di default. Un utente normale non può scendere sotto 0,2 secondi; per frequenze più alte serve sudo , ed è comunque da evitare su macchine che non sono tue.

Esempio 8: scoprire la dimensione massima dei pacchetti (MTU)

$ ping -c 2 -M do -s 1472 8.8.8.8
$ ping -c 2 -M do -s 1464 8.8.8.8

Con -s si sceglie la dimensione dei dati e con -M do si vieta la frammentazione dei pacchetti. Alla dimensione dei dati vanno sommati 28 byte di intestazioni: con -s 1472 si prova una MTU di 1500, il valore tipico delle reti Ethernet. Se compare l'errore message too long (con l'indicazione di mtu= ), la strada ha un limite più basso: per esempio 1492 su molti collegamenti ADSL e fibra con PPPoE, che corrisponde a -s 1464 . Una MTU impostata male può far funzionare alcuni siti e altri no.

Esempio 9: IPv4, IPv6 e indirizzi locali

$ ping -4 -c 2 example.org
$ ping -6 -c 2 example.org
$ ping -c 2 ::1

Con -4 e -6 si sceglie il protocollo da usare. L'indirizzo ::1 è il corrispondente IPv6 di 127.0.0.1 , il computer stesso.

Esempio 10: tenere un registro dei problemi

$ ping -D -O 8.8.8.8 | tee connessione.log

Con -D ogni riga porta all'inizio il momento in cui è stata ricevuta, in formato Unix (secondi dal 1970), e con -O vengono segnalati i pacchetti senza risposta. Con tee , visto nell'articolo dedicato, si vede l'output a schermo e lo si salva. È il modo per documentare una connessione che cade a intermittenza, da mostrare al provider.

Esempio 11: estrarre la latenza media

$ LC_ALL=C ping -c 5 -q 8.8.8.8 | tail -n 1 | cut -d/ -f5
12.168

Si prende l'ultima riga con tail , che contiene rtt min/avg/max/mdev , e con cut , usando la barra come delimitatore, si estrae il quinto campo, cioè il valore medio. La variabile LC_ALL=C forza l'output in inglese, con il punto come separatore decimale: senza di essa la lingua e il formato dei numeri dipendono dalle impostazioni del sistema e potrebbero rompere lo script.

Esempio 12: il codice di uscita

$ ping -c 1 -W 2 8.8.8.8 > /dev/null
$ echo $?
0

ping restituisce 0 se ha ricevuto almeno una risposta, 1 se non ne ha ricevute, 2 per altri errori (come un nome non risolvibile). Si presta a essere usato in un if .

Esempio 13: uso negli script

#!/bin/bash
HOST="${1:-8.8.8.8}"

if ping -c 1 -W 2 "$HOST" > /dev/null 2>&1; then
  echo "$HOST raggiungibile"
else
  echo "$HOST NON raggiungibile" >&2
  exit 1
fi

Il controllo con un solo pacchetto e due secondi di attesa è abbastanza rapido da inserire in uno script. Per maggiore affidabilità conviene ripetere il controllo due o tre volte prima di dichiarare irraggiungibile un host, perché un singolo pacchetto può perdersi per caso. Un piccolo controllo periodico con registro:

#!/bin/bash
while true; do
  if ! ping -c 1 -W 2 8.8.8.8 > /dev/null 2>&1; then
    echo "$(date '+%F %T') connessione assente" >> "$HOME/disconnessioni.log"
  fi
  sleep 30
done

Esempio 14: quali dispositivi rispondono nella tua rete

$ seq 1 254 | xargs -P 50 -I{} sh -c 'ping -c 1 -W 1 192.168.1.{} > /dev/null && echo "192.168.1.{} risponde"'

Con seq si generano i numeri da 1 a 254 e con xargs -P 50 (visto nell'articolo dedicato) si lanciano fino a 50 ping in parallelo. Adatta l'indirizzo alla tua rete (lo vedi con ip route ) e usalo solo sulla rete di casa o dell'ufficio che gestisci : è un'attività che, su reti altrui, può dare fastidio o essere considerata ostile. Tieni presente che i dispositivi che bloccano ping non compariranno.

Opzioni utili

  • -c N : si ferma dopo N pacchetti.
  • -i secondi : intervallo tra un pacchetto e l'altro.
  • -W secondi : attesa massima per ciascuna risposta; -w secondi : durata massima dell'intero comando.
  • -q : stampa solo il riepilogo.
  • -s byte : dimensione dei dati; -M do : vieta la frammentazione (per provare la MTU).
  • -4 / -6 : forza IPv4 o IPv6.
  • -D : aggiunge la data e l'ora a ogni riga; -O : segnala i pacchetti senza risposta.
  • -n : non traduce gli indirizzi in nomi (output più rapido).
  • -I interfaccia : invia da una scheda di rete precisa (per esempio -I eth0 ).
  • -a : emette un suono a ogni risposta.

Attenzione a

  • Nessuna risposta non significa spento : molti server, router e servizi cloud bloccano i pacchetti ICMP con un firewall. Un sito può essere perfettamente funzionante e non rispondere al ping . Per verificare un servizio si prova direttamente la porta, per esempio con curl .
  • Una risposta non significa che il servizio funzioni : ping mostra che il computer è acceso e raggiungibile, non che il sito web, la posta o il database siano attivi.
  • Il tempo è di andata e ritorno : time=12 ms non vuol dire che il pacchetto ha impiegato 12 ms in una direzione, ma 12 in tutto. Il primo pacchetto è spesso più lento degli altri, perché serve a "scoprire" gli indirizzi sulla rete locale.
  • I router rallentano il ping dei loro messaggi : se in un'analisi più avanzata (con traceroute o mtr ) vedi perdite su un router intermedio ma non sulla destinazione finale, di solito è solo che quel router dà bassa priorità alle risposte.
  • Negli script usa sempre -c (e meglio ancora -W ): senza, il comando non finisce mai.
  • Non esagerare con la frequenza : pacchetti molto frequenti o molto grandi verso macchine altrui possono essere considerati un abuso. L'opzione -f ( flood ), riservata all'amministratore, serve solo per collaudi su reti proprie.
  • Operazione non permessa : nei container e in alcune installazioni minime ping non ha il permesso di aprire i socket necessari. Si risolve con sudo setcap cap_net_raw+p $(which ping) o, con Docker, concedendo la capacità NET_RAW .
  • DNS e latenza : il tempo di risoluzione del nome non rientra nel time dei pacchetti, ma se ping impiega molto a partire , il problema è quasi sempre il DNS.
  • Un solo test non basta : una perdita di un pacchetto su dieci può essere del tutto occasionale. Per valutare una connessione servono decine di pacchetti e, meglio, test in momenti diversi.

Riepilogo

ComandoCosa fa
ping host Invia pacchetti finché non premi Ctrl + C 
ping -c 4 host Invia 4 pacchetti e si ferma
ping -c 1 -W 2 host Test rapido, con attesa massima di 2 secondi
ping -w 10 host Si ferma comunque dopo 10 secondi
ping -c 10 -q host Stampa solo il riepilogo
ping -i 0.5 host Un pacchetto ogni mezzo secondo
ping -M do -s 1472 host Prova una MTU di 1500
ping -4 / ping -6 Forza IPv4 / IPv6
ping -D -O host | tee file Registra data, ora e pacchetti persi
LC_ALL=C ping -c 5 -q host | tail -n 1 | cut -d/ -f5 Estrae la latenza media
echo $? dopo ping 0 = risposta ricevuta, 1 = nessuna risposta, 2 = errore