Les adresses IP avec et sans zéros sont-elles identiques?

90

J'ai un système de sécurité et le paramètre réseau ne permet qu'une adresse IP à trois chiffres. Je ne peux pas le régler sur 192.168.2.100, je dois plutôt utiliser 192.168.002.100.

Ces deux adresses IP sont-elles différentes? Dois-je configurer le réseau local de mon routeur 192.168.xxx.xxxpour qu'il fonctionne correctement? Je ne trouve aucune information solide à ce sujet.

Brock Vond
la source
16
Conformément aux réponses ci-dessous, 192.168.020.100 ne doit pas être identique à 192.168.20.100, mais il peut en être de même si votre système autorise uniquement la saisie d’IP de cette façon (j’ai vu cela avec les copieurs lorsque l’IP est entré chiffre par chiffre avec les flèches haut-bas). - Si votre système a cette bizarrerie, même lorsque la saisie au clavier "normale" est possible (par exemple, vous pouvez faire une entrée technique 192.168.2.100, mais il se plaint), alors je vous suggère d'avoir un mot avec le vendeur (Quelle est la fiabilité du système de sécurité si sa validation d'entrée est si merdique?)
Hagen von Eitzen
4
C'est vraiment une validation assez bizarre. Je changerais de système de sécurité, comme @Hagen y fait allusion.
Courses de légèreté en orbite
2
Cela peut aussi être spécifique au logiciel. Ils sont valables avec ou sans les premiers caractères 0, mais j'ai rencontré des applications ne prenant pas en charge une adresse IP qui ne comportait pas 3 chiffres par octet.
ps2goat
2
Toutes les adresses IP (v4) ne sont en réalité que 32 bits représentés de manière agréable. Si 192.168.002.100c'est ainsi que votre outil représente 0xc0a80264/ 3232236132 / 192.168.2.100, alors c'est la même chose.
Tim S.
1
Pouvez-vous s'il vous plaît accepter une autre réponse? Celui que vous avez accepté est vraiment faux (ou au moins incomplet) et compte 11 votes négatifs.
Arjan

Réponses:

102

Cela dépend de l'outil.

Dans la plupart des cas, les deux seront les mêmes, mais pas toujours.

Par exemple, si vous utilisez un nombre à 3 chiffres commençant par un zéro (ou un numéro à deux chiffres commençant par zéro, merci @ Dietrich-Epp), alors ping suppose que les nombres sont octaux.

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Users>ping 011.012.013.014

Pinging 9.10.11.12 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 9.10.11.12:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
Greenstone Walker
la source
37
Pas tellement de ping, mais la routine sous-jacente qu'il utiliseinet_addr()
cde
2
Cela se produit également sur OSX.
Johann Philipp Strathausen
21
Ce n'est pas parce qu'il a trois chiffres, mais parce que le nombre est précédé d'un zéro. Vous pouvez tester cela en essayant de faire un ping sur 09.09.09.09, ce qui ne fonctionne pas car 9 n'est pas valide en octal.
Dietrich Epp
65

En supposant que tous les logiciels que vous utilisez utilisent des points-décimaux et des sous-réseaux correctement, oui, ils sont identiques.

192.168.0.1, par exemple, n’est que la notation amicale point-décimal de la valeur point-binaire 11000000.10101000.00000000.00000001.

Si vous le tapez comme 192.168.0.1 ou 192.168.000.001, ils sont tous deux égaux à 11000000.10101000.00000000.00000001

Austin T français
la source
63
Les points sont aussi pour plus de commodité; l'adresse IP réelle est 11000000101010000000000000000001
cpast
14
@cpast ou sous forme de nombre hexadécimal:C0A80001
jfs
13
ou sous forme octale (commençant par 0, avec ou sans points), par exemple, ping 0300.0250.2.0144 pour 192.168.2.100
Sergey
15
ou sous forme décimale3232235521
oldmud0
14
Comme le soulignait la réponse de @GreenstoneWalker, de nombreux programmes ne les percevront pas comme les mêmes; un nombre avec un zéro (qui ne contient pas les chiffres 8 ou 9) sera compris comme un nombre à notation octale; donc 010.000.001.063 serait interprété comme "8.0.1.51" (octal 010 = nombre décimal 8; octal 063 = nombre décimal 51) au lieu de "10.0.1.63"!
Doktor J
37

Cela dépend des outils ou fonctions utilisés par un programme donné pour analyser l'adresse donnée. Microsoft et Linux, ainsi que d'autres systèmes d'exploitation, utilisent une routine compatible POSIXinet_addr() pour analyser les adresses.

De nombreux programmes TCP / IP tels que Ping et FTP utilisent la fonction sockets inet_addr () pour convertir les chaînes d'adresses IP en adresses de 4 octets. Cette fonction accepte une adresse IP en notation décimale, octale et hexadécimale standard.
Microsoft KB115388 Ping et FTP Résoudre l'adresse IP avec zéro non linéaire en octal

 

La fonction inet_addr () convertit l'adresse de l'hôte Internet cp de la notation nombres-points IPv4 en données binaires dans l'ordre des octets du réseau.

Dans tous les formulaires ci-dessus, les composants de l’adresse en pointillé peuvent être spécifiés en décimal, en octal (avec un 0), ou en hexadécimal, avec un 0X). Les adresses sous l'une de ces formes sont désignées collectivement par la notation chiffres-points IPv4 . La forme qui utilise exactement quatre nombres décimaux est appelée notation décimale pointée IPv4 (ou parfois: notation quadrilande pointée IPv4).
inet_addr (3): Routines de changement d'adresse Internet - Page de manuel Linux

En tant que tel, votre système spécifique peut nécessiter une notation décimale à trois chiffres pour chaque octet, mais ceci n'est pas universel et vous devez veiller à ce que la bonne adresse IP soit entrée.

Bien entendu, seuls les nombres valides pour chaque type fonctionneront. Les nombres octaux, hexadécimaux ou décimaux en dehors de la plage échoueront également ou entraîneront des problèmes. Octal 088, Hex 0xGG ou Decimal 280 sont des exemples non valides.

cde
la source
3
+1 pour la fonction sous-jacente. Pour ajouter cette fonction, l’analyse IP échouera si un octet valide (par exemple .88) est rempli de zéros, car 8 n’est pas un nombre valide en octal.
Mars Ho
Dans Windows XP (et avant cela), la fonction accepte les nombres octaux invalides et tente toujours de les convertir. Cela peut conduire à un comportement très peu évident. À partir de Vista, les numéros non valides sont traités comme des noms de domaine et Windows tentera d'effectuer une recherche DNS pour ceux-ci. C'est un comportement assez étrange aussi, mais cela ne causera au moins aucun problème.
Tonny
@tonny c'est parce que POSIX inet_addr () renvoie -1 pour les valeurs non valides, ce qui revient en boucle à 255. La nouvelle routine, mentionnée dans la page de manuel Linux, permet une meilleure gestion des erreurs.
cde
@ cde Je n'ai jamais pris la peine de plonger aussi profondément dans la mécanique de inet_addr (). Je te crois sur parole :-)
Tonny
13

Comme Lightness Races in Orbit et d’autres l’ont souligné,

La INET(3)page de manuel décrit inet_addret décrit inet_atonles fonctions standard utilisées pour convertir la "notation numérique IPv4 sous forme binaire". Ça dit

... les composants de l'adresse en pointillé peuvent être spécifiés en décimal, octal (avec un 0 au début) ou hexadécimal avec un 0 au début).

Donc techniquement, NON , une adresse IP avec des zéros non significatifs n'est pas (toujours) la même que celle sans zéros non significatifs. Dans votre cas cependant, 192.168.2.100et 192.168.002.100sont identiques, car 002 == 2.

Toute interface utilisateur nécessitant que chaque composant ait exactement trois caractères, avec des zéros non requis de manière incorrecte, est cassée.

Jonathon Reinhart
la source
1
L'idée que des "zéros non significatifs" soient requis (sur certains équipements) ne semble pas être contestée; Quelle est la base pour appeler ce "incorrect-requis" / "cassé"? Juste parce qu'il viole INET (3) / inet_addr / inet_aton? Les mises en œuvre nécessitant de tels zéros utilisent probablement un autre code pouvant communiquer sans problème, et ne sont donc pas "cassées". (J'ai déjà vu des imprimantes faire cela.) Existe-t-il une raison de dire que la page de manuel INET (3) est plus "correcte" / une ressource plus fiable que d'autres documents officiels, tels que les RFC et autres cités dans ce projet de document ?
TOOGAM
6

Certaines implémentations considèrent les octets avec des zéros non significatifs comme des décimales, tandis que d'autres implémentent les octaux. Tant que l'octet est compris entre 0 et 7, cela ne fait aucune différence. Ainsi, par exemple, serait 192.168.002.100interprété comme 192.168.2.100dans les deux implémentations.

Mais si vous deviez saisir une adresse, 192.168.010.100elle pourrait être interprétée de la même manière 192.168.10.100ou en 192.168.8.100fonction de la mise en œuvre. Il n’est également pas improbable que des implémentations existent, ce qui considérerait les zéros comme une erreur de syntaxe. En outre, il existe des scénarios dans lesquels le logiciel peut exiger que vous utilisiez la représentation canonique pour une raison ou une autre. Pour toutes ces raisons, je vous recommande d’éviter les zéros lorsque vous écrivez une adresse IP.

Si vous écrivez un logiciel qui doit analyser une adresse IP, je vous recommanderais d’accepter les zéros non significatifs, mais d’envoyer un avertissement à un emplacement approprié, le cas échéant.

Légèrement liées, il existe des implémentations qui vous permettent d’avoir moins de quatre composants dans la notation en pointillé. Lorsqu'il y a moins de quatre composants, le dernier composant a plus de 8 bits et les composants précédents ont exactement 8 bits. Par exemple 192.168.612serait effectivement un moyen valide pour écrire 192.168.2.100. Mais encore une fois, l’utilisation de cette notation n’est pas recommandée.

Kasperd
la source
0

Juste un petit conseil: dans certains cas, il est important d’utiliser zéro préfixe dans les adresses IP. Un exemple, est Apache .htaccess nier les règles.

Si vous utilisez quelque chose comme

deny from 11.22.33.22

Apache est tellement stupide qu'il va également bloquer l'accès des adresses IP suivantes:

111.22.33.22

11.22.33.221

211.22.33.221

et en général, toute adresse IP qui comprend 11.22.33.22

Donc, pour vous assurer de ne bloquer aucune adresse IP que vous ne vouliez pas bloquer, vous devez utiliser:

deny from 011.022.033.022

pour être sûr qu'Apache ne bloquera l'accès qu'à partir de l'adresse IP 11.22.33.22.

Nick Gar
la source
3
Intéressant. Pouvez-vous fournir une référence pour cela?
Scott
La référence est l'expérience personnelle et de nombreux essais et erreurs, après avoir trouvé de nombreux visiteurs bloqués pour ne pas utiliser de zéros non significatifs. Une autre façon d'éviter les interdictions erronées consiste à utiliser l'adresse IP au format CIDR. Par exemple, 11.22.33.22/32 au lieu de seulement 11.22.33.22
Nick Gar
0

soyez prudent avec cela. il DOIT être le même , mais il est pas !
Je ne pouvais pas trouver d'explication à cela, mais je peux dire que sur Windows et Linux, les adresses IP avec et sans zéros ne sont PAS les mêmes! peut-être que cela a à voir avec la conversion d'autres formats comme hex ou binaire.

D'après mon expérience avec Windows et Linux, il n'est pas dépendant de l'outil mais dépend de l'OSI car il semble que je rencontre un problème d'utilisation d'ips comme 10.08.03.100:

  • remarque: "10.08.0.1" et 10.09.0.1 sont introuvables
  • note: "10.010.0.1" est résolu en 10.8.0.1

linux / debian7 / 8: mêmes résultats avec les outils "ping" et "snmpget"

user@test:~$ ping 10.7.0.1
PING 10.7.0.1 (10.7.0.1) 56(84) bytes of data.
^C
--- 10.7.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.07.0.1
PING 10.07.0.1 (10.7.0.1) 56(84) bytes of data.
^C
--- 10.07.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
^C
--- 10.8.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.08.0.1
**ping: unknown host 10.08.0.1**
user@test:~$ ping 10.9.0.1
PING 10.9.0.1 (10.9.0.1) 56(84) bytes of data.
^C
--- 10.9.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.09.0.1
ping: unknown host 10.09.0.1
user@test:~$ ping 10.10.0.1
PING 10.10.0.1 (10.10.0.1) 56(84) bytes of data.
^C
--- 10.10.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.010.0.1
PING 10.010.0.1 (10.8.0.1) 56(84) bytes of data.
^C
--- 10.010.0.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1001ms

windows7 / 8/10: mêmes résultats avec les outils "ping" et "telnet"

(désolé, je n'ai pas de fenêtre anglaise sous la main, une erreur indique que l'hôte n'a pas pu être trouvé)

C:\Users\user>ping 10.7.0.1

Ping wird ausgeführt für 10.7.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.07.0.1

Ping wird ausgeführt für 10.7.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.8.0.1

Ping wird ausgeführt für 10.8.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.08.0.1
Ping-Anforderung konnte Host "10.08.0.1" nicht finden. Überprüfen Sie den Namen,

C:\Users\user>ping 10.9.0.1

Ping wird ausgeführt für 10.9.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.09.0.1
Ping-Anforderung konnte Host "10.09.0.1" nicht finden. Überprüfen Sie den Namen,

C:\Users\user>ping 10.10.0.1

Ping wird ausgeführt für 10.10.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.010.0.1

Ping wird ausgeführt für 10.8.0.1 mit 32 Bytes Daten:
STRG-C
^C
vchrizz
la source
Un zéro au début indique souvent un octal. En effet, l'octal 010 est un nombre décimal 8 et 08 et 09 sont des nombres octaux invalides. Donc, oui, la réponse (actuellement) acceptée par AthomSfere est fausse (ou du moins incomplète). Voir ses commentaires et certaines des autres réponses.
Arjan
Ugh, cette manipulation de 10.010.0.1 est absolument terrible. Dans Microsoft Windows, la commande ping 10.070.0.1 est traitée comme 10.56.0.1 et 10.080.0.1 génère une erreur instantanée: "La requête Ping n'a pas pu trouver l'hôte 10.080.0.1. Veuillez vérifier le nom et réessayer."
TOOGAM
1
Oui, @TOOGAM, l'octal 070 est le nombre décimal 56. Et l'octal 080 n'est pas un nombre valide.
Arjan
-4

Les deux adresses IP sont différentes.

Pourtant:

  • Les gens les considèrent généralement les mêmes.
  • Certains logiciels les considèrent comme identiques.
  • Certains logiciels, sur certaines plateformes, les considéreront comme différents.

Si cela semble déroutant, c'est parce qu'il n'y a pas de norme régissant la manière dont les adresses IP sont censées être écrites. Des programmeurs différents à des moments différents de l'histoire et sur des plates-formes différentes ont donc des idées différentes sur ce qu'il convient de faire.

Les adresses IP sont en fait binaires et les utilisateurs ont tendance à utiliser une notation décimale à points pour représenter les adresses IP. Le logiciel peut accepter diverses bases numériques (décimal, octal, hex) et interpréter les choses de différentes manières en fonction de la manière dont vous l'écrivez. Comment vous écrivez peut indiquer au logiciel la base dans laquelle vous écrivez.

Je vous conseille de ne pas utiliser de zéros non significatifs si vous souhaitez utiliser la notation décimale en pointillés. Certains logiciels considèrent qu'un indicateur signifie que vous entrez un nombre octal. Si vous voulez entrer un nombre décimal, vous n'obtiendrez pas les résultats escomptés.

J'ai posé une question similaire et obtenu de bonnes réponses. Si vous voulez lire les RFC, il y a de bonnes informations à avoir.

EncoreAnotherRandomUser
la source
-6

Cela devrait fonctionner dans les deux sens. Vous pouvez même faire un ping avec des nombres à trois chiffres et l'ordinateur comprendra l'adresse IP.

Edit : Windows le lira en octal, cela ne fonctionne que pour Linux.

xR34P3Rx
la source
C'est vrai. Le format décimal en pointillé, comme on le sait, n’est vraiment que pour les humains. Les périphériques du réseau n'utilisent pas cette représentation d'adresse IP.
Patrick Seymour
1
@Brock Vond: Oui, sauf que je pense que vous avez transposé les 186 et 168 accidentellement.
Patrick Seymour
6
L'utilisation de ping avec des nombres à 3 chiffres peut ne pas fonctionner. Il peut les traiter comme octal.
Greenstone Walker
1
@ LightnessRacesinOrbit En fait, l'exemple donné fonctionnera même si vous les mettez à zéro, du moins sous Windows et Debian (je n'ai pas de Mac). Le bogue / la fonctionnalité ne se produit que si le nombre est rempli à zéro et que le nombre à zéro est supérieur à 7 (octal et décimal étant identiques). Si vous essayez d'entrer une adresse décimale valide complétée de zéros (par exemple, 012.034.056.078), le système tentera néanmoins de l'analyser en tant qu'octal, ce qui entraînera un échec de la fonction ping.
Mars Ho
1
@MarchHo: Oui, c'est ce que nous disons tous.
Courses de légèreté en orbite
-11

Le zéro non significatif n'a pas de sens. Les octets sont des nombres (base 10) de 0 à 255, pas des chaînes.

Puisque je ne sais pas exactement ce que vous demandez (ou que vous savez quelle question poser :)): Cela dit, l’IP # doit figurer dans le même sous-réseau que votre réseau. Si vous sélectionnez 11.12.13.14 dans un masque de sous-réseau de 192.168.0.0, ce périphérique ne pourra ni parler ni utiliser ce sous-réseau.

RenegadeX
la source
lol - non, je comprends le sous-réseau et les concepts de base de la mise en réseau ... Je n'ai jamais rencontré de produit nécessitant 3 chiffres. J'utilisais simplement le 11.12.13.14 comme variables ... mais merci :)
Brock Vond
9
-1: Non, inet_addret les centaines de milliers d'outils qui en dépendent pour l'analyse des adresses prennent un 0 devant pour signifier que l'octet est donné en notation en base 8. C'est à peine "sans signification".
Courses de légèreté en orbite