Les mystères de la commande ping
Je 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 SettingsAdministrateur>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 SettingsAdministrateur>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.