ICMP — Internet Control Message Protocol
Couche OSI : L3 — Réseau
Protocole IP : numéro 1 (Protocol: 1 dans le header IP)
ICMP est le protocole de diagnostic et de signalisation du réseau IP. Contrairement à TCP ou UDP, il ne transporte pas de données applicatives — il envoie des messages de contrôle entre équipements réseau (routeurs, hôtes).
Rôle : le protocole des erreurs réseau
Paquet IP envoyé vers une destination injoignable
→ Le routeur ne peut pas livrer le paquet
→ Le routeur envoie un message ICMP "Destination Unreachable" à la source
→ La source sait que la destination est injoignable
Sans ICMP : la source attendrait indéfiniment (timeout)
Avec ICMP : la source est immédiatement informée de l'erreur
Structure d’un message ICMP
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
┌──────────────────┬──────────────────┬──────────────────────────┐
│ Type │ Code │ Checksum │
├──────────────────┴──────────────────┴──────────────────────────┤
│ Données (variable) │
└────────────────────────────────────────────────────────────────┘
| Champ | Rôle |
|---|---|
| Type | Catégorie du message (0 = Echo Reply, 8 = Echo Request, 11 = Time Exceeded…) |
| Code | Précision dans la catégorie (ex: Type 3 Code 0 = réseau inaccessible, Code 1 = hôte inaccessible) |
| Checksum | Intégrité du message |
Types ICMP importants
| Type | Code | Nom | Déclenché par |
|---|---|---|---|
| 0 | 0 | Echo Reply | Réponse à un ping |
| 3 | 0 | Destination Network Unreachable | Réseau inaccessible |
| 3 | 1 | Destination Host Unreachable | Hôte inaccessible |
| 3 | 3 | Destination Port Unreachable | Port fermé (UDP) |
| 3 | 4 | Fragmentation Needed | Paquet trop grand, DF activé |
| 8 | 0 | Echo Request | Commande ping |
| 11 | 0 | Time Exceeded (TTL=0) | Exploité par traceroute |
| 12 | 0 | Parameter Problem | Header IP invalide |
ping — tester la connectivité
ping envoie des messages ICMP Echo Request (type 8) et attend les Echo Reply (type 0).
ping github.com
# PING github.com (140.82.121.4): 56 bytes of data
# 64 bytes from 140.82.121.4: icmp_seq=0 ttl=53 time=12.4 ms
# 64 bytes from 140.82.121.4: icmp_seq=1 ttl=53 time=11.9 ms
# 64 bytes from 140.82.121.4: icmp_seq=2 ttl=53 time=12.1 ms
# --- github.com ping statistics ---
# 3 packets transmitted, 3 received, 0% packet loss
# round-trip min/avg/max = 11.9/12.1/12.4 ms| Champ | Signification |
|---|---|
icmp_seq | Numéro de séquence du paquet |
ttl | TTL restant à la réception (indique le nombre de sauts) |
time | Latence aller-retour (RTT) en millisecondes |
# Options utiles
ping -c 5 github.com # envoyer exactement 5 paquets
ping -i 0.2 github.com # envoyer toutes les 0.2s (flood test)
ping -s 1400 github.com # taille du paquet (tester la fragmentation)
ping -W 1 github.com # timeout de 1 seconde par paquettraceroute — cartographier le chemin réseau
traceroute exploite le champ TTL du header IP. Il envoie des paquets avec TTL=1, puis TTL=2, etc. À chaque routeur, le TTL est décrémenté et quand il atteint 0, le routeur envoie un ICMP “Time Exceeded” — révélant son identité.
traceroute github.com
# 1 192.168.1.1 (192.168.1.1) 1.2 ms → box internet
# 2 10.0.0.1 (10.0.0.1) 4.8 ms → routeur FAI
# 3 72.14.204.1 (72.14.204.1) 12.1 ms → backbone Google
# 4 * * * → routeur qui bloque ICMP
# 5 140.82.121.4 (lb-140-82-121-4.github.com) 14.3 ms → github.com ✅TTL=1 → routeur 1 → ICMP Time Exceeded → révèle routeur 1
TTL=2 → routeur 1 → routeur 2 → ICMP Time Exceeded → révèle routeur 2
TTL=3 → routeur 1 → routeur 2 → routeur 3 → ICMP Time Exceeded
...
TTL=N → destination atteinte → ICMP Echo Reply (ou Port Unreachable UDP)
ICMP et les firewalls
Certains firewalls bloquent ICMP par “sécurité” — ce qui cause plus de problèmes qu’il n’en résout :
| Message ICMP bloqué | Conséquence |
|---|---|
| Echo Request (ping) | Impossible de tester la connectivité |
| Time Exceeded | traceroute ne fonctionne plus |
| Fragmentation Needed (type 3 code 4) | PMTUD cassé — les connexions TCP établies mais ne transmettent plus de données (Black Hole) |
Bloquer ICMP type 3 code 4 est particulièrement dangereux — cela casse la découverte du MTU path et provoque des connexions qui “pendent”.
ICMPv6 — ICMP pour IPv6
ICMPv6 a un rôle encore plus critique qu’ICMPv4 : il remplace ARP (découverte de voisins via NDP) et gère l’autoconfiguration IPv6 (SLAAC).
ping6 ::1 # ping IPv6 localhost
ping6 google.com # ping IPv6 Google
traceroute6 google.com # traceroute IPv6En relation avec
- Protocoles OSI - Index — tous les protocoles par couche
- Paquets IP et TCP — ICMP est encapsulé dans des paquets IP (Protocol=1)
- NAT — certaines implémentations NAT gèrent mal ICMP
- UDP — traceroute sous Linux utilise UDP (sous Windows/macOS : ICMP)