为什么我能ping通127.1?

为什么我能ping通127.1?

我知道 IPv6 允许省略连续的零。但 IPv4 呢?我在互联网上找不到任何关于这方面的参考资料,包括维基百科和RFC 791- 互联网协议。这个文件 建议在 IPv4 地址中“可以省略前导零”(搜索术语“省略”)。不够具体。

查看这个 shell 会话:

[~]$ ping -c 1 127.1
PING 127.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.040 ms

--- 127.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.040/0.040/0.040/0.000 ms
[~]$ ping -c 1 127.0.1
PING 127.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.044 ms

--- 127.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.044/0.044/0.044/0.000 ms
[~]$ ssh 127.1 :
The authenticity of host '127.1 (127.0.0.1)' can't be established.
ECDSA key fingerprint is 04:48:fa:f2:ef:95:7c:35:46:39:2e:d3:89:dd:cd:87.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '127.1' (ECDSA) to the list of known hosts.
[email protected]'s password: 

显然,ping 和 ssh 都将 127.1 和 127.0.1 理解为与 127.0.0.1 相同。这是在哪里指定的?

答案1

大约一年前有一篇 Stack Overflow 帖子问了类似的问题(这个帖子)。

主要原因是inet_aton()手册页)将八位字节转换为二进制地址。

A B C D

四个数字部分中的每一个部分指定地址的一个字节;这些字节按从左到右的顺序分配以产生二进制地址。

美国广播公司

a 和 b 部分指定二进制地址的前两个字节。c 部分被解释为一个 16 位值,定义二进制地址的最右边两个字节。此表示法适用于指定(过时的)B 类网络地址。

AB

a 部分指定二进制地址的第一个字节。b 部分被解释为一个 24 位值,定义二进制地址最右边的三个字节。此表示法适用于指定(过时的)C 类网络地址。

A

值 a 被解释为一个 32 位值,直接存储到二进制地址中,而无需进行任何字节重新排列。

这不是由 POSIX.anything 定义的 - 但它被广泛使用。

答案2

它是旧有类寻址的遗物。127.1表示网络127、主机1。(是的,127.257这是合法的,因为网络127可以拥有超过 256 个主机。)

相关内容