我知道 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 个主机。)