Networking
為什麼我在 FreeBSD 下無法 ping 回環設備上的地址?
來自維基百科:
環回設備上最常用的 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
這是正確的行為嗎?
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
關於此實現背後的邏輯,請參閱RFC 3330:
127.0.0.0/8 - 此塊被分配用作 Internet 主機
環回地址。由更高級別協議發送到
該塊內任何地址的數據報應在主機內部循環。
這通常僅使用 127.0.0.1/32 for loopback 來實現,
但此塊內的任何地址都不應該出現在任何
地方的任何網路上 [ RFC1700,第 5 頁]。
(強調我的)
Linux和Windows在這裡“有幫助”,但是從我的椅子上回答發送到未分配給該主機的地址的請求是不正確的行為……