Qual è la differenza tra 0.0.0.0, 127.0.0.1 e localhost?


271

Sto usando Jekylle Vagrantsul mio mac. Ho scoperto che Jekyll serversi legherà 0.0.0.0:4000invece di 127.0.0.1:4000. Inoltre gem serversi legherà a questo indirizzo per impostazione predefinita. Posso ancora visitarlo tramite http://localhost:port. Ma per Jekyll, sembra che l'impostazione predefinita (es. 0.0.0.0:4000) richieda l'accesso a Internet. Non posso correre Jekyll serversenza Internet. È un piccolo bug?

Anche io uso Vagrant. Ho impostato il port forwarding (8080 => 4000) in Vagrantfile, poiché installo Jekyllnella Vagrantmacchina virtuale e lo collaudo su Macintosh. Se utilizzo l'impostazione predefinita (0.0.0.0:4000), funziona. Posso visitarlo dal mio safari con http://localhost:8080. Ma se non c'è internet, non posso legare a 0.0.0.0:4000. Uso invece il jekyll server -H 127.0.0.1servizio di bind 127.0.0.1:4000, quindi non riesco a visitarlo tramite http://localhost:8080.

Qualcuno può spiegare la differenza tra 0.0.0.0, 127.0.0.1 e localhost ? E qualcuno può spiegare perché la differenza causerà questo problema ?


Questo articolo può essere utile howtogeek.com/225487/…
fangxing

Risposte:


408

127.0.0.1è normalmente l'indirizzo IP assegnato all'interfaccia "loopback" o solo locale. Questa è una scheda di rete "falsa" che può comunicare solo all'interno dello stesso host. Viene spesso utilizzato quando si desidera un'applicazione in grado di supportare solo client sullo stesso host. Un processo in attesa 127.0.0.1di connessioni riceverà solo connessioni locali su quel socket.

"localhost" è normalmente il nome host per l' 127.0.0.1indirizzo IP. Di solito è impostato in /etc/hosts(o l'equivalente di Windows chiamato "host" da qualche parte sotto %WINDIR%). Puoi usarlo come qualsiasi altro nome host - prova "ping localhost" per vedere come si risolve 127.0.0.1.

0.0.0.0ha un paio di significati diversi, ma in questo contesto, quando ad un server viene detto di ascoltare 0.0.0.0significa "ascoltare su ogni interfaccia di rete disponibile". L'adattatore di loopback con indirizzo IP 127.0.0.1dal punto di vista del processo del server appare come qualsiasi altro adattatore di rete sulla macchina, quindi un server a cui si dice di ascoltare 0.0.0.0accetterà connessioni anche su quell'interfaccia.

Speriamo che risponda al lato IP della tua domanda. Non ho familiarità con Jekyll o Vagrant, ma suppongo che il port forwarding 8080 => 4000sia in qualche modo associato a una particolare scheda di rete, quindi non è nel percorso quando ci si connette localmente a127.0.0.1


Hmm, ping localhostsembra funzionare su Windows anche senza il file hosts che punta 127.0.0.1a localhost.
Pacerier,

D'accordo con Pacerier. Almeno in Windows, localhost si comporta come 0.0.0.0 (non 127.0.0.1) per impostazione predefinita
drodsou,

5
"Questo è per lo più corretto, tranne per la tua descrizione dell'associazione a 0.0.0.0. Questo non si lega a tutte le interfacce di rete disponibili come hai descritto, ma piuttosto si lega a tutti gli indirizzi . Negli stack TCP questo è noto come INADDR_ANY - dalla risposta eliminata di @strangemonad.
Piotr Dobrogost,

15

Nella versione corrente di Jekyll, il valore predefinito è http://127.0.0.1:4000/ .
Questo va bene se sei connesso a una rete ma non vuoi che nessun altro acceda alla tua applicazione.

Tuttavia, può succedere che tu voglia vedere come l'applicazione viene eseguita su un dispositivo mobile o da qualche altro laptop / computer.

In tal caso, puoi usare

jekyll serve --host 0.0.0.0

Ciò vincola l'applicazione all'host e al successivo utilizzo successivo per connettersi ad esso da qualche altro host

http://host's IP adress/4000 
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.