# Les réseaux informatiques/La gestion des erreurs : le protocole ICMP

Une transmission IPv4 peut ne pas aboutir, pour des raisons diverses : problème de formatage du paquet, machine de destination déconnectée, erreur du niveau du routeur, durée du datagramme expirée, etc. Quand un routeur détecte une telle erreur, le paquet qui a subi l'erreur est détruit par le routeur en question. De plus, le routeur doit prévenir la machine émettrice que le paquet n'a pas été transmis. Pour cela, le routeur émet un paquet ICMP, formaté suivant le protocole ICMP. Ce protocole sert à transmettre des messages d'erreur entre machines ou routeurs. ICMP est un protocole de couche 3 (couche Internet), tout comme IP.

## Le format des paquets ICMP

Les messages ICMP sont encapsulés dans des paquets IP et sont routés comme tout autre paquet IP. Tout paquet ICMP commence donc par un en-tête IP, suivi par le contenu du paquet ICMP. Dans le schéma ci-dessous, l'en-tête IP est en violet, alors que le contenu du paquet ICMP est en rose. On voit que l'en-tête ICMP fait 8 octets, soit 64 bits.
On voit que le paquet ICMP contient quatre champs : TYPE, CODE, CODE DE CONTRÔLE et DONNÉES.
* Le champ TYPE est un octet qui indique quel est le type de message ICMP envoyé.
* Le champ CODE est un octet qui code des informations diverses.
* Le CODE DE CONTRÔLE est un mot de 16 bits qui permet de détecter et corriger les erreurs de transmission.
* Le champ DONNÉES correspond aux données du paquet ICMP, parfois précédées de bits de bourrage (pour que l'en-tête ICMP ait une taille fixe).

## La signification des paquets ICMP

Le message ICMP utilise ses champs TYPE et CODE pour dire quelle est l'origine de l'erreur, à savoir est-ce que la machine destination est inaccessible, est-ce que le protocole utilisé est mauvais, etc. On peut classer les messages selon la valeur du champ TYPE.

### Les paquets ECHO

Un TYPE valant 0 ou 8 signifie que le message n'est pas un message d'erreur, mais une demande ou résultat de ping. Pour rappel, le ping est une commande qui permet de savoir quel le temps mis par un paquet pour atteindre sa destination. Plus le ping est bas, plus le temps de transmission est faible. Le ping donne donc une idée des performances du réseau, et notamment de ce qu'on appelle sa latence. Ce ping a une grande importance dans la plupart des applications réseau, et surtout dans le cas des jeux vidéos multijoueurs. Le principe du Ping est d'envoyer un paquet requête vers la machine destination, qui doit répondre par un paquet réponse. Le temps de transmission est simplement le temps d'aller-retour entre l'émission du paquet requête et la réception du paquet réponse. Ces paquets sont appelés des paquets ECHO et leur champ CODE est toujours à 0. Le paquet requête est un paquet ICMP dont le TYPE vaut 8, le paquet réponse a quant à lui un champ TYPE à 0.

### Les autres valeurs du champ TYPE

Le TYPE est mis à 3 si jamais la machine de destination est inaccessible ou qu'un routeur n'a pas réussit à router le paquet.
Le TYPE est mis à 4 si le volume de données transmis est trop important. Cela sert à signaler des erreurs de fragmentation de paquet.
Le TYPE est mis à 5 si le chemin pris par le paquet n'est pas le bon. Dit autrement, il indique une erreur de routage.
Un TYPE à 11 signifie que le paquet a dépassé son TTL.
Le TYPE est mis à 12 si l'en-tête du paquet IP est erroné ou corrompu.
Un TYPE à 13 ou 14 est utilisé pour les paquets de synchronisation entre routeurs.
Les autres TYPE servent pour des échanges d'informations entre routeurs. Les TYPE 15 et 16 sont aujourd'hui obsolètes. Ils servaient au démarrage d'une machine, pour lui attribuer une adresse IP, chose devenue inutile avec les protocoles DHCP et RARP. Les TYPE 7 et 18 servent à obtenir le masque de sous-réseau vers le routeur qui gère la machine de destination. On peut ainsi envoyer une adresse IP, dans un paquet de requête de masque de sous-réseau, de TYPE 17. Celui-ci répond alors par un paquet de TYPE 18, qui transmet le masque de sous-réseau associé.