在具有正常环回接口的Linux机器上:
$ ifconfig lo
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:36621784 errors:0 dropped:0 overruns:0 frame:0
TX packets:36621784 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:6752024976 (6.2 GiB) TX bytes:6752024976 (6.2 GiB)
当我 ping 127.0.0.0/8 范围内的任何添加地址时,我收到了响应:
$ ping -c1 127.7.23.4
PING 127.7.23.4 (127.7.23.4) 56(84) bytes of data.
64 bytes from 127.7.23.4: icmp_seq=1 ttl=64 time=0.045 ms
--- 127.7.23.4 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.045/0.045/0.045/0.000 ms
此行为是 Linux 特有的,因为我在 Mac OS X Lion 机器上没有看到它。我没有为环回接口设置任何 IP 别名,而这正是我期望它工作的原因。
为什么会发生这种情况?这是预期的行为吗?
答案1
Windows 也有这种行为。我猜这是对rfc3330
127.0.0.0/8 - 此地址块指定为 Internet 主机环回地址。由更高级别协议发送到此地址块内任意地址的数据报应在主机内环回。这通常仅使用 127.0.0.1/32 进行环回,但此地址块内的任何地址都不应出现在任何网络上 [RFC1700,第 5 页]。
看起来 Linux 将其解释为 127.0.0.0/8 范围内的任何地址(即使是未配置的地址)都应该环回,然后您就会收到来自 ping 的响应。
答案2
该行为记录在RFC 1700.127.7.23.4
也是一个环回地址,也分配给本地机器。(它还会分配给什么?)
IP 地址 ::= { <网络号>, <主机号> }
...
{127, <任意>}
内部主机环回地址。不应出现在主机外部。
无需让此范围内的所有地址都起作用,但在处理不允许指定端口而只允许指定 IP 地址的协议时,这种方法特别方便。拥有多个本地 IP 地址允许您运行这些服务器的多个实例以供本地使用。