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.
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.
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:
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.
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:
la figura mostra un incapsulamento innestato. Un pacchetto ICMP dentro un datagramma, dentro un frame.
ICMP Type | Message |
---|---|
0 | Echo reply |
3 | Destination unreachable |
4 | Source quench |
5 | Redirect |
8 | Echo |
9 | Router advertisement |
10 | Router selection |
11 | Time exceeded |
12 | Parameter problem |
13 | Timestamp |
14 | Timestamp reply |
15 | Information request |
16 | Information reply |
17 | Address mask request |
18 | Address mask reply |
30 | Traceroute |
Abbiamo già visto nella figura in cima la struttura di un pacchetto ICMP.
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.
Tipi di errore:
Query:
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:
Il funzionamento si base sui medesimi messaggi di controllo di ICMP:
Quando un router non può raggiungere una destinazione, allora invia un messaggio ICMP con type = 3 (destinazione irraggiungibile).
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.
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:
Abbiamo quindi tre scenari (due entranti e uno uscente):
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:
Altre query ICMP: