Sind IP-Adressen mit und ohne führende Nullen gleich?


89

Ich habe ein Sicherheitssystem und die Netzwerkeinstellung erlaubt nur eine dreistellige IP-Adresse. Ich kann es nicht einstellen 192.168.2.100, sondern muss es verwenden 192.168.002.100.

Unterscheiden sich diese beiden IP-Adressen? Muss ich das LAN meines Routers so einstellen, dass alles 192.168.xxx.xxxfunktioniert? Ich kann keine soliden Informationen darüber finden.


16
Gemäß den folgenden Antworten sollte 192.168.020.100 nicht mit 192.168.20.100 identisch sein, aber es kann dasselbe sein, wenn Ihr System die Eingabe von IP-Adressen nur auf diese Weise zulässt (ich habe dies bei Kopierern gesehen, wenn die IP-Adresse von eingegeben wurde) Ziffer mit Auf-Ab-Pfeilen). - Wenn Ihr System diese Eigenart hat, auch wenn eine "normale" Tastatureingabe möglich ist (dh Sie können zwar eine technische Eingabe vornehmen 192.168.2.100, sich aber beschweren), sollten Sie sich mit dem Anbieter in Verbindung setzen (Wie vertrauenswürdig ist das Sicherheitssystem, wenn seine Eingabe validiert wird?) ist so beschissen?)
Hagen von Eitzen

4
Das ist wirklich eine bizarre Bestätigung. Ich würde die Sicherheitssysteme wechseln, wie @Hagen andeutet.
Leichtigkeitsrennen im Orbit

2
Dies kann auch softwarespezifisch sein. Sie sind mit oder ohne das führende 0s gültig , aber ich bin auf einige Anwendungen gestoßen, die eine IP-Adresse nicht unterstützen, die nicht 3 Stellen in jedem Oktett hatte.
ps2goat

2
Alle IP (v4) -Adressen sind wirklich nur 32-Bit-Adressen, die auf nette Weise dargestellt werden. Wenn 192.168.002.100ist , wie Ihr Werkzeug darstellt , 0xc0a80264/ 3232236132 / 192.168.2.100, dann ist es das Gleiche.
Tim S.

1
Kannst du bitte eine andere Antwort annehmen? Der von Ihnen akzeptierte ist wirklich falsch (oder zumindest unvollständig) und hat 11 Abwertungen.
Arjan

Antworten:


101

Das hängt vom Werkzeug ab.

Für die meisten Zwecke sind die beiden gleich, aber nicht immer.

Wenn Sie beispielsweise eine dreistellige Zahl verwenden, die mit einer Null beginnt (oder eine zweistellige Zahl, die mit einer Null beginnt, danke @ Dietrich-Epp), geht ping davon aus, dass die Zahlen oktal sind.

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),

37
Nicht so viel Ping, aber die zugrunde liegende Routine, die es verwendetinet_addr()
cde

2
Es passiert auch unter OSX.
Johann Philipp Strathausen

21
Das liegt nicht daran, dass es drei Ziffern hat, sondern daran, dass die Zahl eine führende Null hat. Sie können dies testen, indem Sie versuchen, 09.09.09.09 zu pingen, was nicht funktioniert, da 9 im Oktal nicht gültig ist.
Dietrich Epp

65

Angenommen, die gesamte von Ihnen verwendete Software verwendet Punkt-Dezimal und Subnetze korrekt. Ja, sie sind identisch.

192.168.0.1 ist beispielsweise nur die freundliche Punkt-Dezimal-Notation des Punkt-Binärwerts 11000000.10101000.00000000.00000001.

Unabhängig davon, ob Sie es als 192.168.0.1 oder 192.168.000.001 eingeben, sind beide gleich 11000000.10101000.00000000000001


63
Die Punkte dienen auch der Bequemlichkeit; Die tatsächliche IP-Adresse lautet 1100000010101000000000000001
am

14
@cpast oder als Hexadezimalzahl:C0A80001
jfs

13
oder als Oktalzahl (beginnend mit 0, mit oder ohne Punkte) zB ping 0300.0250.2.0144 für 192.168.2.100
Sergey

15
oder als Dezimalzahl3232235521
oldmud0

14
Wie die Antwort von @GreenstoneWalker zeigte, werden viele Programme sie nicht als gleich empfinden. Eine Zahl mit einer führenden Null (die nicht die Ziffern 8 oder 9 enthält) wird als Oktalzahl verstanden. daher würde 010.000.001.063 als "8.0.1.51" (Oktal 010 = Dezimal 8; Oktal 063 = Dezimal 51) anstelle von "10.0.1.63" interpretiert!
Doktor J

37

Dies hängt von den Tools oder Funktionen ab, die ein bestimmtes Programm zum Analysieren der angegebenen Adresse verwendet. Sowohl Microsoft als auch Linux und andere Betriebssysteme verwenden eine POSIX- kompatible inet_addr()Routine zum Parsen von Adressen.

Viele TCP / IP-Programme wie Ping und FTP verwenden die Sockets-Funktion inet_addr (), um IP-Adresszeichenfolgen in 4-Byte-Adressen zu übersetzen. Diese Funktion akzeptiert eine IP-Adresse in Standard-Dezimal-, Oktal- und Hexadezimalschreibweise.
Microsoft KB115388 Ping und FTP lösen IP-Adresse mit führender Null als Oktal auf

 

Die Funktion inet_addr () konvertiert die Internet-Host-Adresse cp aus der IPv4-Zahlen- und Punktnotation in binäre Daten in der Reihenfolge der Netzwerkbytes.

In allen obigen Formen können Komponenten der gepunkteten Adresse dezimal, oktal (mit einer führenden 0) oder hexadezimal mit einer führenden 0X angegeben werden. Adressen in jeder dieser Formen werden zusammen als IPv4- Zahlen und -Punkte-Notation bezeichnet. Die Form, in der genau vier Dezimalzahlen verwendet werden, wird als IPv4-Punkt-Dezimal-Notation (oder manchmal als IPv4-Punkt-Quad-Notation) bezeichnet.
inet_addr (3): Routinen zum Ändern von Internetadressen - Linux-Manpage

Aus diesem Grund erfordert Ihr spezielles System möglicherweise eine dreistellige Dezimalschreibweise für jedes Oktett. Dies ist jedoch nicht allgemein gültig. Achten Sie darauf, dass die richtige IP-Adresse eingegeben wird.

Natürlich funktionieren nur gültige Nummern für jeden Typ. Außerhalb des Bereichs liegende Oktal-, Hexa- oder Dezimalzahlen schlagen ebenfalls fehl oder verursachen Probleme. Octal 088, Hex 0xGG oder Decimal 280 sind ungültige Beispiele.


3
+1 für zugrunde liegende Funktion. Außerdem führt diese Funktion dazu, dass das IP-Parsing fehlschlägt, wenn ein gültiges Byte (z. B. .88) mit Nullen aufgefüllt wird, da 8 keine gültige Zahl im Oktal ist.
14. März,

In Windows XP (und davor) akzeptiert die Funktion ungültige Oktalzahlen und versucht immer noch, diese zu konvertieren. Dies kann zu sehr nicht offensichtlichem Verhalten führen. Ab Vista werden ungültige Nummern als Domänennamen behandelt und Windows versucht, eine DNS-Suche für diese durchzuführen. Das ist auch ziemlich seltsam, aber das wird zumindest keine Probleme verursachen.
Tonny

@tonny Das liegt daran, dass POSIX inet_addr () -1 für ungültige Werte zurückgibt, was eine Schleife um 255 ergibt. Die neuere Routine, wie in der Linux-Manpage erwähnt, hat eine bessere Fehlerbehandlung.
29.

@cde Ich habe mich nie darum gekümmert, so tief in die Mechanik von inet_addr () einzutauchen. Ich nehme Ihr Wort dafür :-)
Tonny

13

Wie Lightness Races in Orbit und andere darauf hingewiesen haben,

Die INET(3)Manpage beschreibt inet_addrund beschreibt inet_atondie Standardfunktionen, mit denen die "IPv4-Zahlen-und-Punkte-Notation in Binärform" konvertiert wird. Es sagt

... Komponenten der gepunkteten Adresse können als Dezimalzahl, Oktalzahl (mit einer führenden 0) oder Hexadezimalzahl (mit einer führenden 0X) angegeben werden.

Also technisch gesehen, NEIN , ist eine IP-Adresse mit führenden Nullen nicht (immer) dieselbe wie eine ohne führende Nullen. In Ihrem Fall jedoch 192.168.2.100und 192.168.002.100ist identisch, da 002 == 2.

Jede Benutzeroberfläche, für die jede Komponente genau drei Zeichen lang sein muss und die falsch angeforderte führende Null enthält, ist fehlerhaft.


1
Die Vorstellung, dass (bei einigen Geräten) "führende Nullen" erforderlich sind, scheint unbestritten zu sein. Was ist die Basis für die Bezeichnung "falsch-erforderlich" / "defekt"? Nur weil es INET (3) / inet_addr / inet_aton verletzt? Implementierungen, die solche Nullen erfordern, verwenden wahrscheinlich anderen Code, der möglicherweise einwandfrei kommuniziert und daher nicht "kaputt" ist. (Ich habe gesehen, wie Drucker dies taten.) Gibt es eine Grundlage, die besagt, dass die INET (3) -Manpage "richtiger" ist / eine maßgeblichere Ressource als andere offizielle Dokumente, wie RFCs und andere, die in diesem Dokumententwurf zitiert werden ?
TOOGAM

6

Einige Implementierungen betrachten Oktette mit führenden Nullen als dezimal, andere als oktal. Solange sich das Oktett im Bereich von 0 bis 7 befindet, macht dies keinen Unterschied. So würde zum Beispiel 192.168.002.100wie 192.168.2.100in beiden Implementierungen interpretiert .

Wenn Sie jedoch eine Adresse eingeben, kann 192.168.010.100diese je nach Implementierung als entweder 192.168.10.100oder interpretiert werden 192.168.8.100. Es ist auch nicht unwahrscheinlich, dass Implementierungen existieren, bei denen führende Nullen als Syntaxfehler angesehen werden. Darüber hinaus gibt es Szenarien, in denen Software möglicherweise darauf besteht, dass Sie die kanonische Darstellung aus dem einen oder anderen Grund verwenden müssen. Aus all diesen Gründen empfehle ich, beim Schreiben einer IP-Adresse führende Nullen zu vermeiden.

Wenn Sie Software schreiben, die eine IP-Adresse analysieren muss, würde ich empfehlen, führende Nullen zu akzeptieren, aber in diesem Fall eine Warnung an eine geeignete Stelle auszugeben.

Etwas verwandt gibt es Implementierungen, die es Ihnen ermöglichen, weniger als vier Komponenten in der gepunkteten Notation zu haben. Wenn es weniger als vier Komponenten gibt, hat die letzte Komponente mehr als 8 Bits und die früheren Komponenten haben genau 8 Bits. Zum Beispiel 192.168.612wäre eigentlich eine gültige Schreibweise 192.168.2.100. Die Verwendung dieser Notation wird jedoch nicht empfohlen.


0

Nur ein kleiner Tipp: In einigen Fällen ist es wichtig, in den IP-Adressen Null-Präfixe zu verwenden. Ein Beispiel ist Apache .htaccess Deny Rules.

Wenn du so etwas verwendest

deny from 11.22.33.22

Apache ist so dumm, dass auch der Zugriff von den folgenden IPs blockiert wird:

111.22.33.22

11.22.33.221

211,22,33,221

und im allgemeinen jede IP - Adresse , die beinhaltet 11.22.33.22

Um sicherzugehen, dass Sie keine IP-Adressen blockieren, die Sie nicht blockieren wollten, sollten Sie Folgendes verwenden:

deny from 011.022.033.022

um sicherzugehen, dass Apache den Zugriff nur von der IP-Adresse 11.22.33.22 blockiert.


3
Interessant. Können Sie hierfür eine Referenz angeben?
Scott

Die Referenz ist persönliche Erfahrung und viele Versuche und Fehler, nachdem festgestellt wurde, dass viele Besucher blockiert wurden, weil keine führenden Nullen verwendet wurden. Eine andere Möglichkeit, falsche Verbote zu vermeiden, ist die Verwendung der IP im CIDR-Format. Zum Beispiel 11.22.33.22/32 statt nur 11.22.33.22
Nick Gar

0

Sei vorsichtig damit. es sollte das gleiche sein , aber es ist NICHT !
Ich konnte keine Erklärung dafür finden, aber ich kann definitiv sagen, dass auf Windows und Linux IP-Adressen mit und ohne führende Nullen nicht gleich sind! Vielleicht hat dies mit der Konvertierung von anderen Formaten wie Hex oder Binär zu tun.

Aus meiner Erfahrung mit Windows und Linux ist es nicht toolabhängig, sondern os-abhängig, da ich mit IPS wie 10.08.03.100 ein Problem habe:

  • Hinweis: "10.08.0.1" und 10.09.0.1 konnten nicht gefunden werden
  • Hinweis: "10.010.0.1" wurde in 10.8.0.1 aufgelöst

linux / debian7 / 8: gleiche ergebnisse mit tool "ping" und "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: gleiche ergebnisse mit tool "ping" und "telnet"

(Entschuldigung, ich habe kein englisches Fenster zur Hand, der Fehler sagt, dass der Host nicht gefunden werden konnte.)

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

Eine führende Null bedeutet oft Oktal. In der Tat ist Oktal 010 Dezimal 8 und 08 und 09 sind ungültige Oktalzahlen. Also ja, die (aktuell) akzeptierte Antwort von AthomSfere ist falsch (oder zumindest unvollständig). Siehe seine Kommentare und einige der anderen Antworten.
Arjan

Ugh, diese Behandlung von 10.010.0.1 ist einfach absolut schrecklich. In Microsoft Windows wird Ping 10.070.0.1 als 10.56.0.1 behandelt und 10.080.0.1 gibt einen sofortigen Fehler aus: "Ping-Anforderung konnte Host 10.080.0.1 nicht finden. Bitte überprüfen Sie den Namen und versuchen Sie es erneut."
TOOGAM

1
Ja, @TOOGAM, Oktal 070 ist Dezimalzahl 56. Und Oktal 080 ist keine gültige Zahl.
Arjan

-4

Die beiden IP-Adressen sind unterschiedlich.

Jedoch:

  • Die Leute würden sie im Allgemeinen gleich betrachten.
  • Einige Software würde sie gleich betrachten.
  • Manche Software, auf manchen Plattformen, wird sie als unterschiedlich betrachten.

Wenn das verwirrend klingt, liegt es daran, dass es keinen Standard gibt, der regelt, wie IP-Adressen geschrieben werden sollen, sodass verschiedene Programmierer zu verschiedenen Zeitpunkten in der Geschichte und auf verschiedenen Plattformen unterschiedliche Vorstellungen hatten, was zu tun ist.

IP-Adressen sind eigentlich binär und die IP-Adressen werden in der Regel mit einer gepunkteten Dezimalschreibweise dargestellt. Software kann verschiedene numerische Basen (dh Dezimal, Oktal, Hex) akzeptieren und die Dinge auf verschiedene Weise interpretieren, je nachdem, wie Sie sie schreiben. Wie Sie schreiben, kann der Software mitteilen, auf welcher Basis Sie schreiben.

Ich rate Ihnen: Verwenden Sie keine führenden Nullen, wenn Sie eine gepunktete Dezimalschreibweise verwenden möchten. Einige Software-Programme betrachten dieses Flag als Zeichen dafür, dass Sie eine Oktalzahl eingeben. Wenn Sie eine Dezimalzahl eingeben möchten, erhalten Sie nicht die erwarteten Ergebnisse.

Ich habe eine ähnliche Frage gestellt und einige gute Antworten erhalten. Wenn Sie sich also über RFCs informieren möchten, gibt es dort gute Informationen.


-6

Es sollte so oder so funktionieren. Sie können sogar mit dreistelligen Zahlen pingen und der Computer wird die IP-Adresse verstehen.

Edit : Windows liest es als Oktal, dies funktioniert nur unter Linux.


Das ist wahr. Das gepunktete Dezimalformat, wie es heißt, ist eigentlich nur für Menschen. Geräte im Netzwerk verwenden diese Darstellung einer IP-Adresse nicht.
Patrick Seymour

1
@Brock Vond: Ja, außer ich denke du hast die 186 und 168 versehentlich vertauscht.
Patrick Seymour

6
Die Verwendung von Ping mit 3-stelligen Zahlen funktioniert möglicherweise nicht. Es kann sie als oktal behandeln.
Greenstone Walker

1
@LightnessRacesinOrbit Tatsächlich funktioniert das angegebene Beispiel auch, wenn Sie sie auf null setzen, zumindest unter Windows und Debian (ich habe keinen Mac). Der Fehler / die Funktion tritt nur auf, wenn die Zahl mit Nullen aufgefüllt ist und die mit Nullen aufgefüllte Zahl größer als 7 ist (da Oktal und Dezimal identisch wären). Wenn Sie versuchen, eine gültige mit Nullen aufgefüllte Dezimaladresse einzugeben (z. B. 012.034.056.078), wird weiterhin versucht, diese als oktal zu analysieren, was zum Fehlschlagen der Ping-Funktion führt.
März,

1
@MarchHo: Ja, das sagen wir alle.
Leichtigkeitsrennen im Orbit

-11

Die führende Null ist bedeutungslos. Die Oktette sind (Basis-10) 0-255 Zahlen, keine Zeichenketten.

Da ich nicht genau weiß, was Sie fragen (oder was Sie fragen müssen :)): Das heißt, die IP-Nummer muss sich im selben Subnetz wie Ihr Netzwerk befinden. Wenn Sie 11.12.13.14 in einer Subnetzmaske von 192.168.0.0 auswählen, kann dieses Gerät nicht mit diesem Subnetz kommunizieren oder es verwenden.


Ich verstehe auf jeden Fall das Subnetz und die Grundkonzepte des Netzwerks ... bin nur noch nie auf ein Produkt gestoßen, für das drei Ziffern erforderlich waren. Ich habe gerade den 11.12.13.14 als Variablen verwendet ... aber danke :)
Brock Vond

9
-1: Nein, inet_addrund die Hunderttausende von Tools, die für die Adressanalyse darauf angewiesen sind, nehmen eine führende 0 an, um zu bedeuten, dass das Byte in der Basis-8-Notation angegeben ist. Das ist kaum "bedeutungslos".
Leichtigkeitsrennen im Orbit
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.