web-dev-qa-db-de.com

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

Ich habe fälschlicherweise den Punkt einer IP-Adresse verpasst und 192.168.072 eingegeben.
Zu meiner Überraschung habe ich unter 192.168.0.58 eine Verbindung zu einem Computer hergestellt.

Wenn ich 192.168.072 anpinge, erhalte ich Antworten von 192.168.0.58.

Warum ist das?


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


Wenn ich 192.168.72 anpinge, erhalte ich eine Antwort von 192.168.0.72, daher scheint es, dass der 0 in 072 (in meinem ursprünglichen Fehler) signifikant ist.


Diese Frage war eineSuper User Frage der Woche.
Lesen Sie denBlogeintragfür weitere Details odertragen Sie zum Blog beiSie

374
George Duckett

Dafür gibt es zwei Gründe:

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

Zweitens kann die vorletzte 0 von IP-Adressen als Kurzform 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.

147
neu242

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. 0 . 58 analysiert, 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.

Da haben Sie es also ... 192.168.072 passt zum Muster a.b.c, also wurde der 072 (nach dem Parsen als Oktalzahl) als 16-Bit-Wert interpretiert, der die äußersten rechten 2 Bytes der Binäradresse definiert, was 0.58 entspricht.

Die obigen Regeln sind gleichbedeutend damit, dass, wenn eine der vier Zahlen fehlt, die benötigten nullgefüllten Bytes unmittelbar vor der zuletzt angegebenen Zahl... nicht am Ende oder am Anfang der hinzugefügt werden Zeichenfolge von Bytes. (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 gefundene 2010-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 allgemeineren Zahlen- und Punktschreibweisen (hexadezimales und oktales Zahlenformat sowie Formate, die nicht verwendet werden) zulassen. t alle vier Bytes müssen explizit geschrieben werden).

100
LarsH

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
24
vesquam