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)                         │
└────────────────────────────────────────────────────────────────┘
ChampRôle
TypeCatégorie du message (0 = Echo Reply, 8 = Echo Request, 11 = Time Exceeded…)
CodePrécision dans la catégorie (ex: Type 3 Code 0 = réseau inaccessible, Code 1 = hôte inaccessible)
ChecksumIntégrité du message

Types ICMP importants

TypeCodeNomDéclenché par
00Echo ReplyRéponse à un ping
30Destination Network UnreachableRéseau inaccessible
31Destination Host UnreachableHôte inaccessible
33Destination Port UnreachablePort fermé (UDP)
34Fragmentation NeededPaquet trop grand, DF activé
80Echo RequestCommande ping
110Time Exceeded (TTL=0)Exploité par traceroute
120Parameter ProblemHeader 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
ChampSignification
icmp_seqNuméro de séquence du paquet
ttlTTL restant à la réception (indique le nombre de sauts)
timeLatence 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 paquet

traceroute — 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 Exceededtraceroute 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 IPv6

En 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)