0.0.0.0, 127.0.0.1和localhost之间的区别是什么?

我在我的mac上使用JekyllVagrant。我发现Jekyll server将绑定到0.0.0.0:4000而不是127.0.0.1:4000。同时,gem server将默认绑定到此地址。我仍然可以通过http://localhost:port访问它。但是对于Jekyll似乎默认设置(例如0.0.0.0:4000)需要Internet访问。我不能运行Jekyll server没有互联网。是一个小错误吗?

我也使用Vagrant。我在Vagrantfile中设置了端口转发(8080 => 4000),因为我在Vagrant虚拟机中安装了Jekyll,并在Macintosh下测试它。如果我使用默认设置(0.0.0.0:4000),它可以工作。我可以用http://localhost:8080从我的狩猎旅行中访问它。但是如果没有网络,我无法绑定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之间的区别?谁能解释为什么这个差异会导致这个问题?

221341 次浏览

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

"localhost"通常是127.0.0.1 IP地址的主机名。它通常设置在/etc/hosts中(或在Windows中名为“hosts”的等效%WINDIR%下)。你可以像使用其他主机名一样使用它——尝试“ping localhost”看看它是如何解析为127.0.0.1的。

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

希望这回答了你的知识产权问题。我不熟悉Jekyll或Vagrant,但我猜你的端口转发8080 => 4000以某种方式绑定到特定的网络适配器,所以当你本地连接到127.0.0.1时,它不在路径中

在当前版本的Jekyll中,它默认为http://127.0.0.1:4000/ 如果您连接到网络,但不希望任何人访问您的应用程序,那么这是很好的。< / p >

但是,您可能想要查看应用程序在移动设备或其他笔记本电脑上的运行情况。

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

jekyll serve --host 0.0.0.0

这将你的应用程序绑定到主机上。接下来使用以下命令从其他主机连接到它

http://host's IP adress/4000

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

想象一下,你在一台远程机器上运行任何web服务器(例如Nginx),这样你就想让互联网上的任何人都能访问它。

如果你的Nginx web服务器监听127.0.0.1:80,那么除了你登录到这个服务器上,没有人可以访问它。

当web服务器监听0.0.0.0:80时,Internet上的任何人都能够通过在浏览器中输入您的服务器IP地址连接到您的服务器。

注意,监听的不是80端口,而是任何端口。我以80为例,因为这是web服务器的默认端口,浏览器在输入IP地址后不会强制用户输入。