Question Pourquoi le ping 192.168.072 (seulement 2 points) renvoie-t-il une réponse de 192.168.0.58?


J'ai par erreur manqué le point d'une adresse IP et tapé 192.168.072.
À ma grande surprise, je me suis connecté à une machine à 192.168.0.58

Si je ping 192.168.072 Je 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 ping 192.168.72 Je reçois une réponse de 192.168.0.72, donc il semble que le 0 dans 072 (dans mon erreur initiale) est significatif.


Cette question était un Super User Question de la semaine.
Lis le entrée de blog pour plus de détails ou contribuer au blog toi même


370
2017-10-12 10:26


origine


Pertinent:  blog.superuser.com/2012/02/10/wtfriday-http2915189091 - Tom Wijsman
Fait intéressant, exactement la même chose se produit sous Linux: ping 192.168.072 estampes PING 192.168.072 (192.168.0.58) 56(84) bytes of data.[...]. - Mechanical snail
ce qui est encore plus aléatoire est que vous aviez une machine à 192.168.0.58 pour obtenir une réponse. Quelles sont les chances de cela? - KronoS
@KronoS ce n'est pas si bizarre si vous êtes sur une école ou un réseau d'entreprise. Certains serveurs DHCP donneront des adresses en ordre croissant et la plupart seront utilisées. - Taum
192.168.0.58 est le temps pour moi .. peut toutes les requêtes ping ont en quelque sorte assommé le serveur? - iamserious


Réponses:


Tout le monde le complique avec les RFC, les classes IP et autres. Faites simplement quelques tests pour voir comment ping commande analyse l’entrée IP par l’utilisateur (suppression de la

> 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, le ping commande (sous Windows) vous permet d'utiliser différents formats d'adresse IP. Une adresse IPv4 peut être décomposée en quatre parties ("quadri-point") comme suit: A.B.C.D, et le ping commande vous permet d'en sortir, en remplissant un défaut de 0 comme suit:

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, alors 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 dans le champ suivant. (c'est à dire, mod 256).

Il existe quelques cas marginaux, comme la fourniture de plus de quatre parties, qui ne semble pas fonctionner (par exemple, le ping google.comL’IP ne fonctionnera pas non plus 0.74.125.226.4 ou 74.125.226.4.0).

Vous pouvez également utiliser la notation hexadécimale dans les formes quadri-pointées et les formes plates, mais vous devez la formater en attente. 0x à chaque octet.


Il existe donc de nombreuses façons de représenter une adresse IP (IPv4). Vous pouvez utiliser le format plat ou quadri-point (ou triple pointillé, double pointillé ou même simple pointillé) et, pour chacun, vous pouvez utiliser (ou même mélanger et assortir) les valeurs décimales, octales et hexadécimales. Par exemple, vous pouvez faire un ping google.com des manières suivantes:

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

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


Application:

Dans votre cas, cingler 192.168.072 utilise le troisième format dans le tableau ci-dessus (A.B.0.C), vous faites donc un ping 192.168.0.072. De plus, comme vous avez un zéro en tête sur la dernière partie, il est traité en octal, ce qui est en décimal est 58.

Mystère résolu.


Notez que lorsque Windows ping commande permet une grande variété de formats pour les entrées et interprète les formats non standard de la manière observée, ce qui 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 peuvent ne pas autoriser le mélange et la correspondance entre décimal et octal, etc.

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


Addenda:

syss a fait remarquer que si vous utilisez un caractère non valide dans l'un des nombres (par exemple, un 8 ou 9 en utilisant octal, un g en mode hexadécimal, etc.) ping est assez intelligent pour reconnaître cela et l'interpréter comme une chaîne (-al? -ic?) URL au lieu d'une adresse IP numérique.

(Comme quelqu'un qui a eu de nombreux anévrismes et attaques cardiaques essayant d'écrire du code soi-disant "simple" pour s'adapter au nombre de permutations exponentiellement des valeurs de données, j'apprécie qu'il semble traiter correctement toutes les variations d'entrée. cas, au moins 31+32+33+34=120 variations.)

Donc, en spécifiant 010.020.030.040 va faire un ping 8.16.24.32 comme prévu, passant 010.020.030.080 à ping sera traité comme une URL plutôt que comme une adresse IP foo.bar.baz.com qui pourrait (mais malheureusement ne existe pas). En d'autres termes, il essaie de faire un ping sur le sous-domaine 010 sur le sous-domaine 020 sur le domaine 030 au domaine de premier niveau 080. Cependant, depuis 080 n'est pas un TLD valide (comme .com, .net, et leurs amis), la connexion échoue dès la première étape.

La même chose arrive avec 090.010.010.010 où le caractère non valide est dans un octet différent. Également, 0xf.0xf.0xf.0xf pings 15.15.15.15, mais 0xh1.0x1.0xg0.0f échoue.

Eh bien, je suppose que c'est ce que vous obtenez pour ne pas parler couramment plusieurs bases de chiffres.

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

Alors allez-y et apprendre quelques bases numériques. Vous pourrez faire la fête et être la vie des parties et, comme on dit, il y a 10 types de personnes: celles qui connaissent le binaire et celles qui ne le savent pas.

Ne même pas pense sur les adresses IPv6; Je pense qu'ils sont l'un des 111 sceaux !!!


565
2017-10-12 17:06



Trop compliqué? L'expérimentation peut être très utile et, dans ce cas, a donné une bonne réponse. mais sans une théorie ou une documentation ou des normes, vous pouvez manquer un facteur critique et ne pas le savoir. Ou vous pourriez déterminer comment une version particulière fonctionne et se tromper à environ 90% des implémentations. Ou vous pourriez trouver des règles qui expliquent les résultats de vos expériences, mais qui sont plus compliquées que les règles prévues. Dans ce cas, je pense que les règles de documentation (pour inet_aton()) sont plus simples à un égard - pas de conditions pour "sous / plus de 255". - LarsH
Hé regarde! La partie "science" de l'informatique fait son apparition! (émettre des hypothèses, expérimenter, vérifier) - Izkata
@LarsH, ce que je veux dire, c'est que le ping la commande (au moins sous Windows) est comme beaucoup de programmes de Microsoft (en particulier le tristement célèbre) IE. Il essaie d'être trop indulgent et de prendre tout ce que vous lui lancez et essaie de l'interpréter. Oui, il existe un document officiel sur les formats d’adresses IP, mais il ne s’agit pas là d’une question d’ISO et de RFC, c’est pratique, J'ai fait quelque chose et c'est bizarre question à laquelle on peut répondre sans avoir recours à (certes, spécifications techniques longues, sèches et ennuyeuses) - bien que les relier au cas où le PO veut les lire, c'est bien aussi. - Synetech
L'analyse octale préfixée par 0 devrait être complètement abandonnée, sauf pour chmod. C'est tout. C'est la seule exception pour octal autorisée. Période. - James Dunne
il est utile pour la conversion RVB HEX vers DEC. lol ~ C:\>ping 0xffffcc  Pinging 0.255.255.204 with 32 bytes of data: - wilson


Il y a deux raisons à cela:

Tout d'abord, un préfixe «0» indique un octal nombre. Depuis oct (072) = dec (58), 192.168.072 = 192.168.58.

Deuxièmement, le dernier à 0 peut être supprimé des adresses IP en tant que sténographie. 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.


147
2017-10-12 10:39



Il ne regroupe pas les zéros. En fait, chaque point est considéré 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
la notation x.x.x.x pour les nombres de 32 bits a-t-elle un nom? Il pourrait être utilisé / utile dans d'autres domaines mais je ne peux pas le google :) edit: nevermind, c'est la notation décimale par points - Guillaume86
plus précisément, il s'agit de la notation à quatre points dans le cas d'une adresse IP - Guillaume86
Le célèbre leader zéro a frappé une fois de plus! - Luc M
maintenant c'est la vraie réponse! - l--''''''---------''''''''''''


En plus du point important de @ neu242 sur la notation octale et de l'observation que les adresses IP peuvent être raccourcies, l'autre élément essentiel est de savoir comment les adresses IP raccourcies sont interprétées.

On pourrait naïvement supposer que si certains des quatre nombres sont manquants, l'analyseur ajoutera des octets remplis à zéro à la fin (ou au début) de la séquence d'octets. Mais cela ne correspond pas au comportement signalé par l'OP: 192.168.072 était analysé en tant que 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. le page de manuel pour 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.

Alors voilà… 192.168.072 correspond au modèle a.b.c, de sorte que le 072 (après l’analyse en 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, ce qui équivaut à 0.58.

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

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

Contrairement à inet_aton (3) et à inet_addr (3), inet_pton () prend en charge les adresses IPv6. Sur   d'autre part, inet_pton () accepte uniquement les adresses IPv4 en notation décimale,   alors que inet_aton (3) et inet_addr (3) permettent au plus général   notation des nombres et des points (formats de nombres hexadécimaux et octaux, et   formats qui n'exigent pas que les quatre octets soient écrits explicitement).


97
2017-10-12 15:33



C'est de loin la meilleure réponse à mon humble avis. - Josh
Sur Windows, vous recherchez inet_addr à Winsock. - user7116


Vous devez également considérer qu'une adresse IP peut être représentée par des entiers ajoutés ensemble en fonction de 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

25
2017-10-12 13:57



"192.168.56 sera 192.168.0.56 car 0 * 256 ^ 1 + 58 * 256 ^ 0 = 58" Etes-vous sûr? On s'attendrait à ce que 168 soit multiplié par 256 ^ 1 dans le premier cas et par 256 ^ 2 dans le second cas. De même, 192 serait multiplié par 256 ^ 2 contre 256 ^ 3. Donc, 192.168.56 pourrait seulement = 192.168.0.56 si des règles supplémentaires sont en place, telles que la suppression des zéros. - LarsH
@LarsH, je pense que ce qui est dit ici, c'est qu'il est basé de gauche à droite, contrairement au comptage "normal" où nous basons tout de la place du 1. Donc, le premier point fait que tout ce qui est à 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, 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 tel é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 les OP 192.168.072 seraient interprétés comme 192.168.58.0 au lieu de 192.168.0.58. - LarsH
Ce qui est un peu trompeur, c'est que l'adresse a le 3ème chiffre. Considérez cette adresse 192.168.1.56 La forme à 3 chiffres serait 192.168.312 Parce que 1 * 256 ^ 1 + 56 * 256 ^ 0 est 312 - vesquam
Les points servent uniquement à définir quels nombres doivent être multipliés par quelle puissance de 256. L'analyseur recherche le premier point et multiplie le nombre qui le précède par 256 ^ 3. Répétez l'opération pour les 2ème et 3ème points, mais par 256 ^ 2 et 256 ^ 1, respectivement. Ensuite, il ajoute tous les résultats ensemble (certains impliquent peuvent garder un total cumulé à la place, bien que le résultat soit le même). Si l'un de ces points est manquant, il ne fait tout simplement pas la multiplication et ajoute simplement le nombre final au total cumulé. C'est aussi pourquoi 1.2.3. entraîne une erreur, car l'analyseur ne peut pas trouver le dernier numéro à ajouter au total. - Justin ᚅᚔᚈᚄᚒᚔ