Introduction (Introduzione)
L'Internet Protocol (IP, Protocollo Internet) [1] viene utilizzato per il servizio datagramma host-to-host in un sistema di reti interconnesse chiamato catenet [2]. I dispositivi di interconnessione di rete sono chiamati gateway. Questi gateway comunicano tra loro a scopi di controllo tramite un Gateway to Gateway Protocol (GGP, Protocollo Gateway-a-Gateway) [3,4]. Occasionalmente un gateway o un host di destinazione comunicherà con un host sorgente, ad esempio per segnalare un errore nell'elaborazione del datagramma. Per tali scopi viene utilizzato l'Internet Control Message Protocol (ICMP). ICMP utilizza il supporto di base di IP come se fosse un protocollo di livello superiore, tuttavia ICMP è in realtà una parte integrante di IP e deve essere implementato da ogni modulo IP.
I messaggi ICMP vengono inviati in diverse situazioni: ad esempio, quando un datagramma non può raggiungere la sua destinazione, quando il gateway non ha la capacità di buffer per inoltrare un datagramma e quando il gateway può indirizzare l'host a inviare traffico su un percorso più breve.
L'Internet Protocol non è progettato per essere assolutamente affidabile. Lo scopo di questi messaggi di controllo è fornire feedback sui problemi nell'ambiente di comunicazione, non rendere IP affidabile. Non ci sono ancora garanzie che un datagramma verrà consegnato o che un messaggio di controllo verrà restituito. Alcuni datagrammi potrebbero ancora non essere consegnati senza alcuna segnalazione della loro perdita. I protocolli di livello superiore che utilizzano IP devono implementare le proprie procedure di affidabilità se è richiesta una comunicazione affidabile.
I messaggi ICMP tipicamente segnalano errori nell'elaborazione dei datagrammi. Per evitare la ricorsione infinita di messaggi su messaggi, ecc., non vengono inviati messaggi ICMP sui messaggi ICMP. Inoltre, i messaggi ICMP vengono inviati solo sugli errori nell'elaborazione del frammento zero dei datagrammi frammentati. (Il frammento zero ha un offset di frammento pari a zero).
Principi di progettazione importanti
1. Parte del livello IP
Livello applicazione
↓
Livello trasporto (TCP/UDP)
↓
Livello rete (IP + ICMP) ← ICMP è parte integrante di IP
↓
Livello collegamento dati
ICMP non è un protocollo di livello superiore che utilizza IP; piuttosto, è una parte integrante del livello IP stesso.
2. Segnalazione errori, non affidabilità
Cosa fa ICMP:
- ✅ Segnala problemi nell'elaborazione dei datagrammi
- ✅ Fornisce feedback sulle condizioni di rete
- ✅ Assiste nella diagnostica di rete
Cosa NON fa ICMP:
- ❌ Garantire la consegna dei messaggi
- ❌ Rendere IP affidabile
- ❌ Fornire affidabilità end-to-end
- ❌ Implementare il controllo di flusso
3. Nessuna ricorsione infinita
Regola: I messaggi ICMP non vengono mai inviati sui messaggi ICMP.
Datagramma con errore
↓
Messaggio di errore ICMP inviato ✅
↓
Messaggio ICMP con errore
↓
NESSUN messaggio di errore ICMP inviato ❌ (Previene loop infinito)
Esempio:
1. Pacchetto TCP → Datagramma IP → Si verifica un errore
→ ICMP Destination Unreachable inviato ✅
2. ICMP Destination Unreachable → Si verifica un errore
→ NESSUN messaggio ICMP inviato ❌
Questo previene le cascate di messaggi di errore
4. Regola del frammento zero
I messaggi di errore ICMP vengono inviati solo per il primo frammento (offset frammento = 0) di un datagramma frammentato.
Datagramma originale (frammentato):
┌─────────────┬─────────────┬─────────────┐
│ Frammento 0 │ Frammento 1 │ Frammento 2 │
│ offset=0 │ offset=500 │ offset=1000 │
└─────────────┴─────────────┴─────────────┘
↓ ↓ ↓
Errore Errore Errore
↓ ↓ ↓
ICMP inviato ✅ Nessun ICMP ❌ Nessun ICMP ❌
Motivazione:
- Evita di generare più messaggi di errore per lo stesso datagramma originale
- Assicura che la segnalazione errori sia gestibile
- Solo il primo frammento contiene informazioni complete del protocollo di livello superiore
Scenari comuni per i messaggi ICMP
Scenario 1: Destinazione non raggiungibile
Host A → Router → [Rete B è inattiva]
↓
ICMP Type 3: Destination Unreachable
↓
Host A riceve notifica errore
Scenario 2: Reindirizzamento
Host A → Gateway 1 → Gateway 2 → Destinazione
↓
ICMP Type 5: Redirect
"Usa Gateway 2 direttamente per questa destinazione"
↓
Host A aggiorna tabella di routing
Scenario 3: Tempo scaduto
Pacchetto con TTL=1
↓
Router decrementa TTL a 0
↓
ICMP Type 11: Time Exceeded
↓
Host sorgente riceve notifica
Scenario 4: Limitazione sorgente (controllo congestione)
Buffer del gateway pieno
↓
ICMP Type 4: Source Quench
↓
Host sorgente riduce velocità di trasmissione
Nota: Source Quench è ora obsoleto (RFC 6633) a causa dell'inefficacia e del potenziale abuso.
Relazione con altri protocolli
ICMP e IP
Datagramma IP:
┌─────────────┬──────────────────┐
│ Header IP │ Payload IP │
│ Protocol=1 │ Messaggio ICMP │
└─────────────┴──────────────────┘
Header IP:
- Campo Protocol = 1 (indica ICMP)
- Source Address = Mittente ICMP
- Destination Address = Destinatario ICMP
ICMP e GGP
Gateway to Gateway Protocol (GGP):
- I gateway utilizzano GGP per la comunicazione di controllo tra loro
- ICMP viene utilizzato per la comunicazione gateway-a-host
- Scopi diversi, protocolli complementari
ICMP e protocolli di livello superiore
Applicazione (es. utility Ping)
↓ Costruisce messaggio ICMP
Livello IP con modulo ICMP
↓ Invia ICMP in datagramma IP
Interfaccia di rete
Esempi di segnalazione errori
Esempio 1: Host non raggiungibile
Passo 1: Host A invia pacchetto a Host B (10.0.2.100)
┌─────────────────────────────┐
│ Src: 10.0.1.10 │
│ Dst: 10.0.2.100 │
│ Data: "Hello" │
└─────────────────────────────┘
Passo 2: Router R1 determina che Host B non è raggiungibile
Tabella di routing del Router R1: Nessun percorso per 10.0.2.0/24
Passo 3: Router R1 invia ICMP Destination Unreachable
┌─────────────────────────────┐
│ ICMP Type: 3 │
│ Code: 1 (Host Unreachable) │
│ Contiene: Header IP + 64 │
│ bit del │
│ datagramma │
│ originale │
└─────────────────────────────┘
Passo 4: Host A riceve ICMP e segnala errore all'applicazione
Esempio 2: Frammentazione richiesta ma DF impostato
Passo 1: Host A invia pacchetto grande con flag Don't Fragment (DF)
┌─────────────────────────────┐
│ Src: 192.168.1.10 │
│ Dst: 203.0.113.50 │
│ Flags: DF=1 (Don't Fragment)│
│ Length: 1500 bytes │
└─────────────────────────────┘
Passo 2: Router R1 riceve pacchetto
- MTU interfaccia in uscita = 1000 byte
- Dimensione pacchetto = 1500 byte
- Flag DF impostato → Non può frammentare
Passo 3: Router R1 invia ICMP Destination Unreachable
┌─────────────────────────────┐
│ ICMP Type: 3 │
│ Code: 4 (Fragmentation │
│ needed but DF set) │
│ Next-Hop MTU: 1000 │
└─────────────────────────────┘
Passo 4: Host A riceve ICMP
- Implementa Path MTU Discovery
- Riduce dimensione pacchetto a 1000 byte
- Ritrasmette i dati
Questo è un meccanismo critico per la Path MTU Discovery (PMTUD) [RFC 1191].
Regole di elaborazione
Per i mittenti ICMP
-
Determinare se inviare ICMP:
- Questa è una condizione di errore?
- Riguarda un messaggio ICMP? (Se sì, non inviare)
- Riguarda il frammento zero? (Se non frammento zero, non inviare)
-
Costruire messaggio ICMP:
- Impostare Type e Code appropriati
- Calcolare checksum
- Includere header IP originale + 64 bit di dati originali
-
Inviare tramite IP:
- Usare protocollo IP 1 (ICMP)
- Impostare campi header IP appropriati
Per i destinatari ICMP
-
Validare messaggio:
- Verificare checksum
- Controllare valori Type e Code
-
Elaborare per Type:
- Messaggi di errore: Segnalare al protocollo di livello superiore
- Messaggi di richiesta: Generare risposta
- Messaggi informativi: Elaborare appropriatamente
-
Passare al gestore appropriato:
- Demultiplexare in base alle informazioni del datagramma originale
- Notificare protocollo o applicazione interessata
Contesto storico: ICMP è stato definito in RFC 792 (Settembre 1981) come parte della suite di protocolli Internet originale. Rimane un componente fondamentale delle reti IP, anche se alcuni tipi di messaggio sono stati resi obsoleti e nuovi sono stati aggiunti nel corso degli anni.