Eug*_*ash 10 networking freebsd loopback ipv4
来自维基百科:
环回设备上最常用的 IP 地址是 IPv4 的 127.0.0.1,尽管 127.0.0.0 到 127.255.255.255 范围内的任何地址都映射到它。
这不是真的,至少在 FreeBSD 上是这样:
$ ping 127.1.1.1
PING 127.1.1.1 (127.1.1.1): 56 data bytes
ping: sendto: Can't assign requested address
Run Code Online (Sandbox Code Playgroud)
这是正确的行为吗?
FreeBSD(也是 OS X,我相信 NetBSD 和 OpenBSD)将响应发送到环回接口上配置地址的请求,就像它们对任何其他接口上的地址一样——如果你想要一个答案,你需要先分配地址:
mgraziano@monitor ~]$ ifconfig lo0
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=3<RXCSUM,TXCSUM>
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
nd6 options=3<PERFORMNUD,ACCEPT_RTADV>
[mgraziano@monitor ~]$ ping 127.1.1.1
PING 127.1.1.1 (127.1.1.1): 56 data bytes
ping: sendto: Can't assign requested address
^C
[mgraziano@monitor ~]$ sudo ifconfig lo0 alias 127.1.1.1 netmask 0xFFFFFFFF
[mgraziano@monitor ~]$ ifconfig lo0
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=3<RXCSUM,TXCSUM>
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
inet 127.1.1.1 netmask 0xffffffff
nd6 options=3<PERFORMNUD,ACCEPT_RTADV>
[mgraziano@monitor ~]$ ping 127.1.1.1
PING 127.1.1.1 (127.1.1.1): 56 data bytes
64 bytes from 127.1.1.1: icmp_seq=0 ttl=64 time=0.020 ms
^C
Run Code Online (Sandbox Code Playgroud)
关于此实现背后的逻辑,请参阅RFC 3330:
127.0.0.0/8 - 该块被分配用作 Internet 主机
环回地址。由更高级别协议发送到
该块内任何地址的数据报应该在主机内部循环。
这通常仅使用 127.0.0.1/32 实现环回,
但此块内的地址不应出现在任何网络的
任何位置 [ RFC1700,第 5 页]。
(强调我的)
Linux 和 Windows 在这里“有帮助”,但是从我的椅子上回答发送到未分配给该主机的地址的请求是不正确的行为......
我看到您在 FreeBSD 8.1 上描述的相同行为。与 FreeBSD 共享一些 DNA 的 Mac OS X 似乎也只映射 127.0.0.1。
Windows 7 和 Linux(具有 2.6.26 内核的 debian)似乎都映射了您在 Wikipedia 引用中描述的完整地址范围(以及 RFC 中的规定)。
引用 RFC 3330:
127.0.0.0/8 - 该块被分配用作 Internet 主机环回地址。由更高级别协议发送到该块内任何地址的数据报应该在主机内部循环。这通常仅使用 127.0.0.1/32 实现环回,但此块内的地址不应出现在任何网络的任何位置 [RFC1700,第 5 页]。
根据您对“应该”一词的解释的严格程度,有些人可能会认为 FreeBSD/MacOS 的行为是错误的。但考虑到 127.0.0.1 作为环回地址的普遍使用,我怀疑这是否重要。