0.0.0.0、127.0.0.1和localhost有什么区别?

498
我正在使用mac上的Jekyll和Vagrant。我发现Jekyll服务器将绑定到0.0.0.0:4000而不是127.0.0.1:4000。默认情况下,gem服务器也会绑定到此地址。我仍然可以通过http://localhost:port访问它。但对于Jekyll来说,默认设置(例如0.0.0.0:4000)需要Internet访问。如果没有Internet,我将无法运行Jekyll服务器。这是一个小bug吗?
我还使用Vagrant。在Vagrantfile中设置了端口转发(8080 => 4000),因为我在Macintosh下安装了Jekyll并在Vagrant虚拟机中进行测试。如果使用默认设置(0.0.0.0:4000),它可以正常工作。我可以通过http://localhost:8080从我的safari访问它。但如果没有网络,我就无法绑定到0.0.0.0:4000。我使用jekyll server -H 127.0.0.1将服务绑定到127.0.0.1:4000,然后我无法通过http://localhost:8080访问它。
有人能解释一下0.0.0.0、127.0.0.1和localhost之间的区别吗?有人能解释一下为什么这种差异会导致这个问题吗?

4
这篇文章可能会有帮助 https://www.howtogeek.com/225487/what-is-the-difference-between-127.0.0.1-and-0.0.0.0/ - Fangxing
这可能会有所帮助:127.0.0.1和0.0.0.0之间有什么区别? - martinho
3个回答

672

127.0.0.1通常是分配给“回环”或本地接口的IP地址。这是一个“虚假”的网络适配器,只能在同一主机内进行通信。当您希望一个具有网络功能的应用程序仅为同一主机上的客户端提供服务时,通常会使用它。在127.0.0.1上监听连接的进程只会接收该套接字上的本地连接。

“localhost”通常是127.0.0.1 IP地址的主机名。它通常设置在/etc/hosts(或Windows中的等效文件“hosts”,通常位于C:\Windows\System32\Drivers\etc\hosts)。您可以像使用任何其他主机名一样使用它-尝试ping localhost,看看它是如何解析为127.0.0.1的。

0.0.0.0在不同的情境下有几种不同的含义,但在这个上下文中,当服务器被告知监听0.0.0.0时,意味着“监听所有可用的网络接口”。从服务器进程的角度来看,具有IP地址127.0.0.1的环回适配器看起来就像机器上的任何其他网络适配器一样,因此被告知监听0.0.0.0的服务器也会接受该接口上的连接。

这希望能回答您关于IP方面的问题。我对Jekyll或Vagrant不熟悉,但我猜测您的端口转发8080 => 4000可能与特定的网络适配器绑定,因此当您在本地连接到127.0.0.1时,它不在路径中。


嗯,即使没有将hosts文件指向“localhost”,在Windows上似乎也可以使用“ping localhost”。 - Pacerier
1
同意Pacerier的观点。至少在Windows中,localhost默认行为是0.0.0.0(而不是127.0.0.1)。 - drodsou
19
除了你对绑定到0.0.0.0的描述之外,这基本上是正确的。这不会像你所描述的那样绑定到每个可用的网络接口,而是绑定到所有地址。在TCP堆栈中,这被称为INADDR_ANY。 - Piotr Dobrogost
9
强调另一个常见的误解:你不能使用客户端连接到0.0.0.0,你必须知道服务器正在侦听哪些实际地址。例如,如果服务器运行在具有地址10.9.8.7和192.168.128.64的系统上,当服务器进程侦听0.0.0.0时,你可以连接到其中任何一个地址(并且在服务器系统本身上的127.0.0.1),前提是防火墙等未因其他原因单独阻止你的访问。 - tripleee
关于在 http://* 和 http://0.0.0.0 上监听的问题,有什么区别吗?在我看来它们是一样的。 - OverInflatedWalrus
显示剩余2条评论

38

在当前版本的Jekyll中,默认情况下访问地址为http://127.0.0.1:4000/


如果您连接到网络,但不希望其他人访问您的应用程序,则这是很好的选择。

然而,有可能您想要查看您的应用程序如何在移动设备或其他笔记本电脑/计算机上运行。

在这种情况下,您可以使用

jekyll serve --host 0.0.0.0

这将使您的应用程序绑定到主机,然后使用以下内容来连接来自其他主机的应用程序

http://host's IP adress/4000 

32

我将举例解释127.0.0.1和0.0.0.0的区别:

假设你在远程计算机上运行任何Web服务器(例如Nginx),以便想让互联网上的任何人都能访问它。

如果你的 Nginx Web 服务器监听的是127.0.0.1:80,则只有登录到该服务器的您可以访问它,其他人无法访问。

而当Web服务器监听0.0.0.0:80时,任何互联网上的人都可以通过在浏览器中输入您的服务器IP地址来连接到您的服务器。

请注意,端口号可以是任何被监听的端口,我选择80作为示例,因为这是Web服务器的默认端口,浏览器在输入IP地址后并不强制要求用户输入它。


8
你没有解释127.0.0.1和0.0.0.0之间的区别,只是进行了说明。 - Martin
@Martin 我相信第3行和第4行回答了提问者的问题,对吗? - N Altun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接