Pourquoi la requête ping 192.168.072 (seulement 2 points) renvoie-t-elle une réponse de 192.168.0.58?

378

Je tort manqué le point hors d'une adresse IP et tapé 192.168.072.
À ma grande surprise je me suis connecté à une machine à192.168.0.58

Si je cingle, 192.168.072je reçois des réponses de 192.168.0.58.

Pourquoi est-ce?


Je suis sur un PC Windows sur un domaine Windows.


Si je cingle, 192.168.72je reçois une réponse 192.168.0.72, il semble donc que le 0in 072(dans mon erreur initiale) est significatif.


Cette question était une question de super utilisateur de la semaine .
Lisez l' entrée du blog pour plus de détails ou contribuez vous-même au blog

George Duckett
la source
2
Fait intéressant, la même chose se passe sous Linux: les ping 192.168.072impressions PING 192.168.072 (192.168.0.58) 56(84) bytes of data.[...].
Escargot mécanique
9
ce qui est encore plus aléatoire, c’est que vous disposiez d’une machine 192.168.0.58pour obtenir une réponse. Quelles sont les chances de cela?
James Mertz
3
@KronoS n'est en fait pas si bizarre si vous êtes sur un réseau d'école ou d'entreprise. Certains serveurs DHCP donneront des adresses dans l'ordre croissant et la plupart d'entre eux seront utilisés.
Taum
5
192.168.0.58est-ce que le chronométrage est terminé pour moi .. est-ce que toutes les demandes de ping peuvent avoir assommé le serveur?
iamserious

Réponses:

569

Tout le monde complique à l'excès avec les RFC, les classes IP, etc. Exécutez simplement quelques tests pour voir comment la pingcommande analyse l'adresse IP entrée par l'utilisateur (paillettes superflues supprimées):

> ping 1
Pinging 0.0.0.1 with 32 bytes of data:

> ping 1.2
Pinging 1.0.0.2 with 32 bytes of data:

> ping 1.2.3
Pinging 1.2.0.3 with 32 bytes of data:

> ping 1.2.3.4
Pinging 1.2.3.4 with 32 bytes of data:

> ping 1.2.3.4.5
Ping request could not find host 1.2.3.4.5. Please check the name and try again.

> ping 255
Pinging 0.0.0.255 with 32 bytes of data:

> ping 256
Pinging 0.0.1.0 with 32 bytes of data:

Comme vous pouvez le voir, la pingcommande (sous Windows) vous permet d'utiliser différents formats d'adresse IP. Une adresse IPv4 peut être décomposé en quatre parties ( « en pointillés-quad ») comme ceci: A.B.C.Det la pingcommande vous permet de laisser quelques - uns, remplissant un défaut de la 0manière suivante:

1 part  (ping A)       : 0.0.0.A
2 parts (ping A.B)     : A.0.0.B
3 parts (ping A.B.C)   : A.B.0.C
4 parts (ping A.B.C.D) : A.B.C.D

Si vous ne fournissez qu'une seule partie, si elle est inférieure à 255 (le maximum pour un octet), elle est traitée comme un octet comme ci-dessus, mais si elle est supérieure à 255, elle est convertie et transférée dans le champ suivant. (c.-à mod 256-d.)

Il existe quelques cas extrêmes tels que fournir plus de quatre parties ne semble pas fonctionner (par exemple, google.coml'adresse IP de ping ne fonctionnera pas pour l'un 0.74.125.226.4ou l' autre 74.125.226.4.0).

Vous pouvez également utiliser la notation hexadécimale à la fois en pointillé et quadruple, mais vous devez la formater en pré-en attente 0xpour chaque octet.


Il existe donc de nombreuses façons de représenter une adresse IP (IPv4). Vous pouvez utiliser le format plat ou quadruple pointillé (ou triple pointillé, double pointillé ou même simple pointé) et vous pouvez utiliser (ou même mélanger et assortir) décimal, octal et hexadécimal pour chaque format. Par exemple, vous pouvez faire un ping google.comdes manières suivantes:

  • google.com  (nom de domaine)
  • 74.125.226.4  (point décimal)
  • 1249763844  (décimal plat)
  • 0112.0175.0342.0004  (octal pointillé)
  • 011237361004  (octal plat)
  • 0x4A.0x7D.0xE2.0x04  (hex en pointillé)
  • 0x4A7DE204  (hexagone plat)
  • 74.0175.0xe2.4  (_ಠ)

(Dieu merci, le support de la notation binaire n'a pas été ajouté!)


Application :

Dans votre cas, le ping 192.168.072utilise le troisième format du tableau ci-dessus ( A.B.0.C), vous êtes donc en train de faire un ping 192.168.0.072. De plus, comme vous avez un zéro non significatif sur la dernière partie, elle est traitée comme une valeur octale, ce qui en décimal est 58.

Mystère résolu.


Notez que si la pingcommande Windows autorise une telle variété de formats pour l’entrée et interprète les formats non standard de la manière décrite, cela ne signifie pas nécessairement que vous pouvez utiliser ces formats partout. Certains programmes peuvent vous obliger à fournir les quatre parties d’un quad pointillé, d’autres ne permettent pas de mélanger et d’apparier décimal et octal, et ainsi de suite.

De plus, les adresses IPv6 compliquent davantage la logique d'analyse et l'acceptabilité du format d'entrée.


Addenda :

syss a souligné que si vous utilisez un caractère non valide dans l'un des nombres (par exemple, un 8ou 9lorsque vous utilisez octal, un gen mode hexadécimal, etc.), alors vous êtes pingsuffisamment intelligent pour le reconnaître et l'interpréter comme une chaîne (-al? -ic?) URL au lieu d’adresse IP numérique.

(En tant que personne qui a eu de nombreux anévrismes et crises cardiaques en essayant d’écrire du code soi-disant «simple» pour tenir compte du nombre en expansion exponentielle de permutations de valeurs de données, j’apprécie qu’il - semble sembler - traiter correctement toutes les variations d’entrée; cas, au moins 3 1 +3 2 +3 3 +3 4 = 120 variations)

Ainsi, tout en spécifiant que 010.020.030.040ping sera 8.16.24.32comme prévu, le passage 010.020.030.080à pingsera traité comme une URL plutôt que comme une adresse IP - comme foo.bar.baz.comce qui pourrait (mais n'existe malheureusement pas). En d'autres termes, il essaie d'envoyer une requête ping au sous-domaine 010du sous 020-domaine du domaine du domaine 030de premier niveau 080. Cependant, étant donné que ce 080n’est pas un TLD valide (comme .com, .netet leurs copains), la connexion échoue dès la première étape.

La même chose se produit 090.010.010.010lorsque le caractère non valide se trouve dans un octet différent. De même, 0xf.0xf.0xf.0xfpings 15.15.15.15, mais 0xh1.0x1.0xg0.0féchoue.

Oh bien, je suppose que c'est ce que vous obtenez parce que vous ne parlez pas couramment plusieurs bases de nombres.

Il est probablement plus facile et plus sûr de vous assurer de toujours utiliser des adresses à 4 points («40q»? «Quaddy-quad»? «Cutie-q»?).

Alors avancez et apprenez quelques bases numériques . Vous pourrez montrer et être la vie de fêtes, et comme on dit, il y a 10 types de personnes: celles qui connaissent le binaire et celles qui ne le connaissent pas.

Ne pensons même pas aux adresses IPv6; Je pense qu'ils sont l'un des 111 phoques !!!

Synetech
la source
39
Trop compliquer? L'expérimentation peut être très utile et, dans ce cas, donne une bonne réponse. mais sans théorie, documentation ou normes, vous pouvez manquer un facteur critique sans le savoir. Ou vous pourriez déterminer comment une version en particulier fonctionne et vous tromper dans environ 90% des mises en œuvre. Vous pouvez également définir des règles qui expliquent les résultats de vos expériences mais sont plus compliquées que les règles prévues. Dans ce cas, je pense que les règles (pour inet_aton()) de la documentation sont plus simples sur un point: pas de condition pour "moins / plus de 255".
LarsH
71
Hé regarde! La partie "science" de l'informatique fait son apparition! (hypothèse, expérimente, vérifie)
Izkata
13
@LarsH, cependant, c'est ce que je veux dire, c'est que la pingcommande (du moins sous Windows) ressemble à la plupart des programmes de Microsoft (notamment le fameux IE). Il essaie d'être trop indulgent et prend tout ce que vous lui lancez et essaie de l'interpréter. Oui, il existe un document officiel sur les formats d’adresse IP, mais il ne s’agit pas d’une question d’ISO ou de RFC, c’est pratique, j’ai fait quelque chose et c’est une question étrange à laquelle on peut répondre sans avoir recours à spécifications techniques) - bien qu’il soit bon de les relier au cas où le PO voudrait les lire.
Synetech
6
L'analyse octale sans préfixe doit être complètement abandonnée, à l'exception de chmod. C'est ça. C'est la seule exception autorisée pour octal. Période.
James Dunne
6
c'est utile pour la conversion RGB HEX to DEC. lol ~C:\>ping 0xffffcc Pinging 0.255.255.204 with 32 bytes of data:
Wilson
147

Il y a deux raisons à cela:

Premièrement, un préfixe «0» indique un nombre octal . Depuis oct (072) = déc (58), 192.168.072 = 192.168.58.

Deuxièmement, l'avant-dernier 0 peut être supprimé des adresses IP en abrégé . 127.0.1 est interprété comme 127.0.0.1 et, dans votre cas, 192.168.58 est interprété comme 192.168.0.58.

neu242
la source
7
Il ne regroupe pas les zéros. Il traite en réalité chaque point comme un séparateur correspondant à la limite d'octet suivante. Ainsi, les adresses IP 2130706433 et 127.0.0.1 sont les mêmes adresses.
Serge
2
plus précisément c'est la notation quadruple dans le cas d'une adresse IP
Guillaume86
4
Le fameux zéro en tête a encore frappé!
Luc M
2
maintenant c'est la vraie réponse!
l
2
Cette réponse est incorrecte et trompeuse. L'abandon d'un 0 dans 1.0.2.3 (1.2.3) donne une adresse IP différente (1.2.0.3).
sch
101

Outre le point important de @ neu242 sur la notation octale et l'observation selon laquelle les adresses IP peuvent être raccourcies, l'autre élément essentiel consiste à savoir comment les adresses IP réduites sont interprétées.

On pourrait nier que si l’un des quatre nombres manque, l’analyseur ajoute des octets remplis de zéros à la fin (ou au début) de la séquence d’octets. Mais cela ne correspond pas au comportement signalé par le PO: 192.168.072 a été analysé comme 192.168. 0, 58, pas 192.168.58. 0 , ni 0 .192.168.58.

Apparemment, Windows et Linux ping (la version que vous avez essayée et celles que j'ai essayées) utilisent quelque chose d'équivalent à inet_aton () pour analyser l'argument d'adresse IP. La page de manuel de inet_aton () dit:

The address supplied in cp can have one of the following forms:

 a.b.c.d   Each of the four numeric parts specifies a byte of the address; the
           bytes are assigned in left-to-right order to produce the binary
           address.

 a.b.c     Parts a and b specify the first two bytes of the binary address.
           Part c is interpreted as a 16-bit value that defines the rightmost
           two bytes of the binary address.  This notation is suitable for
           specifying (outmoded) Class B network addresses.

 a.b       Part a specifies the first byte of the binary address.  Part b is
           interpreted as a 24-bit value that defines the rightmost three bytes
           of the binary address.  This notation is suitable for specifying
           (outmoded) Class C network addresses.

 a         The value a is interpreted as a 32-bit value that is stored directly
            into the binary address without any byte rearrangement.

Donc, 192.168.072voilà ... correspond au modèle abc, donc 072(après l'analyse sous forme d'un nombre octal) a été interprété comme une valeur de 16 bits qui définit les 2 octets les plus à droite de l'adresse binaire, équivalents à 0.58.

Les règles ci-dessus équivalent à dire que si l'un des quatre nombres est manquant, les octets remplis à zéro nécessaires sont ajoutés immédiatement avant le dernier numéro donné ... ni à la fin ni au début de la chaîne d'octets. (En l'exprimant de cette façon, cela fonctionne si le dernier nombre donné est inférieur à 256.)

Notez que les versions les plus récentes de ping peuvent ne pas autoriser ce type de raccourci, ni l'interprétation octale. Le code source 2010 pour iputils (y compris le ping) que j'ai trouvé utilise inet_pton () plutôt que inet_aton () pour analyser l'argument d'adresse IP. La page de manuel de inet_pton () dit:

Contrairement à inet_aton (3) et à inet_addr (3), inet_pton () prend en charge les adresses IPv6. Par ailleurs, inet_pton () accepte uniquement les adresses IPv4 en notation décimale à points, tandis que inet_aton (3) et inet_addr (3) autorisent la notation plus générale par les nombres et les points (formats de nombre hexadécimal et octal et les formats qui ne t exigent que les quatre octets soient explicitement écrits).

Larsh
la source
12
C'est de loin la meilleure réponse à mon humble avis.
Josh
Sous Windows, vous recherchez inet_addrWinsock.
user7116
24

Vous devez également tenir compte du fait qu'une adresse IP peut être représentée par des entiers additionnés de manière significative pour leur position.

192.168.0.58 is :
  192 * 256^3
+ 168 * 256^2
+   0 * 256^1
+  58 * 256^0

Voici la chose cool:

192.168.58 sera 192.168.0.58 car

    0 * 256^1 
+  58 * 256^0 
=  58

192.11010106 sera également 192.168.0.58 car

  168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 11010106

3232235578 sera également 192.168.0.58 car

  192 * 256^3 
+ 168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 3232235578
vesquam
la source
1
"192.168.56 sera 192.168.0.56 car 0 * 256 ^ 1 + 58 * 256 ^ 0 = 58" Êtes-vous sûr? Vous vous attendez à ce que 168 soit multiplié par 256 ^ 1 dans le premier cas et par 256 ^ 2 dans le second. De même, 192 serait multiplié par 256 ^ 2 contre 256 ^ 3. Ainsi, 192.168.56 pourrait uniquement = 192.168.0.56 s’il existe des règles supplémentaires, telles que la suppression de zéros.
LarsH
@LarsH, je pense que ce qui est dit ici, c'est que c'est basé de gauche à droite, contrairement au comptage "normal" où nous basons tout depuis la place du 1. Ainsi, le premier point fait que tout ce qui se trouve à gauche est multiplié par 256 ^ 3, le second par 256 ^ 2, le troisième par 256. S'il n'y a pas de point à gauche de celui-ci, il est ajouté sans multiplier par 256. ^ n. Donc 1.2.3. (1.2.3.0) serait différent de 1.2.3 (1.2.0.3), si je comprends bien.
iX3
@ iX3: si c'était le cas, alors "192.168.56 sera 192.168.0.56" serait incorrect, car dans le premier cas, 56 serait multiplié par 256 ^ 1, alors que dans le second cas, 56 ne serait que multiplié y 256 ^ 0. Et 192.168.072 du PO serait interprété comme 192.168.58.0 au lieu de 192.168.0.58.
LarsH
Ce qui est un peu trompeur est le fait que l'adresse a 0 a le 3eme chiffre. Considérez cette adresse 192.168.1.56 Le formulaire à 3 chiffres serait 192.168.312 Parce que 1 * 256 ^ 1 + 56 * 256 ^ 0 est 312
vesquam
1
Les points ne servent qu'à définir quels nombres doivent être multipliés par quelle puissance de 256. L'analyseur recherche le premier point et multiplie le nombre précédent par 256 ^ 3. Répétez cette procédure pour les 2e et 3e points, mais par 256 ^ 2 et 256 ^ 1, respectivement. Ensuite, il additionne tous les résultats (certains impl. Peuvent conserver un total cumulé, bien que le résultat soit le même). Si l'un de ces points manque, la multiplication n'est tout simplement pas ajoutée, elle ajoute simplement le nombre final au total cumulé. C'est également pourquoi 1.2.3.une erreur est générée, car l'analyseur ne peut pas trouver le dernier nombre à ajouter au total.
Justin ᚅᚔᚈᚄᚒᚔ