维基百科 :
环回设备上最常用的IP地址是127.0.0.1(IPv4),但127.0.0.0到127.255.255.255范围内的任何地址都映射到该地址。
这不是真的,至less在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
这是正确的行为?
FreeBSD(也是OS X,我相信NetBSD和OpenBSD)会响应发送到loopback接口上configuration地址的请求,就像在任何其他接口上的地址一样 – 如果你想得到答案,你需要先指定地址:
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
关于此实现背后的逻辑,请参阅RFC 3330 :
127.0.0.0/8 – 该块被分配用作互联网主机
回送地址。 由更高级别的协议发送到的数据报
在这个块内的任何地址都应该回到主机内部。
这通常只使用127.0.0.1/32进行环回 ,
但是这个块内的地址不应该出现在任何networking上
任何地方[ RFC1700 ,第5页]。
(重点是我的)
Linux和Windows在这里是“有帮助的”,但是从我的椅子回答一个请求发送到一个地址没有分配给这个主机是不正确的行为… … –
我看到你在FreeBSD 8.1上描述的相同的行为。 与FreeBSD共享一些DNA的Mac OS X也似乎只映射127.0.0.1。
Windows 7和Linux(内核为2.6.26的debian)似乎都是按照维基百科的报价(和RFC中规定的)描述完整的地址范围。
引用RFC 3330:
127.0.0.0/8 – 该块被分配用作互联网主机回送地址。 由更高级别的协议发送到该块内任何地址的数据报应循环回主机内部。 这通常只使用127.0.0.1/32进行回送,但是任何地方的任何networking都不应该出现该块内的地址[RFC1700,第5页]。
根据你对“应该”这个词的严格解释,有些人可能会认为FreeBSD / MacOS的行为是错误的。 但是考虑到127.0.0.1作为环回地址的普遍使用,我怀疑这可能是重要的。
它逆stream而上。 没有一个FreeBSD的方块来确认它的FreeBSD还是你的configuration。
RFC说127.0.0.1/24 – 所以它应该是响应。
现在问题已经完全解答了三次了,所以我只想补充几分钱。
请注意,相当一段时间,默认ipfw config会丢弃这种types的数据包:
./rc.firewall: ${fwcmd} add 100 allow ip from any to any via lo0 ./rc.firewall: ${fwcmd} add 300 deny ip from 127.0.0.0/8 to any
所以启用防火墙,而不是
ping: sendto: Can't assign requested address
你可能会得到
[savetherbtz@PH34R ~]$ ping 127.0.0.2 PING 127.0.0.2 (127.0.0.2): 56 data bytes ping: sendto: Permission denied
PS。 因为可以build立没有INET (IPv4支持)的服务器,你甚至不会有127.0.0.1 =)