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.072
bekomme 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.72
erhalte ich eine Antwort von 192.168.0.72
, so scheint es , die 0
in 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
ip
ping
ip-address
George Duckett
quelle
quelle
ping 192.168.072
printsPING 192.168.072 (192.168.0.58) 56(84) bytes of data.
[...].192.168.0.58
, um eine Antwort zu bekommen. Wie stehen die Chancen dafür?192.168.0.58
Zeitüberschreitung für mich .. können alle Ping-Anfragen den Server irgendwie ausgeknockt haben ?!Antworten:
Jeder verkompliziert es mit RFCs, IP-Klassen und dergleichen. Führen Sie einfach ein paar Tests durch, um
ping
festzustellen, wie der Befehl die vom Benutzer eingegebene IP-Adresse analysiert (überflüssige Spreu entfernt):Wie Sie sehen, können Sie mit dem
ping
Befehl (in Windows) verschiedene IP-Adressformate verwenden. Eine IPv4-Adresse kann wie folgt in vier Teile („gepunktetes Quad“) unterteilt werden: MitA.B.C.D
demping
Befehl können Sie einige weglassen0
und die folgenden Standardwerte eingeben: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.com
IP von Ping entweder nicht0.74.125.226.4
oder nicht74.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
0x
jedem 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.com
auf 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.072
verwendet Ping das dritte Format in der obigen Tabelle (A.B.0.C
), sodass Sie tatsächlich pingen192.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-
ping
Befehl 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
8
oder9
wenn Sie ein Oktal, eing
im Hex-Modus usw. verwenden),ping
es 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.040
will ping8.16.24.32
wie erwartet erfolgt, wird die Übergabe010.020.030.080
anping
wie eine URL statt wie eine IP-Adresse behandelt - wiefoo.bar.baz.com
sie existieren könnte (aber leider nicht existiert). Mit anderen Worten, es wird versucht, die Unterdomäne010
an die Unterdomäne020
in der Domäne030
auf der obersten Ebene zu senden080
. Da080
es sich jedoch nicht um eine gültige TLD (wie.com
,.net
und ihre Freunde) handelt, schlägt die Verbindung gleich im ersten Schritt fehl.Dasselbe passiert,
090.010.010.010
wenn sich das ungültige Zeichen in einem anderen Oktett befindet. Ebenso0xf.0xf.0xf.0xf
pingt15.15.15.15
,0xh1.0x1.0xg0.0f
scheitert 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 !!!
quelle
inet_aton()
) in einer Hinsicht einfacher sind - keine Bedingungen für "unter / über 255".ping
Befehl (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.chmod
. Das ist es. Das ist die einzige Ausnahme für das Oktal. Zeitraum.C:\>ping 0xffffcc
Pinging 0.255.255.204 with 32 bytes of data:
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.
quelle
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:
Also da haben Sie es ...
192.168.072
passt zum abc-Muster, also wurde das072
(nach dem Parsen als Oktalzahl) als 16-Bit-Wert interpretiert, der die äußersten rechten 2 Bytes der Binäradresse definiert, was äquivalent ist zu0.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:
quelle
inet_addr
in Winsock.Sie müssen auch berücksichtigen, dass eine IP durch Ganzzahlen dargestellt werden kann, die in ihrer Bedeutung zu ihrer Position addiert werden.
Hier ist die coole Sache:
192.168.58 wird 192.168.0.58 sein, weil
192.11010106 wird auch 192.168.0.58 sein, weil
3232235578 wird auch 192.168.0.58 sein, weil
quelle
1.2.3.
ein Fehler auftritt, da der Parser nicht die letzte Zahl finden kann, die zur Gesamtsumme hinzugefügt werden soll.