Warum gibt Ping 192.168.072 (nur 2 Punkte) eine Antwort von 192.168.0.58 zurück?

379

Ich habe fälschlicherweise den Punkt einer IP-Adresse übersehen und eingetippt 192.168.072.
Zu meiner Überraschung stellte ich eine Verbindung zu einer Maschine her192.168.0.58

Wenn ich pinge, 192.168.072bekomme ich Antworten von 192.168.0.58.

Warum ist das?


Ich bin auf einem Windows-PC in einer Windows-Domäne.


Wenn ich ping 192.168.72erhalte ich eine Antwort von 192.168.0.72, so scheint es , die 0in 072(in meinen ursprünglichen Fehlern) ist signifikant.


Diese Frage war eine Super User Frage der Woche .
Lesen Sie den Blog - Eintrag , um weitere Informationen oder tragen zu dem Blog selbst

George Duckett
quelle
2
Interessanterweise passiert genau dasselbe unter Linux: ping 192.168.072prints PING 192.168.072 (192.168.0.58) 56(84) bytes of data.[...].
Mechanische Schnecke
9
Was noch zufälliger ist, dass Sie eine Maschine hatten 192.168.0.58, um eine Antwort zu bekommen. Wie stehen die Chancen dafür?
James Mertz
3
@KronoS Es ist eigentlich nicht so seltsam, wenn Sie in einem Schul- oder Firmennetzwerk sind. Einige DHCP-Server geben die Adressen in aufsteigender Reihenfolge an und die meisten werden verwendet.
Taum
5
192.168.0.58Zeitüberschreitung für mich .. können alle Ping-Anfragen den Server irgendwie ausgeknockt haben ?!
schändlich

Antworten:

570

Jeder verkompliziert es mit RFCs, IP-Klassen und dergleichen. Führen Sie einfach ein paar Tests durch, um pingfestzustellen, wie der Befehl die vom Benutzer eingegebene IP-Adresse analysiert (überflüssige Spreu entfernt):

> 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:

Wie Sie sehen, können Sie mit dem pingBefehl (in Windows) verschiedene IP-Adressformate verwenden. Eine IPv4-Adresse kann wie folgt in vier Teile („gepunktetes Quad“) unterteilt werden: Mit A.B.C.Ddem pingBefehl können Sie einige weglassen 0und die folgenden Standardwerte eingeben:

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

Wenn Sie nur ein einzelnes Teil angeben, wird es wie oben beschrieben behandelt, wenn es unter 255 liegt (das Maximum für ein Oktett). Wenn es jedoch größer als 255 ist, wird es konvertiert und in das nächste Feld verschoben (dh mod 256).

Es gibt einige Randfälle, bei denen mehr als vier Teile anscheinend nicht funktionieren (z. B. funktioniert die google.comIP von Ping entweder nicht 0.74.125.226.4oder nicht 74.125.226.4.0).

Sie können auch die hexadezimale Notation sowohl in gepunkteter Quad-Form als auch in flacher Form verwenden. Sie müssen sie jedoch formatieren, indem Sie sie vor 0xjedem Oktett einfügen.


Es gibt also viele Möglichkeiten, eine (IPv4-) IP-Adresse darzustellen. Sie können ein flaches oder gepunktetes Vierfach- (oder gepunktetes Dreifach-, gepunktetes Doppel- oder sogar gepunktetes Einfach-) Format verwenden und für jedes Format Dezimal, Oktal und Hexadezimal verwenden (oder sogar mischen und abgleichen). Sie können beispielsweise google.comauf folgende Arten pingen:

  • google.com  (Domainname)
  • 74.125.226.4  (gepunktete Dezimalstelle)
  • 1249763844  (flache Dezimalstelle)
  • 0112.0175.0342.0004  (gepunktetes Oktal)
  • 011237361004  (flaches Oktal)
  • 0x4A.0x7D.0xE2.0x04  (gepunktetes Hex)
  • 0x4A7DE204  (flaches Sechseck)
  • 74.0175.0xe2.4  (ಠ_ಠ)

(Gott sei Dank, dass die Unterstützung von Binärnotationen nicht hinzugefügt wurde!)


Anwendung :

In Ihrem Fall 192.168.072verwendet Ping das dritte Format in der obigen Tabelle ( A.B.0.C), sodass Sie tatsächlich pingen 192.168.0.072. Da Sie im letzten Teil eine führende Null haben, wird diese als Oktal behandelt, das in Dezimalzahl 58 ist.

Geheimnis gelüftet.


Beachten Sie, dass der Windows- pingBefehl zwar eine Vielzahl von Formaten für die Eingabe zulässt und Nicht-Standardformate in der gezeigten Weise interpretiert, dies jedoch nicht unbedingt bedeutet, dass Sie solche Formate überall verwenden können. Einige Programme können Sie zwingen, alle vier Teile eines gepunkteten Quadrats anzugeben, andere erlauben möglicherweise nicht das Mischen und Anpassen von Dezimal- und Oktalwerten und so weiter.

Außerdem erschweren IPv6-Adressen die Parsing-Logik und die Akzeptanz des Eingabeformats.


Nachtrag :

syss wies darauf hin, dass wenn Sie ein ungültiges Zeichen in einer der Zahlen verwenden (z. B. ein 8oder 9wenn Sie ein Oktal, ein gim Hex-Modus usw. verwenden), pinges klug genug ist, dies zu erkennen und als Zeichenfolge zu interpretieren (-al? -ic?) URL anstelle einer numerischen IP-Adresse.

(Als jemand, der zahlreiche Aneurysmen und Herzinfarkte hatte und versuchte, vermeintlich „einfachen“ Code zu schreiben, um die exponentiell explodierende Anzahl von Permutationen von Datenwerten zu berücksichtigen, schätze ich, dass er alle Eingabevariationen korrekt verarbeitet.) Fall, mindestens 3 1 +3 2 +3 3 +3 4 = 120 Variationen.)

Während die Angabe von 010.020.030.040will ping 8.16.24.32wie erwartet erfolgt, wird die Übergabe 010.020.030.080an pingwie eine URL statt wie eine IP-Adresse behandelt - wie foo.bar.baz.comsie existieren könnte (aber leider nicht existiert). Mit anderen Worten, es wird versucht, die Unterdomäne 010an die Unterdomäne 020in der Domäne 030auf der obersten Ebene zu senden 080. Da 080es sich jedoch nicht um eine gültige TLD (wie .com, .netund ihre Freunde) handelt, schlägt die Verbindung gleich im ersten Schritt fehl.

Dasselbe passiert, 090.010.010.010wenn sich das ungültige Zeichen in einem anderen Oktett befindet. Ebenso 0xf.0xf.0xf.0xfpingt 15.15.15.15, 0xh1.0x1.0xg0.0fscheitert aber .

Na ja, ich denke, das ist es, was man bekommt, wenn man mehrere Zahlen nicht fließend beherrscht.

Es ist wahrscheinlich einfacher und sicherer, nur sicherzustellen, dass immer 4-Punkt-Quad-Adressen ("40q"? "Quaddy-Quad"? "Cutie-Q"?) Verwendet werden.

Geht also weiter und lernt einige Zahlenbasen . Sie werden in der Lage sein, auf Partys anzugeben und das Leben von Partys zu sein, und wie sie sagen, gibt es 10 Arten von Menschen: diejenigen, die binär sind und diejenigen, die nicht sind.

Denken wir nicht einmal an IPv6-Adressen. Ich denke, sie sind eines der 111 Siegel !!!

Synetech
quelle
39
Überkompliziert? Das Experimentieren kann sehr nützlich sein und in diesem Fall eine gute Antwort ergeben. Aber ohne Theorie, Dokumentation oder Standards können Sie einen kritischen Faktor übersehen und wissen es nicht. Oder Sie stellen fest, wie eine bestimmte Version funktioniert, und liegen bei 90% der Implementierungen falsch. Oder Sie können Regeln entwickeln, die die Ergebnisse Ihrer Experimente erklären, aber komplizierter sind als die beabsichtigten Regeln. In diesem Fall denke ich, dass die Regeln der Dokumentationen (für inet_aton()) in einer Hinsicht einfacher sind - keine Bedingungen für "unter / über 255".
LarsH
71
Guck mal! Der Teil "Wissenschaft" der Informatik taucht auf! (Hypothese
erstellen
13
@LarsH, das ist mein Punkt, dass der pingBefehl (zumindest unter Windows) wie bei vielen Microsoft-Programmen (insbesondere dem berüchtigten) IE ist. Es versucht, zu verzeihend zu sein und alles zu nehmen, was man darauf wirft, und es zu interpretieren. Ja, es gibt ein offizielles Dokument über IP-Adressformate, aber das ist keine Frage zu ISOs und RFCs, es ist praktisch, ich habe etwas getan und es ist eine seltsame Frage, die beantwortet werden kann, ohne auf etwas zurückzugreifen (zugegebenermaßen lang, trocken, langweilig) technische Spezifikationen) - obwohl die Verknüpfung zu ihnen, falls das OP sie lesen möchte, auch gut ist.
Synetech
6
Das oktale Parsen mit dem Präfix 0 sollte vollständig aufgegeben werden, bis auf chmod. Das ist es. Das ist die einzige Ausnahme für das Oktal. Zeitraum.
James Dunne
6
Dies ist nützlich für die Konvertierung von RGB-HEX in DEC. lol ~C:\>ping 0xffffcc Pinging 0.255.255.204 with 32 bytes of data:
Wilson
147

Dafür gibt es zwei Gründe:

Erstens gibt ein '0'-Präfix eine Oktalzahl an . Da oct (072) = dec (58), 192.168.072 = 192.168.58.

Zweitens kann die vorletzte 0 als Kurzform von IP-Adressen entfernt werden . 127.0.1 wird als 127.0.0.1 interpretiert, und in Ihrem Fall wird 192.168.58 als 192.168.0.58 interpretiert.

neu242
quelle
7
Es werden keine Nullen gruppiert. Tatsächlich wird jeder Punkt als Trennzeichen behandelt, das der nächsten Bytegrenze entspricht. Somit sind die IP-Adressen 2130706433 und 127.0.0.1 dieselben Adressen.
Serge
2
Genauer gesagt ist es die vierpunktierte Notation im Fall einer IP-Adresse
Guillaume86
4
Die berühmte führende Null hat wieder einmal geschlagen!
Luc M
2
Das ist die wahre Antwort!
l - '' '' ''---------' '' '' '' '' ''
2
Diese Antwort ist falsch und irreführend. Das Löschen einer 0 in 1.0.2.3 (1.2.3) ergibt eine andere IP-Adresse (1.2.0.3).
sch
101

Zusätzlich zu @ neu242s wichtigem Punkt zur Oktalnotation und der Beobachtung, dass IP-Adressen verkürzt werden können, ist es wichtig zu wissen, wie verkürzte IP-Adressen interpretiert werden.

Man könnte naiv annehmen, dass der Parser, wenn einige der vier Zahlen fehlen, null gefüllte Bytes an das Ende (oder den Anfang) der Folge von Bytes anfügt. Dies entspricht jedoch nicht dem vom OP gemeldeten Verhalten: 192.168.072 wurde als 192.168 analysiert. 0 .58, nicht als 192.168.58. 0 , noch 0 .192.168.58.

Anscheinend verwenden Windows- und Linux-Ping (die Version, die Sie ausprobiert haben, und die, die ich ausprobiert habe) etwas, das inet_aton () entspricht, um das Argument der IP-Adresse zu analysieren. Die Manpage für inet_aton () sagt:

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.

Also da haben Sie es ... 192.168.072passt zum abc-Muster, also wurde das 072(nach dem Parsen als Oktalzahl) als 16-Bit-Wert interpretiert, der die äußersten rechten 2 Bytes der Binäradresse definiert, was äquivalent ist zu 0.58.

Die obigen Regeln entsprechen der Aussage, dass, wenn eine der vier Zahlen fehlt, die benötigten nullgefüllten Bytes unmittelbar vor der letzten angegebenen Zahl hinzugefügt werden ... weder am Ende noch am Anfang der Bytefolge. (Dies funktioniert, wenn die zuletzt angegebene Zahl kleiner als 256 ist.)

Beachten Sie, dass neuere Versionen von Ping möglicherweise weder diese Art von Kurzform noch die oktale Interpretation zulassen. Der 2010 gefundene Quellcode für iputils (einschließlich Ping) verwendet inet_pton () anstelle von inet_aton (), um das IP-Adressargument zu analysieren. Die Manpage für inet_pton () sagt:

Im Gegensatz zu inet_aton (3) und inet_addr (3) unterstützt inet_pton () IPv6-Adressen. Andererseits akzeptiert inet_pton () IPv4-Adressen nur in Punkt-Dezimal-Schreibweise, wohingegen inet_aton (3) und inet_addr (3) die allgemeinere Zahl-Punkt-Schreibweise (hexadezimales und oktales Zahlenformat sowie Formate, die nicht zulässig sind) zulassen. t alle vier Bytes müssen explizit geschrieben werden).

LarsH
quelle
12
Dies ist bei weitem die beste Antwort IMHO.
Josh
Unter Windows suchen Sie nach inet_addrin Winsock.
user7116
24

Sie müssen auch berücksichtigen, dass eine IP durch Ganzzahlen dargestellt werden kann, die in ihrer Bedeutung zu ihrer Position addiert werden.

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

Hier ist die coole Sache:

192.168.58 wird 192.168.0.58 sein, weil

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

192.11010106 wird auch 192.168.0.58 sein, weil

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

3232235578 wird auch 192.168.0.58 sein, weil

  192 * 256^3 
+ 168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 3232235578
Vesquam
quelle
1
"192.168.56 wird 192.168.0.56 sein, weil 0 * 256 ^ 1 + 58 * 256 ^ 0 = 58" Sind Sie sicher? Sie würden erwarten, dass 168 im ersten Fall mit 256 ^ 1 und im zweiten Fall mit 256 ^ 2 multipliziert wird. In ähnlicher Weise würden 192 mit 256 ^ 2 gegenüber 256 ^ 3 multipliziert. 192.168.56 kann also nur dann = 192.168.0.56 sein, wenn zusätzliche Regeln vorhanden sind, z. B. das Löschen von Nullen.
LarsH
@ LarsH, ich denke, was hier gesagt wird, ist, dass es von links nach rechts basiert, im Gegensatz zu "normaler" Zählung, bei der wir alles von der 1-Stelle aus aufbauen. Der erste Punkt bewirkt also, dass das, was links davon ist, mit 256 ^ 3 multipliziert wird, der zweite mit 256 ^ 2, der dritte mit 256. Wenn kein Punkt links davon ist, wird er ohne Multiplikation mit 256 addiert ^ n. Also 1.2.3. (1.2.3.0) würde sich von 1.2.3 (1.2.0.3) unterscheiden, wenn ich das richtig verstehe.
iX3
@ iX3: Wenn dies der Fall wäre, wäre "192.168.56 wird 192.168.0.56 sein" falsch, da im ersten Fall 56 mit 256 ^ 1 multipliziert würde, während im zweiten Fall 56 nur multipliziert würde y 256 ^ 0. Und die 192.168.072 des OP würden als 192.168.58.0 anstelle von 192.168.0.58 interpretiert.
LarsH
Etwas irreführend ist die Tatsache, dass die Adresse 0 die 3. Ziffer hat. Betrachten Sie diese Adresse als 192.168.1.56. Die dreistellige Form wäre 192.168.312. Da 1 * 256 ^ 1 + 56 * 256 ^ 0 ist 312
vesquam
1
Die Punkte dienen nur zur Abgrenzung, welche Zahlen mit welcher Potenz von 256 multipliziert werden sollen. Der Parser sucht nach dem ersten Punkt und multipliziert die Zahl davor mit 256 ^ 3. Wiederholen Sie dies für den 2. und 3. Punkt, jedoch mit 256 ^ 2 bzw. 256 ^ 1. Dann addiert es alle Ergebnisse (einige Impl. Behalten stattdessen möglicherweise eine laufende Summe bei, obwohl das Ergebnis dasselbe ist). Wenn einer dieser Punkte fehlt, wird die Multiplikation einfach nicht ausgeführt und die endgültige Zahl wird zur laufenden Summe hinzugefügt. Das ist auch der Grund, warum 1.2.3.ein Fehler auftritt, da der Parser nicht die letzte Zahl finden kann, die zur Gesamtsumme hinzugefügt werden soll.
Justin ᚅᚔᚈᚄᚒᚔ