# ICMP (Internet Control Message Protocol)

ICMP è un protocollo fondamentale nel networking, utilizzato sia in IPv4 che in IPv6 (ICMPv6). Appartenente al livello 3 del modello ISO/OSI (Network Layer) e non trasporta dati applicativi ma viene impiegato per trasmettere messaggi sullo stato di rete e per segnalare errori.

## Funzionalità principali

1. **Segnalazione degli errori:**  quando un router rileva un problema (ad esempio, la destinazione non è raggiungibile, non è in grado di inoltrare il pacchetto o il TTL, Time To Live, è scaduta), genera un pacchetto ICMP per informare il mittente dell'errore verificatosi. Questi messaggi aiutano a diagnosticare e risolvere problemi di rete
2. **Meccanismo Query-Response:** ICMP supporta operazioni di richiesta e risposta, essenziali per le diagnostiche di rete. Un tipico esempio è l'uso dei messaggi `Echo Request` ed `Echo Reply` che costituiscono la base del comando `ping`.  

## Il comando ping

Il comando `ping` è uno strumento diagnostico che sfrutta ICMP per testare la connessione di rete. Invia un pacchetto `ICMP Echo Request` a un indirizzo IP specificato e attende una risposta `Echo Reply`

```bash
> ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=54 time=65.9 ms
64 bytes from 1.1.1.1: icmp_seq=2 ttl=54 time=242 ms
64 bytes from 1.1.1.1: icmp_seq=3 ttl=54 time=164 ms
64 bytes from 1.1.1.1: icmp_seq=4 ttl=54 time=192 ms
^C
--- 1.1.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 65.939/166.214/242.448/64.330 ms
```

Nell'output:

- *ttl* (Time To Live) mostra il valore residuo del campo TTL, che diminuisce ad ogni hop
- *time* indica il tempo impiegato per il percorso andata e ritorno (round-trip time, *rtt*)
