我在 hiredis 中运行示例,它使用127.0.0.2
作为 Redis 服务器 IP,并且运行正常。实际上,redis 服务器在同一台机器上运行。我知道 是127.0.0.1
的 IP 地址lo
,但是 呢127.0.0.2
?它与 相同吗127.0.0.1
?
答案1
是的:
IPv4 网络标准将整个 127.0.0.0/8 地址块保留用于环回目的。这意味着发送到这 16,777,214 个地址(127.0.0.1 至 127.255.255.254)之一的任何数据包都会被环回。IPv6 只有一个地址,::1。
各种互联网工程任务组 (IETF) 标准为此目的保留了 IPv4 地址块 127.0.0.0/8(采用 CIDR 表示法)和 IPv6 地址 ::1。最常用的 IPv4 地址是 127.0.0.1。通常,这些环回地址会映射到主机名、本地主机或环回。
或者从 RFC 本身来看:
127.0.0.0/8 - 此地址块指定为 Internet 主机环回地址。由更高级别协议发送到此地址块内任意地址的数据报应在主机内环回。这通常仅使用 127.0.0.1/32 进行环回,但此地址块内的任何地址都不应出现在任何网络上 [RFC1700,第 5 页]。
为了好玩,请尝试 ping:
$ ping 127.127.127.127
PING 127.127.127.127 (127.127.127.127) 56(84) bytes of data.
64 bytes from 127.127.127.127: icmp_req=1 ttl=64 time=0.110 ms
64 bytes from 127.127.127.127: icmp_req=2 ttl=64 time=0.065 ms
^C
--- 127.127.127.127 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.065/0.087/0.110/0.024 ms
答案2
下面我将回答您的每一个问题,并提供参考和示例。这不是简单的“是”或“否”的问题。
- “所有
127.x.x.x
地址都仅限于本地机器吗?”是的 - “所有
127.x.x.x
地址是否都绑定到lo
接口”是的 - “
127.x.x.x
地址是否通过网络路由?”不 - “所有 127.xxx 地址都一样吗?”不(取决于操作系统)
127.0.0.0/8 - 此地址块指定为 Internet 主机环回地址。由高级协议发送到此地址块内任意地址的数据报都会在主机内环回。这是通常仅使用 127.0.0.1/32 实现用于环回。如 [RFC1122] 第 3.2.1.3 节所述,整个 127.0.0.0/8 块内的地址不会合法地出现在任何地方的任何网络上。—RFC5735强调我的。
- “是
127.0.0.2
相同的127.0.0.1
?”不根据 rfc5735 的规定,可能是,但不一定非得是。这是实现定义的行为。请参阅操作系统手册。无论如何,整个范围都是保留的,并且不得通过网络路由。
而127.0.0.1
到127.255.255.254
是所有本地地址都绑定到接口lo
。它们并不相同。您可以使用每个地址将不同的服务绑定到同一端口。例如,端口 80 上的 1600 万个 Web 服务器只能从本地计算机访问(如果您的内存或其他资源没有耗尽)
我刚刚设置了一个要绑定到的 docker 服务127.0.0.2:80
。然后我为 添加了别名/etc/hosts
。现在我可以通过 连接到它http://myserver
,但不能通过http://127.0.0.1
或http://localhost
连接到它。但是它只对这台机器可用。因为它只在界面上lo
。
然后,我设置了另一个要绑定的 docker 服务127.0.0.3:80
,以及一个 python 服务localhost:80
以及另一个 服务127.0.0.4:80
。
这可能不适用于所有操作系统。我使用的是 Debian(9) Gnu/Linux,Linux 内核 4.9.0-3-amd64。有些操作系统可能将所有地址视为127.0.0.1
相同127.255.255.254
。有些可能仅适用于127.0.0.1
。
请注意,ping 等服务将监听 0.0.0.0 (ipv4),因此ping 127.127.127.127
将被监听器接收,因为127.127.127.127
这是您的地址之一。但是,如果服务监听特定地址,则您需要使用此特定地址来连接它(取决于所使用的操作系统)。
也可以看看
答案3
这不是一个全面的一般性答案(已经有一个了)。我的这个答案127.0.0.2
显示了用于解决问题的一个例子。
提炼:
楼主尝试测试某个软件在与服务器的连接被拒绝的情况下的表现。这是通过服务器上的一条临时iptables
规则实现的,该规则拒绝来自客户端 IP 的所有流量。客户端可以立即“看到”连接被拒绝。
当此人将服务器软件移到与客户端相同的机器上并尝试使用环回接口时,问题就出现了。规则设置为阻止来自的通信,127.0.0.1
但连接被拒绝的信息也经过了相同的规则,并且从未到达挂起的客户端软件(大概是超时)。
解决方案是使用127.0.0.2
作为服务器地址并设置拒绝连接的规则到关于拒绝的信息已发送127.0.0.1
并能够传递给客户端软件。