Le ping pour les débutants

I. Présentation

Dans ce tutoriel, nous allons découvrir une commande indispensable en informatique : ping. Cette commande s'appuie sur le protocole ICMP et permet de réaliser quelques tests sur un réseau.

Après une courte introduction au protocole ICMP, je vais vous expliquer à quoi sert la commande "ping" puis il sera temps de passer à la démonstration. Pour cela, je vais effectuer l'analyse d'un ping entre deux machines à partir du logiciel Wireshark.

II. Le protocole ICMP

Le protocole ICMP, pour Internet Control Message Protocol, est très utile sur les réseaux IP puisqu'en cas de problème d'émission d'un paquet, il va être capable d'informer l'émetteur du paquet qu'il y a eu une erreur dans la transmission du paquet. En cas d'incident pour joindre un service, un hôte ou un routeur, le protocole ICMP peut informer l'adresse IP source de ce dysfonctionnement.

Même s'il n'est pas utilisé régulièrement au sein des applications, le protocole ICMP est très utile au sein d'outils de diagnostics pour le réseau tels que le ping que nous allons voir aujourd'hui, mais aussi traceroute.

Chaque paquet ICMP est encapsulé dans un datagramme IP. Contrairement aux protocoles TCP ou UDP, le protocole ICMP n'est pas un protocole de transport.

III. À quoi sert la commande ping ?

Dans une très grande majorité des cas, la commande ping sert à tester la communication entre deux équipements connectés à un réseau IP, mais la commande ping peut servir à d'autres choses. Voici une liste de trois cas courants de l'utilisation du ping :

  • Tester la communication entre deux équipements connectés à un réseau

Lorsque l'on effectue un ping d'une machine A vers une machine B, et que l'on obtient une réponse positive, cela signifie que d'un point de vue du réseau, la machine A peut atteindre la machine B (route aller) et que la machine B peut atteindre la machine A (route retour). Je vais revenir sur cette notion de "réponse positive" par la suite.

  • Mesurer la fiabilité d'un réseau à un instant t

Si l'on émet des requêtes "ping" entre une machine A et une machine B en boucle, pendant plusieurs minutes, et que l'on obtient que des réponses positives, on peut considérer que le chemin réseau entre les deux machines est fiable et stable (en tout cas à cet instant). Par contre, si l'on envoie 20 requêtes "ping" et que l'on a un taux de réponse négative de 20%, c'est qu'il y a un problème sur le réseau !

  • Mesurer la latence d'un réseau à un instant t

Nous le verrons dans la suite de ce tutoriel, que quand un ping est envoyé d'une machine A vers une machine B, la machine A (qui est la machine source) va mesurer le temps de réponse. Ce temps de réponse correspond laps au temps qui s'est écoulé entre le moment où la machine A a envoyé le paquet et où elle a reçue la réponse de la machine B. Si le temps de réponse est trop élevé, c'est le signe d'une perturbation sur le réseau, d'une congestion sur le réseau ou d'un problème de performance sur l'hôte distant.

IV. Comment fonctionne le ping ?

Lorsque l'on utilise la commande "ping", c'est la couche IP de notre machine qui va s'appuyer sur le protocole ICMP pour émettre un message ICMP "Echo Request" à destination de l'hôte distant.

Schéma ping

Effectuée à partir d'une machine, la commande "ping" envoie un paquet ICMP vers l'hôte cible et ce paquet ICMP des informations, dont le type et le code. Grâce à eux, nous allons pouvoir en savoir plus sur le message envoyé via le protocole ICMP. Lorsqu'un ping se passe bien, l'hôte source utilise le message "echo request" et l'hôte destination lui répond avec le message "echo reply".

Ainsi, le type et le code peuvent prendre plusieurs valeurs avec à chaque fois une signification différente (données du tableau obtenues sur Wikipédia) :

ICMP : types et codes

Dans le tableau ci-dessus, nous retrouvons bien les types et les codes présents sur mon premier schéma. Nous verrons par la suite que l'on retrouve ces codes aussi dans la pratique, lors d'une analyse d'un ping avec Wireshark.

Quand on utilise la commande ping, que ce soit sur Windows, Linux, macOS, ou depuis la ligne de commande de son routeur, ou son switch, on obtiendra différentes informations à l'écran. Les informations affichées ne sont pas toujours les mêmes, cela dépend de la méthode d'implémentation de l'outil ping.

Faisons quelques essais...

Sur une machine Windows, on peut réaliser un ping à partir d'une Invite de commandes, d'une console Windows PowerShell ou PowerShell : c'est pris en charge dans toutes les consoles et cet outil est intégré à Windows. Il suffit de préciser l'adresse IP (ou le nom d'hôte, le nom de domaine) que l'on souhaite pinger :

ping 1.1.1.1

Par défaut, Windows va réaliser 4 ping et s'arrêter. Si l'on veut effectuer un ping continue qui s'arrête seulement lorsque l'on décide de l'arrêter, il faut ajouter une option :

ping 1.1.1.1 -t
Exemple d'un ping sous Windows
Exemple d'un ping sous Windows

Sur l'image ci-dessus, on peut voir cette ligne pour chaque ping, ce qui correspond au résultat du ping :

Réponse de 1.1.1.1 : octets=32 temps=9 ms TTL=56

Cela signifie que l'hôte distant a répondu, c'est pour cette raison que l'on a l'information "Réponse de 1.1.1.1". On remarque d'autres informations sur cette ligne :

  • octets=32

Le paquet correspondant au ping est d'une taille de 32 octets. La taille du paquet peut être modifiée, par exemple sous Linux c'est 64 octets, soit 64 bytes en anglais (voir ci-dessous). Sous Windows, l'option "-l" permet de modifier la taille du paquet, par exemple pour 1024 octets : ping 192.168.100.11 -l 1024

  • temps=9 ms

Le temps nécessaire pour que le paquet puisse atteindre l'hôte distant (1.1.1.1) et faire le chemin retour pour revenir à notre machine. Ce temps est toujours exprimé en millisecondes.

  • TTL=56

TTL signifie Time To Live, ce qui correspond à la durée de vie du paquet avant qu'il ne soit détruit. En fait, lorsqu'un ping est émit il y a une valeur initiale pour le TTL qui est généralement fixée à 64 (ou 128). A chaque fois que le paquet va passer au travers d'un routeur, le TTL sera réduit de 1. Lorsque l'on voit un TTL=56, on peut en déduire que le paquet a traversé 8 routeurs avant d'atteindre sa cible : ce n'est pas étonnant puisque 1.1.1.1 correspond à l'adresse IP du DNS CloudFlare, sur Internet.

Note : lorsque l'on ping un hôte qui est sur le même segment réseau, par exemple connecté au même réseau WiFi à la maison, et bien, le TTL reste à 64 (ou à sa valeur initiale), car on ne traverse pas de routeur.

Pour lire les résultats d'une série de ping, on peut s'appuyer sur les statistiques affichées à la fin de la commande. On peut voir que j'ai envoyé 4 paquets, que j'en ai reçu 4, donc j'en ai perdu 0, ce qui signifie que la perte est de 0%. Tout va bien. On a également le temps de réponse moyen qui est calculé, ainsi que les temps de réponse max et min.

Statistiques du ping
Statistiques du ping

Si l'on regarde l'aide de la commande ping (ping --help), on peut voir qu'il existe d'autres options. Par exemple, pour forcer l'utilisation d'IPv4 ou d'IPv6 :

ping www.domaine.fr -4
ping www.domaine.fr -6

Si l'on effectue un ping depuis une machine sous Linux, par exemple avec la distribution Kali Linux, on peut utiliser une syntaxe similaire pour effectuer un simple ping. La différence c'est que le ping va s'exécuter en continu et qu'il faudra l'arrêter manuellement.

ping 1.1.1.1
Exemple d'un ping sous Linux
Exemple d'un ping sous Linux

Dans le cas où l'hôte distant ne répond pas au ping, cela peut s'expliquer par de nombreuses raisons :

  • L'hôte distant est injoignable à cause d'un problème de routage (acheminement du paquet sur le réseau)
  • Un pare-feu entre les deux machines bloque les pings
  • Le pare-feu local de l'hôte distant est configuré pour ne pas répondre au ping
  • Le ping est effectué sur un nom de domaine est le DNS ne parvient pas à résoudre ce nom
  • Etc.

Maintenant, passons à l'analyse d'un ping avec Wireshark.

V. Analyse d'un ping avec Wireshark

Pour capturer le trafic réseau généré par notre ping, il faut que l'on démarre une capture avec Wireshark. Enfin, on pourrait aussi utiliser un autre logiciel tel que tcpdump. Pour ma part, je vais émettre le ping depuis la machine avec l'adresse IP "192.168.100.101" vers le serveur avec l'adresse IP "192.168.100.11".

Une fois Wireshark lancé sur votre machine, cliquez sur "Capture" dans le menu puis "Options". Cela nous permet de sélectionner l'interface Ethernet et d'appliquer un filtre pour capture uniquement les échanges entre ma machine locale et le serveur avec l'adresse IP "192.168.100.11".

ip src 192.168.100.11 or ip dst 192.168.100.11

Vous pouvez aussi utiliser le filtre suivant basé sur le protocole :

icmp

On clique sur "Démarrer" pour lancer la capture, puis dans le même temps je lance le ping :

ping 192.168.100.11

En appliquant un filtre supplémentaire sur le protocole ICMP (on saisit "icmp" dans la barre des filtres et on valide), on obtient 8 paquets. C'est normal puisque sous Windows, 4 requêtes ping sont émises puis la commande s'arrête. Comme nous avons obtenu une réponse à chaque fois : 4 x 2 = 8 paquets.

Capture d'un ping (ICMP) avec Wireshark
Capture d'un ping (ICMP) avec Wireshark

Si l'on se réfère à la colonne "Info", on remarque deux informations importantes :

Echo (ping) request
Echo (ping) reply

La première correspond à la requête ping de ma machine locale, et la seconde à la réponse de l'hôte distant.

Si l'on sélectionne le paquet n°1 et que l'on regarde le contenu de l'en-tête ICMP, on peut voir des informations importantes :

Type: 8 (echo (ping) request)
Code: 0

Nous retrouvons le type et le code, comme je l'évoquais précédemment lors des explications théoriques. Avec cette analyse Wireshark, où l'on voit les paquets, on retrouve bien ces informations.

Analyse d'un ping avec Wireshark : ICMP Request
Analyse d'un ping avec Wireshark : ICMP Request

Dans le même esprit, si l'on prend le paquet n°2, on peut voir qu'il correspond à la réponse au ping reçue de la part du serveur distant (192.168.100.11).

Type: 0 (echo (ping) reply)
Code: 0
Analyse d'un ping avec Wireshark : ICMP Reply
Analyse d'un ping avec Wireshark : ICMP Reply

Cet enchaînement de requêtes et de réponses est présent 4 fois, ce qui est logique. Au sein des paquets, on peut remarquer deux autres valeurs :

  • Identifier
  • Sequence Number

Ces numéros permettent d'ajouter un suivi au sein des paquets ICMP. De cette façon, quand notre hôte local reçoit une réponse de la part de l'hôte distant, il sait à quel paquet ICMP "Echo request" cette réponse correspond. Autrement dit, ces identifiants permettent de faire la correspondance entre les requêtes ping et les réponses ping entre deux hôtes.

Dans le cas où l'hôte distant ne réponse pas, la commande ping affiche "Délai d’attente de la demande dépassé.", tandis qu'au niveau de Wireshark, on peut "No response seen" et "No response found!". Au niveau des paquets, on peut voir les requêtes "echo request", mais les réponses ne sont pas là.

Dans cet exemple, nous venons d'émettre 4 requêtes ping "echo request" à destination du serveur. On peut dire que cela a permis de vérifier que les deux machines pouvaient communiquer ensemble.

Il faut savoir que le "ping" peut être utilisé dans le cadre d'attaques informatiques, notamment les attaques "ping flood" de type déni de service. L'objectif étant de surcharger l'ordinateur cible en lui envoyant tellement d'echo request qu'il n'arrive plus à suivre. À l'aide d'outils ping plus évolué (permettant de faciliter les attaques), l'attaquant va pouvoir s'en prendre à une machine, un routeur, un serveur, etc... Soit à partir d'une seule machine (Déni de service - DoS) ou d'un ensemble de machines (Déni de service distribué - DDoS) : tout dépend de la cible. En fait, on peut dire qu'il faut être plus fort que la cible pour réussir à la faire tomber.

VI. Conclusion

Bien que très simple d'utilisation, la commande ping est indispensable, car c'est un outil basique, mais qui est pertinent pour effectuer un premier diagnostique sur un réseau informatique. Au-delà de savoir l'utiliser au sein d'une console, que ce soit sous Windows ou Linux, vous en savez également un peu plus sur son fonctionnement grâce à l'analyse Wireshark effectuée !

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian Burnel

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

florian has 4110 posts and counting.See all posts by florian

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.