Warum gibt es einen Unterschied zwischen Ping „localhost“ und Ping „local IP address“?

32

Die Verwendung von cmdund pingunter Windows hat zu folgenden Ergebnissen geführt:

  • Ping "localhost":

Geben Sie hier eine Bildbeschreibung ein

  • Ping "192.168.0.10" (lokale IP-Adresse):

Geben Sie hier eine Bildbeschreibung ein

Sind nicht beide Situationen genau gleich?

Ich meine, ich pinge die gleiche Schnittstelle, die gleiche Maschine und die gleiche Adresse. Warum erhalte ich so unterschiedliche Ergebnisse?

EDIT: Hier ist mein ipconfig /allBildschirm:

Geben Sie hier eine Bildbeschreibung ein

Diogo
quelle
18
Sie pingen nicht die gleiche Schnittstelle , auch wenn Sie keine physischen Schnittstellen haben, haben Sie immer noch einen "lokalen Host".
Tamara Wijsman
Wenn Sie mit "derselben Schnittstelle" die Loopback-Schnittstelle meinen, sind Sie richtig. Wenn Sie die Ethernet-Schnittstelle meinen, liegen Sie aus mehreren Gründen falsch. (Wie ist beispielsweise :: 1 mit der Ethernet-Schnittstelle verknüpft? Warum sollte die Ethernet-Schnittstelle - deren Aufgabe es ist, Ethernet-Pakete auf der Leitung zu senden und von der Leitung zu empfangen - an einer Operation beteiligt sein, an der niemals eine beteiligt ist?) Ethernet-Paket oder ein Draht?)
David Schwartz
Ich bin mir ziemlich sicher, dass diese Frage schon einmal bei Stackoverflow gestellt wurde, wenn ich sie finden kann ...
Chris S
Das Herzstück davon wird von diesem SO beantwortet, glaube ich: stackoverflow.com/questions/6938039/…
Dawson Toth
Ich denke, das Interessante ist: Warum werden beim Pingen eines Remote-Hosts eine bestimmte Anzahl von Bytes und eine TTL übertragen, während beim Pingen von localhost keine? Niemand kümmert sich wahrscheinlich darum, dass das IP-Adressformat ein bisschen abweicht.
Dhasenan

Antworten:

46

Sie pingen nicht dieselbe Schnittstelle , ohne physische Schnittstellen haben Sie immer noch einen "lokalen Host".

Ihr localhostwird verwendet, um von seiner "internen" IP-Adresse auf Ihren Computer zu verweisen, nicht von einer "externen" IP-Adresse Ihres Computers. Die Ping-Pakete durchlaufen also keine physische Netzwerkschnittstelle. Nur über eine virtuelle Loopback-Schnittstelle, die die Pakete direkt von Port zu Port sendet, ohne dass physische Hops erforderlich sind.

Vielleicht fragen Sie sich immer noch, warum localhostdie Auflösung in erfolgt ::1, während wir normalerweise erwarten, dass die Auflösung in die IPv4-Adresse erfolgt 127.0.0.1. Beachten Sie, dass dies .localhosttraditionell eine TLD ist (siehe RFC 2606 ), die auf die Loopback-IP-Adresse verweist (für IPv4 siehe RFC 3330 , insbesondere 127.0.0.0/8).

Nachschlagen localhostmit nslookupgibt uns:

nslookup localhost

...
Name:    localhost
Addresses:  ::1
          127.0.0.1

Daher bevorzugt Windows die Verwendung der IPv6-Loopback-IP-Adresse ::1(siehe RFC 2373 ), da diese zuerst aufgeführt wird.

Okay, also, wo kommt es her, schauen wir uns die hosts-Datei an.

type %WINDIR%\System32\Drivers\Etc\Hosts

...
# localhost name resolution is handled within DNS itself.
#       127.0.0.1       localhost
#       ::1             localhost
...

Hmm, wir müssen uns die DNS-Einstellungen von Windows ansehen.

In diesem KB-Artikel wird eine Einstellung beschrieben, die sich auf die Windows-Einstellungen auswirkt. Diese wird fett hervorgehoben:

  1. Suchen Sie im Registrierungseditor den folgenden Registrierungsunterschlüssel, und klicken Sie darauf:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
    
  2. Doppelklicken Sie auf DisabledComponents, um den Eintrag DisabledComponents zu ändern.

    Hinweis: Wenn der Eintrag DisabledComponents nicht verfügbar ist, müssen Sie ihn erstellen. Gehen Sie hierzu folgendermaßen vor

    1. Zeigen Sie im Menü Bearbeiten auf Neu, und klicken Sie dann auf DWORD-Wert (32-Bit).

    2. Typ DisabledComponents, Und die EINGABETASTE dann drückt.

    3. Doppelklicken Sie auf DisabledComponents.

  3. Geben Sie einen der folgenden Werte in das Feld Wert ein, um das IPv6-Protokoll auf den gewünschten Status zu konfigurieren, und klicken Sie dann auf OK:

    • Geben Sie ein 0, um alle IPv6-Komponenten zu aktivieren. (Windows Standardeinstellung)
    • Geben Sie ein 0xffffffff, um alle IPv6-Komponenten mit Ausnahme der IPv6-Loopback-Schnittstelle zu deaktivieren. Mit diesem Wert wird auch Windows so konfiguriert, dass es IPv6 (Internet Protocol Version 4) vorzieht, indem Einträge in der Präfix-Richtlinientabelle geändert werden. Weitere Informationen finden Sie unter Auswahl der Quell- und Zieladresse.
    • Geben Sie 0x20IPv4 über IPv6 bevorzugen durch Einträge in der Vorsilbe Richtlinientabelle ändern.
    • Geben Sie 0x10zu deaktivieren IPv6 auf allen nontunnel Schnittstellen (sowohl LAN und Point-to-Point Protocol [PPP] Schnittstellen).
    • Geben Sie 0x01IPv6 auf allen Tunnel - Schnittstellen zu deaktivieren. Dazu gehören das standortinterne automatische Tunneladressierungsprotokoll (ISATAP), 6to4 und Teredo.
    • Geben Sie ein 0x11, um alle IPv6-Schnittstellen mit Ausnahme der IPv6-Loopback-Schnittstelle zu deaktivieren.
  4. Starten Sie den Computer neu, damit diese Einstellung wirksam wird.

Was ist diese Präfix-Richtlinientabelle?

netsh interface ipv6 show prefixpolicies(oder prefixpolicyin früheren Versionen)

Precedence  Label  Prefix
----------  -----  --------------------------------
        50      0  ::1/128
        45     13  fc00::/7
        40      1  ::/0
        10      4  ::ffff:0:0/96
         7     14  2002::/16
         5      5  2001::/32
         1     11  fec0::/10
         1     12  3ffe::/16
         1     10  ::/96

In dieser Tabelle wird festgelegt, welche Präfixe bei DNS-Auflösungen Vorrang vor anderen Präfixen haben.

Ah, mit dieser KB könnten wir hier Einträge hinzufügen, die angeben, dass IPv4 eine höhere Priorität hat als IPv6.

Hinweis: Es gibt keinen Grund, dieses Verhalten außer Kraft zu setzen, es sei denn, es treten kompatible Probleme auf. Wenn Sie diese Einstellung auf unserem Windows Server ändern, ist unser Mail-Server kaputt gegangen. Gehen Sie also vorsichtig vor ...

Tamara Wijsman
quelle
Tatsächlich ist 'localhost' keine Top-Level-Domain, sondern ein Hostname. Die Unterscheidung ist äußerst subtil, aber im Grunde ist jeder Domainname ein Hostname, aber nicht alle Hostnamen sind Domainnamen. Gemäß der Konvention müssen Hostnamen, die mit einem vollständigen Stopp enden, FQDN sein, und die meisten Hostnamen, die nicht mit einem vollständigen Stopp enden, können durch Anhängen der übergeordneten Domäne in FQDN konvertiert werden. Dies sind jedoch nur Konventionen. 'localhost' wird von RFC 2606 reserviert, um zu verhindern, dass es zu einer TLD wird, da es wahrscheinlich nicht richtig funktioniert und sogar Probleme verursachen kann.
Kevin Cathcart
2
Falsch, wie in RFC 2606 erwähnt: The ".localhost" TLD has traditionally been statically defined in host DNS implementations as having an A record pointing to the loop back IP address and is reserved for such use. Beachten Sie die traditionell definierte Verwendung von TLDund note . In der Tat, Arbeiten, die bestätigen, dass dies zumindest im Zusammenhang mit dieser Frage wahr ist. Ihr letzter Satz ist nicht das, was die RFC sagte, bitte angeben , wenn es heißt „es verhindert , dass eine TLD“ , weil von dem, was sie sagt , es ist traditionell eine TLD. Andernfalls würden sie sich nicht darauf beziehenping localhost.the .localhost TLD
Tamara Wijsman
Ich war etwas zu stark. localhostDies kann eine TLD sein, wenn ein tatsächlicher DNS-Server darauf antwortet. Im Allgemeinen wird localhost jedoch als Hostname in / etc / hosts definiert, in dem Hostnamen nachgeschlagen werden, bevor versucht wird, sie über DNS aufzulösen. Aus diesem Grund wird dig localhostnormalerweise kein "A" -Datensatz für 127.0.0.1 oder ein AAAA-Datensatz für :: 1 zurückgegeben. Das bedeutet, dass der RFC falsch ist, wenn er sagt traditionally been statically defined in host DNS implementations, sondern vom Namenssuchdienst des Systems zurückgegeben wird, der nicht immer den DNS verwendet.
Kevin Cathcart
@ KevinCathcart: Wir haben hier eine Windows-Frage, und die Windows-Versionen erwähnen, dass dies durch DNS selbst erfolgt. nslookupgibt Datensätze zurück. Also, YMMV ...
Tamara Wijsman
1
@ KevinCathcart meine digRückkehr A, AAAA und NS-Datensätze für localhost, einschließlich eines localhost. IN NS localhost.
Normdatensatzes
20

Die Loopback-Schnittstelle ist unabhängig von Ihren Ethernet-Schnittstellen vorhanden.

Auch ohne die Komplikation von IPv6 hätten Sie zwei unterschiedliche Adressen.

Loopback IPv4 - Adresse: 127.0.0.1
Ihre Ethernet - Schnittstelle der IPv4 - Adresse: 192.168.0.10

Die Loopback-Schnittstelle befindet sich möglicherweise in einer anderen Softwareschicht, die von der realen Hardware weiter entfernt ist. Ich bezweifle, dass dies in irgendeiner Weise von Ihrem spezifischen Ethernet-Schnittstellentreiber abhängt.

RedGrittyBrick
quelle
11

Localhost und Ihre IP-Adresse sind nicht dasselbe.

Der Localhost ist eine spezielle Software-IP-Adresse, die mit Ihrem System verknüpft ist. Localhost oder 127.0.0.1 ist eine Loopback-Adresse. Es verweist immer auf Ihr System und ist nur von Ihrem Computer aus zugänglich. Dieses Routing findet auf Betriebssystemebene statt und verlässt definitiv nie die Netzwerkkarte. Es besteht also keine Chance, dass die Netzwerkkarte das Netzwerk erreicht.

Das Pingen Ihrer eigenen IP-Adresse ist ähnlich, betrifft jedoch möglicherweise den gesamten Netzwerkstapel, da festgestellt werden muss, dass es sich um Ihre IP-Adresse handelt, und diese korrekt weitergeleitet werden muss .

Der Effekt sollte derselbe sein, es kann jedoch Unterschiede geben.

Ziehen Sie zum Beispiel das Netzwerkkabel ab. Pingen Sie Ihre statische IP-Adresse. Möglicherweise erhalten Sie keine Route zum Host oder andere Fehler. Pingen Sie jetzt localhost oder 127.0.0.1 und es wird funktionieren.

Benjamin Schollnick
quelle
Ping localhost ist also völlig nutzlos? Ich meine, wenn ich meine Schnittstelle testen möchte ...
Diogo
4
@DiogoRocha richtig, ping localhost berührt die Hardware nie. Der Heck-Ping 192.168.0.10 liefert möglicherweise auch keine zuverlässigen Informationen, wenn der Treiber der Netzwerkkarte die an sich selbst gesendeten Anforderungen abfängt.
Scott Chamberlain
@DiogoRocha Ihre Terminologie ist deaktiviert. 127.0.0.1 ist eine Schnittstelle, aber eine virtuelle.
Barlop
@ Diogo, nicht ganz. Mit Localhost können Sie das Netzwerkverhalten einer Anwendung testen oder sicherstellen, dass der Netzwerkstapel funktioniert. Der Treiber wird jedoch nicht getestet. Wenn Sie beispielsweise einen schlechten NIC-Treiber haben, kann localhost möglicherweise den Beweis erbringen, dass es sich um den NIC-Treiber handelt. Ihr Kilometerstand wird jedoch auf jeden Fall variieren !!
Benjamin Schollnick
6

Mir ist auf den Screenshots klar, dass es sich bei dieser Frage nicht um Linux handelt, aber es ist vielleicht ein nützliches "Beispiel".

Wenn Sie unter diesem Betriebssystem eine Ihrer lokalen Adapteradressen anpingen, wird sie in das Loopback-Gerät übersetzt (Sonderfall-Hack). Dies bedeutet, dass die Pakete tatsächlich an das Loopback-Gerät gesendet werden (was alle möglichen Auswirkungen hat: Aus Sicht der Firewall kommen diese Pakete beispielsweise auf der Loopback-Schnittstelle an und stimmen mit den Regeln für diese Schnittstelle überein).

Das Gerät, dem die IP zugewiesen ist, sieht die Pakete nie. (Das ist gut, weil es mit diesen Paketen nicht das Richtige tun würde: Es würde die Sauger rausschicken wollen.)

Wenn jedoch die Schnittstelle, die diese IP enthält, ausfällt, haben Sie diese Verbindung verloren. Die Zuordnung zu Loopback funktioniert nicht mehr.

Mit anderen Worten, es ist ein praktikables Konzept, diese lokalen Adressen als Aliase für das Loopback-Gerät zu betrachten.

Code Referenzen:

http://lxr.linux.no/#linux+v3.3.2/net/ipv4/route.c#L2623

Schauen Sie sich die Funktion an ip_route_output_slow. Dieser Aufruf fib_lookupund wenn diese Funktion den Code zurückgibt RTN_LOCAL, dev_outwird er in einen Loopback umgeschrieben:

http://lxr.linux.no/#linux+v3.3.2/net/ipv4/route.c#L2769

Kaz
quelle
4

Es sieht so aus, als würde der Alias ​​"Localhost" in den IPv6-Loopback aufgelöst. Wenn Sie explizit eine IPv4-Adresse verwenden, wird dies offensichtlich nicht der Fall sein.

EBGreen
quelle
6
Das Betriebssystem scheint nicht mit Ihnen übereinzustimmen.
EBGreen
6
Es spielt keine Rolle, es ist anscheinend für den Computer eingerichtet, localhost erreicht den ipv6-Loopback.
Rob
1
@DiogoRocha In der IPV4-Welt gibt es keine solche Adresse :: 1. 127.0.0.1 ist die IP, die für das dortige Loopback reserviert ist. :: 1 existiert jedoch für IPV6 und ist wie 127.0.0.1 für IPV6-Loopback reserviert.
Andy
4
Wie beantwortet dies die Frage? Du sagst nur das Offensichtliche.
Tamara Wijsman
4
Bitte erläutern Sie Ihre Antwort, dies erklärt eigentlich nichts
Ivo Flipse
1

@ebwhite stimmt worüber.

Nun könnte der Grund sein , dass Sie Teredo einrichten (ich kann nicht von Ihrem Screenshot sagt, es in eine Textdatei kochend und die gesamte Ausgabe einfügen wird besser) - das Verhalten von localhost seine IPv6 steht im Einklang mit den Systemen auf meinem IPv4- Netzwerk nur mit Teredo installiert, aber Systeme ohne IPv4 verhalten sich so, wie Sie es 127.0.0.1beim Pingen erwarten localhost. Ich habe dies mit Windows XP getestet und muss sehen, was meine Windows 7-Systeme tun und die Frage aktualisieren.

Im Allgemeinen werden IPv6-Systeme standardmäßig verwendet, wenn IPv6 verfügbar ist. Daher funktioniert Ihr System so, wie es .

Geselle Geek
quelle
Er bekommt keine Bytes übertragen oder TTL, mit einem der Screenshots, ist das IPv6? Warum?
Barlop
auch konsistent mit dem, was ich auf Windows 7 sehe - meine Vermutung ist, dass die Umlaufzeit vernachlässigbar ist
Geselle Geek