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] destinazioneLa 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 msIl ^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. Unmdevalto 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 msCon -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 nomiIl punto in cui i pacchetti smettono di tornare indica dove cercare:
| Cosa non risponde | Probabile causa |
|---|---|
| Il passo 1 | Problema nella configurazione di rete del sistema stesso |
| Il passo 3 | Cavo, 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_seqsaltano, il pacchetto si è perso o la destinazione non risponde. Con-O pingsegnala 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.8Con -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 msCon -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.8Con -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.8Con -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 ::1Con -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.logCon -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.168Si 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 $?
0ping 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
fiIl 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
doneEsempio 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 concurl. - Una risposta non significa che il servizio funzioni :
pingmostra 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 msnon 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
pingdei loro messaggi : se in un'analisi più avanzata (contracerouteomtr) 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 minimepingnon ha il permesso di aprire i socket necessari. Si risolve consudo 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
timedei pacchetti, ma sepingimpiega 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
| Comando | Cosa 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 |