为什么我可以ping 127.1?

Ale*_*uil 12 ip-address ipv4 specifications

我知道 IPv6 允许省略连续的零。但是 IPv4 呢?我还没有在 Internet 上找到任何对此的参考,包括 Wikipedia 和RFC 791 – Internet Protocol。本文档 建议在 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.
alex@127.1's password: 
Run Code Online (Sandbox Code Playgroud)

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

ner*_*ler 15

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

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

A B C D

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

美国广播公司

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

AB

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

一种

值 a 被解释为 32 位值,直接存储到二进制地址中,没有任何字节重新排列。

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

  • @AlexandredeVerteuil:ping 需要 *hosts*,而不是网络......所以是的,IPv4 为 /32。 (2认同)

Dav*_*rtz 4

这是旧时代优雅称呼的遗物。127.1意思是网络127、主机1。(是的,127.257这是合法的,因为网络127可以拥有超过 256 个主机。