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


Ich vermisste versehentlich den Punkt einer IP-Adresse und tippte ein 192.168.072.
Zu meiner Überraschung stellte ich eine Verbindung zu einer Maschine her 192.168.0.58

Wenn ich pinge 192.168.072 Ich bekomme Antworten von 192.168.0.58.

Warum ist das?


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


Wenn ich pinge 192.168.72 Ich bekomme eine Antwort von 192.168.0.72, so scheint es 0 im 072 (in meinem ursprünglichen Fehler) ist signifikant.


Diese Frage war a Super User Frage der Woche.
Lies das Blog-Eintrag für mehr Details oder Beitrag zum Blog dich selber


370
2017-10-12 10:26


Ursprung


Relevant:  blog.superuser.com/2012/02/10/wtfriday-http2915189091 - Tom Wijsman
Interessanterweise passiert genau dasselbe auf Linux: ping 192.168.072 Drucke PING 192.168.072 (192.168.0.58) 56(84) bytes of data.[...]. - Mechanical snail
Was noch zufälliger ist, ist, dass Sie eine Maschine hatten 192.168.0.58 um eine Antwort zu bekommen. Was sind die Chancen dafür? - KronoS
@KronoS es ist eigentlich nicht so komisch, wenn du in einer Schule oder in einem Firmennetzwerk bist. Einige DHCP-Server geben Adressen in aufsteigender Reihenfolge an und die meisten von ihnen werden verwendet. - Taum
192.168.0.58 ist Zeit für mich .. können alle Ping-Anfragen den Server irgendwie rausgeschmissen haben ?! - iamserious


Antworten:


Jeder kompliziert es mit RFCs, IP-Klassen und so. Führen Sie einfach ein paar Tests durch, um zu sehen, wie ping Befehl parst die IP-Eingabe durch den Benutzer (externe 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, die ping Befehl (in Windows) ermöglicht Ihnen die Verwendung unterschiedlicher IP-Adressformate. Eine IPv4-Adresse kann wie folgt in vier Teile ("dotted-quad") unterteilt werden: A.B.C.D, und das ping Mit dem Befehl können Sie einige auslassen und einen Standardwert von 0 wie folgt:

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 einen einzelnen Teil liefern, dann wird er, wenn er unter 255 ist (das Maximum für ein Oktett), wie ein Oktett wie oben behandelt, aber wenn er größer als 255 ist, wird er konvertiert und in das nächste Feld gerollt (dh mod 256).

Es gibt ein paar Randfälle wie das Bereitstellen von mehr als vier Teilen scheint nicht zu funktionieren (z. B. Ping google.comDie IP-Adresse funktioniert auch nicht 0.74.125.226.4 oder 74.125.226.4.0).

Sie können die hexadezimale Schreibweise sowohl in der Form mit gepunkteten Quadraten als auch in der flachen Form verwenden, sie müssen jedoch durch vorstehende Schreibweisen formatiert werden 0x zu jedem Oktett.


Daher gibt es viele Möglichkeiten, eine (IPv4) IP-Adresse darzustellen. Sie können ein flaches oder gepunktetes Quad- (oder gepunktet-dreifaches, gepunktetes-doppeltes oder sogar punktiertes-einzelnes) Format verwenden, und für jedes einzelne können Sie Dezimal, Oktal und Hexadezimal verwenden (oder sogar mischen und abgleichen). Zum Beispiel können Sie pingen google.com auf folgende Weise:

  • google.com(Domänenname)
  • 74.125.226.4(punktierte Dezimalstelle)
  • 1249763844(flache dezimal)
  • 0112.0175.0342.0004(punktiert oktal)
  • 011237361004(flach oktal)
  • 0x4A.0x7D.0xE2.0x04(gepunkteter hex)
  • 0x4A7DE204(flaches Hex)
  • 74.0175.0xe2.4(ಠ_ಠ)

(Gott sei Dank, dass binäre Notation Unterstützung wurde nicht hinzugefügt!)


Anwendung:

In deinem Fall klingelt es 192.168.072 verwendet das dritte Format in der obigen Tabelle (A.B.0.C), also pingst du tatsächlich 192.168.0.072. Da Sie im letzten Teil eine führende Null haben, wird es als oktal behandelt, was im Dezimalwert 58 ist.

Geheimnis gelüftet.


Beachten Sie, dass während Windows ping Befehl ermöglicht eine so große Vielfalt von Formaten für die Eingabe und interpretiert Nicht-Standard-Formate in der Art und Weise gesehen, das heißt nicht unbedingt, dass Sie solche Formate überall verwenden können. Einige Programme können Sie zwingen, alle vier Teile eines gepunkteten Quads zu liefern, andere können das Mischen und Abgleichen von Dezimal und Oktal usw. nicht erlauben.

Außerdem verkomplizieren IPv6-Adressen die Syntaxanalyse und die Akzeptanz des Eingabeformats.


Nachtrag:

Syss wies darauf hin Wenn Sie ein ungültiges Zeichen in einer der Zahlen verwenden (z. B. a 8 oder 9 bei Verwendung von Oktal, a g im Hex-Modus usw.) ping ist schlau genug, dies zu erkennen und interpretiert es als eine String-URL (-al? -ic?) anstatt als eine nummerische IP-Adresse.

(Als jemand, der zahlreiche Aneurysmen und Herzinfarkte hatte, die versuchten, angeblich "einfachen" Code zu schreiben, um die exponentiell explodierende Anzahl von Permutationen von Datenwerten unterzubringen, schätze ich, dass er alle Eingangsvariationen korrekt zu verarbeiten scheint; Fall, mindestens 31+32+33+34=120 Variationen.)

Also, während der Angabe 010.020.030.040 wird pingen 8.16.24.32 wie erwartet, vorbei 010.020.030.080 zu ping wird statt einer IP-Adresse wie eine URL behandelt foo.bar.baz.com das könnte (aber leider nicht) existieren. Mit anderen Worten, es versucht, die Subdomain zu pingen 010 auf der Subdomain 020 auf der Domain 030 in der Top-Level-Domain 080. Jedoch seit 080 ist keine gültige TLD (wie .com, .netund ihre Freunde), die Verbindung scheitert gleich beim ersten Schritt.

Das Gleiche passiert mit 090.010.010.010 wo das ungültige Zeichen in einem anderen Oktett ist. Gleichfalls, 0xf.0xf.0xf.0xf Pings 15.15.15.15, aber 0xh1.0x1.0xg0.0f schlägt fehl.

Naja, ich schätze, das ist es, was du bekommst, weil du nicht mehrere Nummern-Basen fließend beherrschst.

Es ist wahrscheinlich einfacher und sicherer, nur darauf zu achten, immer 4-punktierte Quad-Adressen ("40q"? "Quaddy-Quad"? "Cutie-Q"?) Zu verwenden.

So geh fort und lerne einige Zahlenbasen. Sie werden in der Lage sein, das Leben von Partys zu zeigen und zu sein, und wie sie sagen, gibt es 10 Arten von Menschen: diejenigen, die binäre und diejenigen, die nicht wissen.

Lass uns nicht mal denken über IPv6-Adressen; Ich denke, sie sind eine der 111 Robben !!!


565
2017-10-12 17:06



Überkompliziert? Experimentieren kann sehr nützlich sein und hat in diesem Fall eine gute Antwort hervorgebracht; Aber ohne eine Theorie oder Dokumentation oder Standards können Sie einen kritischen Faktor übersehen und nicht wissen. Oder Sie könnten feststellen, wie eine bestimmte Version funktioniert und sich bei etwa 90% der Implementierungen irrt. Oder Sie könnten Regeln aufstellen, die die Ergebnisse Ihrer Experimente erklären, aber komplizierter sind als die beabsichtigten Regeln. In diesem Fall denke ich die Regeln der Dokumentation (für inet_aton()) sind in einer Hinsicht einfacher - keine Bedingungen für "unter / über 255". - LarsH
Guck mal! Der "naturwissenschaftliche" Teil der Informatik tritt auf! (hypothetisieren, experimentieren, verifizieren) - Izkata
@LarsH, das ist aber mein Punkt, dass die ping Befehl (zumindest unter Windows) ist wie viele von Microsofts Programmen (vor allem der berüchtigte) IE. Es versucht, zu versöhnlich zu sein und nimmt alles mit, was man darauf wirft und versucht es zu interpretieren. Ja, es gibt ein offizielles Dokument zu IP-Adressformaten, aber das ist keine Frage zu ISOs und RFCs, es ist praktisch, Ich habe etwas gemacht und es ist komisch Frage, die beantwortet werden kann, ohne auf (zugegebenermaßen lange, trockene, langweilige technische Spezifikationen) zurückzugreifen - obwohl die Verbindung zu ihnen, falls das OP sie lesen will, auch gut ist. - Synetech
0-Prefixed Octal Parsing sollte komplett aufgegeben werden, außer für chmod. Das ist es. Das ist die einzige Ausnahme für Octal erlaubt. Zeitraum. - James Dunne
Es ist nützlich für RGB HEX zu DEC Konvertierung. lol ~ C:\>ping 0xffffcc  Pinging 0.255.255.204 with 32 bytes of data: - wilson


Dafür gibt es zwei Gründe:

Zuerst gibt ein '0' Präfix an Oktal Nummer. Seit okt (072) = dez (58), 192.168.072 = 192.168.58.

Zweitens kann die vorletzte 0 von IP-Adressen als a fallen gelassen werden Kurzschrift. 127.0.1 wird als 127.0.0.1 interpretiert und in Ihrem Fall wird 192.168.58 als 192.168.0.58 interpretiert.


147
2017-10-12 10:39



Es gruppiert keine Nullen. Es behandelt jeden Punkt tatsächlich als ein Trennzeichen, das der nächsten Bytegrenze entspricht. Somit sind die IP-Adressen 2130706433 und 127.0.0.1 die gleichen Adressen. - Serge
Hat die x.x.x.x-Notation für 32-Bit-Nummern einen Namen? Es könnte in anderen Bereichen verwendet / hilfreich sein, aber ich kann es nicht googeln :) edit: vergiss es ist die Punkt-Dezimal-Notation - Guillaume86
genauer gesagt ist es die Quad-Punkt-Notation im Falle einer IP-Adresse - Guillaume86
Die berühmte führende Null hat noch einmal geschlagen! - Luc M
Das ist jetzt die richtige Antwort! - l--''''''---------''''''''''''


Neben dem wichtigen Punkt von @ neu242 über die Oktalnotation und der Beobachtung, dass IP-Adressen gekürzt werden können, ist das andere kritische Stück, zu wissen, wie verkürzte IP-Adressen interpretiert werden.

Man könnte naiv vermuten, dass, wenn einige der vier Zahlen fehlen, der Parser am Ende (oder am Anfang) der Bytefolge null gefüllte Bytes hinzufügen würde. Aber das entspricht nicht dem Verhalten, das das OP berichtete: 192.168.072 wurde als 192.168 geparst.0.58, nicht wie 192.168.58.0, Noch 0.192.168.58.

Anscheinend Windows und Linux Ping (die Version, die Sie versuchten und die, die ich ausprobiert habe) verwenden etwas, das äquivalent zu inet_aton () ist, um das IP-Adressenargument zu analysieren. Das man-Seite 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 hast du es ... 192.168.072 passt das a.b.c Muster, also das 072 (nach der Analyse als Oktalzahl) wurde als ein 16-Bit-Wert interpretiert, der die am weitesten rechts stehenden 2 Bytes der Binäradresse definiert, die äquivalent zu 0.58.

Die obigen Regeln sind gleichbedeutend mit der Aussage, dass, wenn irgendeine der vier Zahlen fehlt, die benötigten mit Null gefüllten Bytes hinzugefügt werden unmittelbar vor der letzten angegebenen Nummer... weder am Ende noch am Anfang der Bytefolge. (So ​​auszudrücken funktioniert, wenn die letzte angegebene Zahl kleiner als 256 ist.)

Beachten Sie, dass neuere Versionen von Ping diese Art von Kurzschrift und die oktale Interpretation nicht zulassen. Das 2010 Quellcode für iputils (einschließlich Ping), die ich fand inet_pton () statt inet_aton (), um das IP-Adresse Argument zu analysieren. Das man-Seite für inet_pton ()sagt:

Im Gegensatz zu inet_aton (3) und inet_addr (3) unterstützt inet_pton () IPv6-Adressen. Auf   Andererseits akzeptiert inet_pton () nur IPv4-Adressen in dezimaler Notation,   während inet_aton (3) und inet_addr (3) das allgemeinere erlauben   Zahlen-und-Punkt-Notation (hexadezimale und oktale Zahlenformate und   Formate, bei denen nicht alle vier Bytes explizit geschrieben werden müssen.


97
2017-10-12 15:33



Dies ist bei weitem die beste Antwort meiner Meinung nach. - Josh
Unter Windows, die du suchst inet_addr in Winsock. - user7116


Sie müssen auch bedenken, 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 das coole Ding:

192.168.58 wird 192.168.0.58 weil

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

192.110.10106 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

25
2017-10-12 13:57



"192.168.56 ist 192.168.0.56, weil 0 * 256 ^ 1 + 58 * 256 ^ 0 = 58" Bist du sicher? Sie würden erwarten, dass 168 im ersten Fall mit 256 ^ 1 und im zweiten Fall mit 256 ^ 2 multipliziert wird. Ähnlich würde 192 mit 256 ^ 2 gegenüber 256 ^ 3 multipliziert werden. So 192.168.56 konnte nur = 192.168.0.56, wenn zusätzliche Regeln vorhanden sind, z. B. das Ablegen von Nullen. - LarsH
@LarsH, ich denke, was hier gesagt wird, ist, dass es von links nach rechts basiert, im Gegensatz zu "normalem" Zählen, wo wir alles von der 1 ausgehen. Der erste Punkt bewirkt, dass das, was links davon ist, mit 256 ^ 3 multipliziert wird, das zweite mit 256 ^ 2, das dritte mit 256. Wenn es keinen Punkt links von ihm gibt, wird es addiert, ohne dass es mit 256 multipliziert wird ^ n. Also 1.2.3. (1.2.3.0) wäre anders als 1.2.3 (1.2.0.3), wenn ich das richtig verstehe. - iX3
@ iX3: Wenn das der Fall wäre, dann wäre "192.168.56 wird 192.168.0.56" falsch, weil 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ürde als 192.168.58.0 statt 192.168.0.58 interpretiert werden. - LarsH
Was ein bisschen irreführend ist, ist die Tatsache, dass die Adresse 0 die dritte Ziffer hat. Betrachte diese Adresse 192.168.1.56 Die 3-stellige Form wäre 192.168.312 Weil 1 * 256 ^ 1 + 56 * 256 ^ 0 312 ist - vesquam
Die Punkte dienen nur dazu, abzugrenzen, 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 für den 2. und 3. Punkt, aber um 256 ^ 2 und 256 ^ 1. Dann addiert es alle Ergebnisse zusammen (einige impl. Können stattdessen eine laufende Summe behalten, obwohl das Ergebnis dasselbe ist). Wenn einer dieser Punkte fehlt, führt er einfach nicht die Multiplikation durch und addiert lediglich die endgültige Zahl zu der laufenden Summe. Deshalb auch 1.2.3. führt zu einem Fehler, da der Parser die letzte zu addierende Zahl nicht finden kann. - Justin ᚅᚔᚈᚄᚒᚔ