Les mystères de la commande ping

pongJe vais faire une petite parenthèse dans ce billet sur la commande ping. Vous allez me dire que vous connaissez déjà bien la commande ping, ce dont je ne doute pas. Elle sert habituellement à vérifier la connectivité réseau d’une machine sur un réseau ou à travers plusieurs réseaux. Mais connaissez-vous complètement cette commande ?

A travers une erreur de frappe, je me suis retrouvé à découvrir quelques « mystères » par rapport à cette commande. Je tiens à remercier mon collègue Laurent et son erreur de frappe qui nous a permis de découvrir ces « mystères ». Ils ont été testés sur Windows XP et Linux.

L’utilisation habituelle de la commande ping ressemble à la commande suivante et vous donne le résultat indiqué.

root@serveur:~ # ping 10.2.0.10

PING 10.2.0.10 (10.2.0.10): 56 data bytes

64 bytes from 10.2.0.10: icmp_seq=0 ttl=255 time=0.173 ms

64 bytes from 10.2.0.10: icmp_seq=1 ttl=255 time=0.134 ms

— 10.2.0.10 ping statistics —

2 packets transmitted, 2 packets received, 0% packet loss

round-trip min/avg/max/stddev = 0.134/0.153/0.173/0.000 ms

Premier mystère

Vous avez déjà surement fait des fautes de frappe en tapant cette commande, mais avez-vous déjà regardé le résultat que cela produit ? Voici un exemple du ping vers l’IP 10.2.017.

root@serproxy01:~ # ping 10.2.017

PING 10.2.017 (10.2.0.15): 56 data bytes

64 bytes from 10.2.0.15: icmp_seq=0 ttl=255 time=0.824 ms

64 bytes from 10.2.0.15: icmp_seq=1 ttl=255 time=0.525 ms

— 10.2.017 ping statistics —

2 packets transmitted, 2 packets received, 0% packet loss

round-trip min/avg/max/stddev = 0.525/0.674/0.824/0.150 ms

On pourrait s’attendre à ce que la commande ping nous retourne un erreur. La syntaxe de l’écriture de l’adresse IP que nous avons saisie est cependant mauvaise… Vous pouvez essayer avec n’importe quelle IP, cela fonctionne de manière similaire. Nous voyons qu’un ping vers la 10.2.017 effectue en réalité un ping vers l’adresse 10.2.0.15. Un ping vers l’adresse 10.2.0.15 aurait été tout à fait logique mais ce n’est pas le cas. Quel est donc le lien entre 10.2.017 et 10.2.0.15 ? Je vous laisse essayer avec différentes IP afin d’essayer de trouver le lien logique.

Explication

Vous avez trouvé ? J’espère bien. Les plus futés d’entre vous auront remarqué que 017 correspond à 15 en base 8 ou octal. Pour la petite explication :

0 x 64 + 1 x 8 + 7 x 1 = 8 + 7 = 15.

Second mystère

Nous avons donc réussi à percer ce premier mystère. Alors que nous étions en train de chercher la solution au premier, nous avons rencontrer une seconde bizarrerie. Essayez la commande ping 10.3.2947 et remarquez le résultat produit.

D:\Documents and Settings\Administrateur>ping 10.3.2947

Envoi d’une requête ‘ping’ sur 10.3.11.131 avec 32 octets de données :

Réponse de 10.3.11.131 : octets=32 temps<1ms TTL=128

Statistiques Ping pour 10.3.11.131:

Paquets : envoyés = 1, reçus = 1, perdus = 0 (perte 0%),

Durée approximative des boucles en millisecondes :

Minimum = 0ms, Maximum = 0ms, Moyenne = 0ms

Dans la même veine, nous pouvons essayer la commande ping 10.199449 et observer le résultat.

D:\Documents and Settings\Administrateur>ping 10.199449

Envoi d’une requête ‘ping’ sur 10.3.11.25 avec 32 octets de données :

Réponse de 10.3.11.25 : octets=32 temps<1ms TTL=128

Réponse de 10.3.11.25 : octets=32 temps=1 ms TTL=128

Statistiques Ping pour 10.3.11.25:

Paquets : envoyés = 2, reçus = 2, perdus = 0 (perte 0%),

Durée approximative des boucles en millisecondes :

Minimum = 0ms, Maximum = 1ms, Moyenne = 0ms

Après le premier mystère, on commence à comprendre que la commande ping agit selon une logique étrange. Vous remarquerez qu’il ne s’agit plus, cette fois-ci, de base 8. Une fois de plus, cela fonctionne avec n’importe quelle IP formatée selon ce mode. On voit facilement qu’on n’est plus en base 8 car le chiffre 9 ne nous renvoie pas d’erreur particulière. Je laisse chercher les plus intrépides d’entre vous. Les autres, vous pouvez continuer à lire cet article.

Vous avez trouvé ? Vous en êtes bien sur ? Les plus futés d’entre vous auront remarqué que nous ne sommes plus en base 8 mais en base 256. Pour démontrer ce fait, je ferais appel à la division avec reste entier.

Explication

Reprenons le premier exemple :

2947 / 256 = 11 reste 131.

Etant donné le préfixe 10.3, vous avez donc 10.3.11.131.

Reprenons le second exemple :

199449 / (256 x 256) = 3 reste 2841

2841 / 256 = 11 reste 25

Nous avons donc 10.3.11.25. Pour vous en convaincre, vous pourrez voir que :

256 x 256 x 3 + 256 x 11 + 25 = 199449.

Au final, j’espère que cet article vous a plu et vous a un peu retourner le cerveau, car s’en était bien l’objectif. Vous ne verrez plus la commande ping de la même manière désormais.