Perché esiste una differenza tra ping "localhost" e ping "indirizzo IP locale"?


32

L'uso cmde pingsu Windows mi ha dato i seguenti risultati:

  • Ping "localhost":

Inserisci qui la descrizione dell'immagine

  • Ping "192.168.0.10" (indirizzo IP locale):

Inserisci qui la descrizione dell'immagine

Entrambe le situazioni non sono esattamente uguali?

Voglio dire, sto eseguendo il ping della stessa interfaccia, della stessa macchina e dello stesso indirizzo. Perché ottengo risultati così diversi?

EDIT: Ecco il mio ipconfig /allschermo:

Inserisci qui la descrizione dell'immagine


18
Non stai eseguendo il ping della stessa interfaccia , anche senza interfacce fisiche hai ancora un "host locale".
Tamara Wijsman,

Se per "stessa interfaccia" intendi l'interfaccia di loopback, hai ragione. Se intendi l'interfaccia Ethernet, ti sbagli per diversi motivi. (Ad esempio, in che modo :: 1 è associato all'interfaccia Ethernet? E perché l'interfaccia Ethernet - il cui compito è inviare pacchetti Ethernet sul filo e riceverli dal filo - sarebbe coinvolta in un'operazione che non coinvolge mai un Pacchetto Ethernet o un filo?)
David Schwartz,

Sono abbastanza sicuro che questa domanda sia stata posta prima su Stackoverflow, se riesco a trovarla ...
Chris S,

Il cuore di questo viene risposto da questo SO, credo: stackoverflow.com/questions/6938039/…
Dawson Toth,

Penso che la cosa interessante sia: perché ricevi un numero di byte trasferiti e un TTL quando esegui il ping di un host remoto, ma nemmeno quando esegui il ping di localhost? A nessuno importa che il formato dell'indirizzo IP sia un po 'fuori.
Dhasenan,

Risposte:


46

Non stai eseguendo il ping della stessa interfaccia , senza interfacce fisiche hai ancora un "host locale".

Il tuo localhostè usato per fare riferimento al tuo computer dal suo IP "interno", non da alcun IP "esterno" del tuo computer. Quindi, i pacchetti ping non passano attraverso alcuna interfaccia di rete fisica; solo attraverso un'interfaccia di loopback virtuale che invia direttamente i pacchetti da una porta all'altra senza alcun hop fisico.

Potresti ancora chiederti perché si localhoststa risolvendo ::1, mentre tradizionalmente ci aspetteremmo che si risolva all'indirizzo IPv4 127.0.0.1. Si noti che .localhostè tradizionalmente un TLD (vedere RFC 2606 ) che rimanda all'indirizzo IP di loopback (per IPv4, vedere RFC 3330 , in particolare 127.0.0.0/8).

Cercare localhostusando nslookupci dà:

nslookup localhost

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

Pertanto Windows preferisce utilizzare l'indirizzo IP di loopback IPv6 ::1(vedere RFC 2373 ) come elencato per primo.

Ok, quindi, da dove viene, diamo un'occhiata al file hosts.

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

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

Hmm, dobbiamo guardare le impostazioni DNS di Windows.

Questo articolo KB ci parla di un'impostazione che influenza ciò che Windows preferisce, sottolineato in grassetto:

  1. Nell'editor del Registro di sistema, individuare e fare clic sulla seguente sottochiave del Registro di sistema:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
    
  2. Fare doppio clic su DisabledComponents per modificare la voce DisabledComponents.

    Nota: se la voce DisabledComponents non è disponibile, è necessario crearla. Per fare ciò, attenersi alla seguente procedura:

    1. Nel menu Modifica, scegliere Nuovo, quindi fare clic su Valore DWORD (32 bit).

    2. Digitare DisabledComponents e quindi premere INVIO.

    3. Fare doppio clic su DisabledComponents.

  3. Digitare uno dei seguenti valori nel campo Dati valore: per configurare il protocollo IPv6 sullo stato desiderato, quindi fare clic su OK:

    • Digitare 0per abilitare tutti i componenti IPv6. (Impostazione predefinita di Windows)
    • Digitare 0xffffffffper disabilitare tutti i componenti IPv6, tranne l'interfaccia di loopback IPv6. Questo valore configura anche Windows per preferire l'utilizzo di Internet Protocol versione 4 (IPv4) su IPv6 modificando le voci nella tabella dei criteri del prefisso. Per ulteriori informazioni, consultare Selezione dell'indirizzo di origine e destinazione.
    • Digitare 0x20per preferire IPv4 su IPv6 modificando le voci nella tabella dei criteri del prefisso.
    • Digitare 0x10per disabilitare IPv6 su tutte le interfacce non tunnel (su entrambe le interfacce LAN e Point-to-Point Protocol [PPP]).
    • Digitare 0x01per disabilitare IPv6 su tutte le interfacce del tunnel. Questi includono ISATAP (Intra-Site Automatic Tunnel Addressing Protocol), 6to4 e Teredo.
    • Digitare 0x11per disabilitare tutte le interfacce IPv6 ad eccezione dell'interfaccia di loopback IPv6.
  4. Riavvia il computer affinché questa impostazione abbia effetto.

Cos'è questa tabella delle politiche dei prefissi?

netsh interface ipv6 show prefixpolicies(o prefixpolicysu versioni precedenti)

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

Questa tabella decide quali prefissi hanno la precedenza su altri prefissi durante le risoluzioni DNS.

Ah, quindi usando quel KB potremmo aggiungere qui voci che denotano che IPv4 ha una precedenza maggiore di IPv6.

Nota: non vi è alcun motivo per ignorare questo comportamento, a meno che non si verifichino problemi compatibili. La modifica di questa impostazione sul nostro Windows Server ha interrotto il nostro server di posta, quindi dovrebbe essere gestito con cura ...


In realtà 'localhost' non è un dominio di primo livello, ma un nome host. La distinzione è estremamente sottile, ma sostanzialmente ogni nome di dominio è un nome host, ma non tutti i nomi host sono nomi di dominio. Per convenzione, i nomi host che terminano con un punto di arresto completo devono essere FQDN e la maggior parte dei nomi host che non terminano con un punto di arresto completo possono essere convertiti in nome di dominio completo aggiungendo il dominio padre, ricadendo sull'aggiunta del root, se necessario. Tuttavia, quelle sono solo convenzioni. 'localhost' è riservato da RFC 2606, per evitare che diventi un TLD, poiché è probabile che non funzioni correttamente e possa persino causare problemi.
Kevin Cathcart,

2
Errato, come menziona RFC 2606: 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. notare l'uso TLDe la nota che è definita tradizionalmente . In effetti, ping localhost.lavori che confermano che questo è almeno vero nel contesto di questa domanda. La tua ultima frase non è quella che diceva la RFC, per favore cita se "impedisce che diventi un TLD" perché da quello che dice è tradizionalmente un TLD. Altrimenti a cui non si riferirebberothe .localhost TLD
Tamara Wijsman,

Ero un po 'troppo forte. localhostpuò essere un TLD se un server DNS effettivo risponde per questo, ma generalmente localhost è generalmente definito come un nome host in / etc / hosts, in cui i nomi host vengono cercati prima di tentare di risolvere tramite DNS. Di conseguenza, di dig localhostsolito non restituisce un record "A" per 127.0.0.1 o un record AAAA per :: 1. Ciò significa che RFC si sbaglia quando dice traditionally been statically defined in host DNS implementations, ma piuttosto viene restituito dal servizio di ricerca del nome del sistema, che non utilizza sempre il DNS.
Kevin Cathcart,

@KevinCathcart: Siamo in una domanda di Windows qui, e le versioni di Windows menzionano che ciò è fatto dal DNS stesso. nslookuprestituisce i record. Quindi, YMMV ...
Tamara Wijsman,

1
@KevinCathcart i miei digresi A, AAAA e record NS per localhost, incluso un record di autorità per:localhost. IN NS localhost.
KutuluMike

20

L' interfaccia di loopback esiste indipendentemente dalle tue interfacce Ethernet.

Anche senza la complicazione di IPv6 avresti due indirizzi distinti.

Indirizzo IPv4 di loopback : 127.0.0.1
Indirizzo IPv4 dell'interfaccia Ethernet: 192.168.0.10

L'interfaccia di loopback potrebbe trovarsi in un livello software diverso, più remoto dall'hardware reale. Dubito che dipenda in qualche modo dal tuo specifico driver di interfaccia Ethernet, ad esempio.


11

Localhost e il tuo indirizzo IP non sono la stessa cosa.

Localhost è un indirizzo IP solo software speciale, collegato al sistema. Localhost, o 127.0.0.1, è un indirizzo di loopback. Indica sempre il tuo sistema ed è accessibile solo dal tuo computer. Questo routing avviene a livello di sistema operativo e sicuramente non lascia mai la scheda NIC ... Quindi non c'è possibilità che raggiunga la rete ...

Il ping del tuo indirizzo IP è simile ma potenzialmente coinvolge l'intero stack di rete, poiché deve rilevare che è il tuo indirizzo IP e instradarlo correttamente ...

L'effetto dovrebbe essere lo stesso, ma ci possono essere differenze.

Ad esempio, scollegare il cavo di rete. Effettua il ping del tuo indirizzo IP statico. È possibile che non venga visualizzato alcun percorso verso l'host o altri errori. Ora esegui il ping di localhost o 127.0.0.1 e funzionerà.


Quindi, ping localhost è completamente inutile? Voglio dire, se voglio testare la mia interfaccia ....
Diogo,

4
@DiogoRocha corretto, ping localhost non tocca mai l'hardware. Heck ping 192.168.0.10 potrebbe non fornire informazioni affidabili anche se il driver della scheda di rete intercetta le richieste fornite a se stesso.
Scott Chamberlain,

@DiogoRocha La tua terminologia è disattivata. 127.0.0.1 è un'interfaccia, ma virtuale.
barlop

@Diogo, non proprio. Localhost consente di testare il comportamento di rete di un'applicazione o di verificare che lo stack di rete funzioni .... Ma non verifica il driver. Ad esempio, se si dispone di un driver NIC scadente, localhost potrebbe essere in grado di dimostrare che è il driver più adatto. Il tuo chilometraggio varierà sicuramente però !!
Benjamin Schollnick,

6

Capisco dagli screenshot che questa domanda non riguarda Linux, ma forse costituisce un utile "caso in questione".

Su quel sistema operativo, se esegui il ping di uno degli indirizzi dell'adattatore locale, viene tradotto nel dispositivo di loopback (caso speciale hack). Ciò significa che i pacchetti in realtà vanno al dispositivo di loopback (che ha tutte le implicazioni che potresti pensare: ad esempio dal punto di vista del firewall, quei pacchetti stanno arrivando sull'interfaccia di loopback e corrisponderanno alle regole per quell'interfaccia).

Il dispositivo a cui è assegnato l'IP non vedrà mai i pacchetti. (Questo va bene perché non farebbe la cosa giusta con quei pacchetti: vorrebbe mandare fuori i polloni.)

Tuttavia, se l'interfaccia che detiene tale IP dovesse capitare di non funzionare, hai perso quella connessione. La mappatura su loopback smetterà di funzionare.

Quindi, in altre parole, è un progetto praticabile considerare quegli indirizzi locali come alias per il dispositivo di loopback.

Riferimenti di codice:

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

Dai un'occhiata alla funzione ip_route_output_slow. Questo chiama fib_lookupe se questa funzione restituisce il codice RTN_LOCAL, dev_outviene riscritto in loopback:

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


4

Sembra che l'alias "Localhost" si stia risolvendo nel loopback IPv6 e quando si utilizza esplicitamente un indirizzo IPv4 ovviamente non lo è.


6
Il sistema operativo sembra non essere d'accordo con te.
EBGreen

6
Non importa, apparentemente è impostato per il computer, localhost sta colpendo il loopback ipv6.
Rob,

1
@DiogoRocha Non esiste tale indirizzo :: 1 nel mondo IPV4. 127.0.0.1 è l'IP riservato per il loopback lì. :: 1 tuttavia esiste per IPV6 e, come 127.0.0.1, è riservato per il loopback IPV6.
Andy,

4
Come risponde alla domanda? Stai solo affermando l'ovvio.
Tamara Wijsman,

4
Per favore, elabora la tua risposta, questo non spiega davvero nulla
Ivo Flipse,

1

@ebwhite ha ragione su cosa.

Ora, il motivo potrebbe essere che hai impostato Teredo (non posso dirlo dal tuo screenshot, collegarlo a un file di testo e incollare l'intero output è migliore) - il comportamento di localhost su IPv6 è coerente con i sistemi sul mio Rete IPv4 solo con teredo installato, ma i sistemi senza di essa si comportano come previsto 127.0.0.1quando si esegue il ping localhost. Ho provato questo con Windows XP e devo vedere cosa fanno i miei sistemi Windows 7 e aggiornare la domanda.

In genere, i sistemi predefiniti su IPv6 se IPv6 è disponibile, quindi il sistema funziona come dovrebbe essere .


non ottiene byte trasferiti o TTL, con uno degli screenshot, è IPv6? perché?
barlop

coerente anche con quello che vedo su Windows 7 - la mia ipotesi è che il tempo di andata e ritorno è trascurabile
Journeyman Geek
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.