ICMP - Internet Control Message Protocol

Il protocollo ICMP (internet control message protocol) viene usato da host e router per scambiarsi informazioni a livello di rete, il suo uso più tipico è la notifica degli errori. Durante una sessione HTTP si potrebbe cercare di accedere ad un sito che non esiste, in tal caso viene notificato un errore, che viene emesso grazie a ICMP. Da qualche parte in internet un router IP non è riuscito ad instradare il pacchetto e ha inviato un messaggio ICMP verso l'origine.
ICMP è considerato parte di IP, ma in realtà si colloca sopra di esso.
Pasted image 20231011115652.png
I messaggi di ICMP vengono trasportati nei datagrammi IP: ossia come payload di IP, esattamente come segmenti TCP o UDP. Se un host riceve un datagramma IP che specifica ICMP come protocollo di livello superiore (e non TCP o UDP), allora effettua il demultiplexing dei contenuti del datagramma a ICMP, esattamente come farebbe per contenuti TCP o UDP.
Pasted image 20231011115918.png
Un programma come ping o traceroute usano ICMP per portare a termine il loro compito.
ICMP consente ai router di inviare messaggi d'errore e di controllo ad altri router e/o host.
Inoltre rende possibile la comunicazione tra un software IP su una macchina e il software IP di un'altra.ICMP è stand-alone (indipendente).
È obbligatorio implementare ICMP con IP: i messaggi ICMP viaggiano nella parte dati di IP, ma sono interpretati da IP stessa.
Nella maggior parte dei casi i messaggi ICMP non sono generati dai router, ICMP non è ristretto ai soli router: anche gli host possono generare messaggi ICMP (con alcune restrizioni).
I pacchetti ICMP ricadono in due categorie:

  • Messaggi d'errore: sono inviati quando pacchetti non-ICMP incontrano alcune difficoltà
  • Risposte/richieste: pacchetti ICMP richiedono informazioni e pacchetti ICMP rispondono a queste richieste.
Cosa ICMP non fornisce
...

ICMP non fornisce un meccanismo che consente l'interazione tra un router e una sorgente che ha causato malfunzionamenti con il suo comportamento.
ICMP non fornisce il mantenimento di informazioni di stato (ogni pacchetto è gestito in modo indipendente).
In pratica: quando un datagramma causa un errore ICMP può solo indicare la condizione d'errore alla sorgente del datagramma (chi ha inviato il datagramma), che deve riferire l'errore ad un singolo programma (probabilmente quello da cui è partito il datagramma) o eseguire una qualche operazione per risolvere il problema generato.
ICMP è un meccanismo per riportare errori: non ti dice come risolverlo, né intraprende un qualche operazione per risolvere. Semplicemente riporta l'errore alla sorgente del datagramma. I router intermedi non sono informati di cosa ci sia dentro il datagramma/frame. La sorgente del datagramma nella maggior parte dei casi non è responsabile dell'errore e non è in grado di correggerlo.

Perché inviare errori alla sorgente?

Il datagramma contiene l'IP di destinazione e di sorgente. Non c'è un modo di inviare l'errore ad un router intermedio nel percorso di routing, poiché le tabelle di routing possono cambiare. Quindi il pacchetto viene rimandato indietro alla sorgente.

Per rendere chiaro in quale punto si colloca ICMP:
Pasted image 20231011120332.png
la figura mostra un incapsulamento innestato. Un pacchetto ICMP dentro un datagramma, dentro un frame.

Tipi di messaggio ICMP
...
ICMP TypeMessage
0Echo reply
3Destination unreachable
4Source quench
5Redirect
8Echo
9Router advertisement
10Router selection
11Time exceeded
12Parameter problem
13Timestamp
14Timestamp reply
15Information request
16Information reply
17Address mask request
18Address mask reply
30Traceroute
Formato dei messaggi ICMP
...

Abbiamo già visto nella figura in cima la struttura di un pacchetto ICMP.
Pasted image 20231011115918.png
Type: 8 bit
Code: 8 bit
Checksum: 16 bit (del pacchetto ICMP)

Type specifica che la destinazione è irraggiungibile.
Code specifica se si tratta di un host o di una rete.

Segnalazione degli errori (error reporting)
...
  • ICMP segnala l'errore (non è una procedura di correzione)
  • L'evento d'errore viene segnalato alla sorgente del datagramma IP
  • Il messaggio d'errore contiene: l'intestazione IP e i primi 8 byte del pacchetto che ha causato errore.

Tipi di errore:

  • Destinazione irraggiungibile (type 3)
  • Redirect (type 5)
  • Time exceed (type 11)
  • Parameter problem (type 12)

Query:

  • Echo request/reply (ping) (type 8/0)
  • Timestamp request/reply (type 12/14)
  • Address mask request/reply (type 17/18)
PING
...

Echo request e echo reply sono tra le più utilizzate.
Il mittente invia un echo request al destinatario, che risponde con un echo reply.
La risposta, inviata verso la sorgente del datagramma, contiene (facoltativamente) una copia dei dati che il datagramma originale può opzionalmente contenere. Il che vuol dire che il messaggio echo reply può contenere una copia dei dati che erano presenti nel messaggio echo request. Questi dati possono essere utilizzati per testare la funzionalità di un servizio o di un'applicazione.
Uno scambio di echo request/echo reply indica che:

  • la macchina sorgente (il suo software IP) è in grado di instradare pacchetti verso quella destinazione;
  • i router intermedi sono attivi e funzionanti e instradano correttamente i pacchetti da sorgente a destinazione;
  • il software IP di destinazione è in esecuzione (può rispondere agli interrupt) e sa come instradare verso l'origine;
  • i router intermedi sono attivi e funzionanti e instradano correttamente i pacchetti da destinazione a sorgente.
    Questo è il modo in cui funziona ping.
    Pasted image 20231011121503.png
    I pacchetti ICMP con type a 11 è utilizzato per notificare scadenza del tempo di vita di un datagramma:
  • Code = 0: inviato dai router alla sorgente del pacchetto quando il campo TTL è decrementato fino a 0.
  • Code = 1: inviato dalle destinazioni, quando non tutti i frammenti di un datagramma IP arrivano con il TTL massimo.
TRACEROUTE
...

Pasted image 20231011121627.png
Il funzionamento si base sui medesimi messaggi di controllo di ICMP:

  1. viene inviata una echo request con TTL = 1;
  2. al router TTL viene decrementata di 1, TTL = 0: il router invia echo reply;
  3. viene inviata una echo request con TTL = 2;
  4. ad ogni hop TTL viene decrementata di 1, quando TTL = 0: il router due invia echo reply
    i passi si ripetono ciclicamente fino a che non viene raggiunta la destinazione (oppure si supera il limite di hop, posto a 30 in genere).
Destinazione irraggiungibile
...

Quando un router non può raggiungere una destinazione, allora invia un messaggio ICMP con type = 3 (destinazione irraggiungibile).

Redirect
...

Usato da un host o un router per far sapere all'host mittente che i pacchetti devono essere inoltrati ad un altro indirizzo. Una rete può avere più di un router. Uno di essi funge da gateway predefinito. Questo router è dove un host invia i pacchetti se non sa dove inviarli. Se il router predefinito determina che l'host avrebbe dovuto inviare il messaggio a un altro router, inoltra il messaggio a quel router, ma invia anche un messaggio di re-indirizzamento ICMP all'origine in modo che aggiorni la sua tabella e invii qualsiasi messaggio futuro con quella destinazione al router corretto.

ICMP source quench
...

Source quench è maccanismo basato su ICMP usato dai dispositivi di rete per informare il mittente che i pacchetti non possono essere inoltrati a causa di buffer overload (sovraccarico).
La congestione può verificarsi per tre ragioni:

  • Una macchina può generare più traffico di quanto una sottorete può assorbirne
  • Più macchine possono generare più traffico di quanto una sottorete può assorbire
  • Il traffico che arriva al router è maggiore rispetto a quanto il router può processarne

Abbiamo quindi tre scenari (due entranti e uno uscente):

  • Unica sorgente: una macchina è connessa ad una LAN veloce, e genera traffico verso un host localizzato in una sottorete lenta attraverso un router. Il router davanti alla sottorete lenta riceve più pacchetti di quanti ne può smaltire in uscita: congestione in uscita.
  • Più sorgenti: anche se nessuna delle macchine generano ognuno un flusso di dati di entità maggiore rispetto la capacità di traffico gestibile dalla sottorete di destinazione. Il traffico aggregato (somma del traffico generato dai singoli host) può generare una grossa quantità di traffico: un router può avere diverse interfacce, ma il flusso dati si risolve verso un'unica linea uscente: congestione in uscita.
  • In input: il router non ha sufficiente capacità di elaborazione per gestire tutti i messaggi che arrivano da una o più sotto-reti. Ritarda nella lettura dei messaggi, i pacchetti vengono scartati dall'hardware della sottorete (esempio: ethernet) e si verifica congestione in entrata (il router non è in grado di gestirlo).

Nei primi due casi il router notifica ciò che è congestionato, nel caso 3 notificare non è possibile.
Quindi non ci si può aspettare che i router segnalino sempre la congestione.
Come sappiamo IP è senza controllo di flusso e di congestione.
L'host sorgente non sa mai se l'host di destinazione è stato sovraccaricato con dei datagrammi (a differenza del livello di trasporto in cui, con TCP, si ha un riscontro di questo tipo).
I messaggi di tipo source-quench in ICMP sono stati progettati per fornire un qualche controllo del flusso e della congestione in IP.
Quando un router o un host rifiuta un datagramma dovuto alla congestione (di IP), invia una messaggio di tipo source-quench al mittente del datagramma.

Gli scopi del messaggi source-quench sono due:

  1. informare il mittente che il datagramma è stato rifiutato;
  2. avvertire il mittente che c'è una congestione da qualche parte nel percorso e che tale sorgente dovrebbe rallentare (quench) il processo di invio di datagrammi.
    Ad ogni modo non c'è nessun controllo della congestione in IP.

Altre query ICMP:

  • Timestamp request/reply: type 13/14. Usato per lo scambio di informazioni sui tempi del mittente e del destinatario.
  • Timestamp origine: fornito dalla sorgente
  • Timestamp di ricezione: fornito dalla destinazione non appena un pacchetto è ricevuto
  • Timestamp di trasmissione: fornito dalla destinazione immediatamente prima di inviare la timestamp reply
  • Indirizzo di maschera request/reply: type 17/18. Consente ad un host di determinare la maschera di sottorete in uso nella rete locale.
  • Router solicitation e advertisement. Un host che vuole inviare dati ad un host su un'altra rete, deve conoscere l'indirizzo dei router collegati alla sua stessa rete. Inoltre l'host deve sapere se i router sono funzionanti. La router solicitation e la router advertisiment possono aiutare in queste situazioni. Un host può inviare in broadcast un messaggio di router solicitation. Il router o i router he ricevono tale messaggio inviano in broadcast le loro informazioni di routing usando un messaggio di router-advertisement, sempre in broadcast. Un router può anche inviare un messaggio anche se nessun host ha inviato messaggi di sollecitazione. Un router quando risponde, non invia solo informazioni riguardo sé stesso, ma riguardo tutti i router sulla rete (in particolare se sono funzionanti (alive) o no).