因此,我发现了 Windows 10 ping 实用程序的一个奇怪之处。如果您 ping 一个整数而不是 IP 地址,它会将该数字“转换”为 IPv4 地址。转换方式是,第一个八位字节是您的 256^3 位,第二个八位字节是 256^2,第三个八位字节是 256^1,最后一个八位字节是“个位”或 256^0。
例如“ping 200”将 ping 0.0.0.200,但“ping 400”将 ping 0.0.1.144,其中第三个八位字节中的“1”代表 256(256 + 144 = 400)。
快速的 Google 搜索(虽然我想不出一个很好的搜索词)没有带来任何结果。
我的仅有的两个理论是:
- 可能在 IP 模式的早期迭代中(即未使用的 v1、v2 或 v3),计划只使用单个整数。微软出于对向后兼容性的痴迷,在 ping 实用程序中编写了一个转换算法来处理这种情况,当时 ping 首次被编码。
- 可能是由于 ping 实用程序的编码方式,它通常会获取有效的 IPv4 地址并将其转换为单个整数,然后再对该数据执行操作。因此,作为代码中的检查,如果它发现用户输入了一个整数,它就会跳过初始转换步骤。
有什么想法吗?这确实引起了我的同事的兴趣,但他们和我一样一无所知。
编辑:刚刚在我的 Arch Linux 机器上进行了测试,我可以确认该行为也存在,所以这很可能推翻我的第一个理论。
答案1
答案记录在维基百科:
在实施有类网络时,其他地址表示法也很常用。例如,环回地址 127.0.0.1 通常写为 127.1,因为它属于 A 类网络,网络掩码为 8 位,主机号为 24 位。当地址中以点分表示法指定的数字少于四个时,最后一个值将被视为一个整数,其字节数与将地址填充为四个八位字节所需的字节数相同。因此,地址 127.65530 相当于 127.0.255.250。
答案2
这不是一个怪癖,而是一个特点。
请记住,IPv4 地址的点表示法只是表示四字节(即 32 位)整数的一种方式,该整数是 IPv4 地址(并位于 IP 数据包中的 32 位目标字段中)。不同的实用程序将接受此整数的不同格式。
我知道过去有些浏览器接受像这样的十进制整数作为地址栏中的地址。(令我惊讶的是,我当前的两个浏览器 Firefox 和 Chrome 不再这样做。)
答案3
“.0” 可以有条件地省略
你经常会用“ping 127.0.0.1”命令对机器做环路测试,以验证该机器的 TCP/IP 协议套件是否安装正确。但是你发现了吗?使用“ping 127.1”命令也可以得到同样的测试结果。其实“ping 127.1”和“ping 127.0.0.1”这两个命令是一样的,都是在进行环路测试。
为什么会这样呢?这就是Ping命令应用中使用IP地址的技巧。大家都知道IP地址是由32位二进制数字组成的,为了让大家更容易记忆,每8位二进制数字都转换成十进制数字。因此,就形成了一个由四部分十进制数字组成的容易记忆的IP地址(如127.0.0.1)。由于Windows操作系统有自动补齐“.0”的功能,所以我可以把“127.0.0.1”改成“127.1”。
但这个“.0”的省略是有条件限制的,不能任意省略。在Ping命令的应用中,只能省略IP地址最后一位十进制数字之前的一个或多个“.0”,如将“ping 127.0.0.1”命令重写为“ping 127.1”。
如果一个或多个“.0”不是位于十进制数最后一部分紧挨着的位置,而是位于其他位置,那么这个“.0”就不能省略,比如“ping 202.0.96.1”就不能写成“ping 202.96.1”。这是因为“ping 202.96.1”返回的结果是“202.96.0.1”的响应报文,而不是“202.0.96.1”的响应报文。
使用数字字符串代替 IP 地址
在Ping命令中,也可以用数字字符串来代替IP地址,运行“ping 3658906394”命令,将会看到IP地址“218.22.123.26”的返回信息。
为什么会这样呢?其实“3658906394”是IP地址“218.22.123.26”的另一种表现形式。当然你也可以用同样的方法ping其他IP地址。
字符串是如何转换的呢?其实并不复杂,以IP地址“218.22.123.26”为例,IP地址转换成数字字符串的方法如下:先将“218.22.123.26”转换成十六进制的“DA.16.7B.1A”,然后去掉小数点后的部分,就变成了“DA167B1A”,最后将十六进制数转换成十进制的“3658906394”,则“218.22.123.26”就变成了“3658906394”。用同样的方法将其他IP地址转换成数字字符串。
提示:在某些局域网环境下,使用“Ping+数字串”命令可能会失败,出现“未知主机数字串”的提示信息,这是因为数字串被解析成了主机名,而不是IP地址。
答案4
IPv4 地址是无符号的 32 位整数。为了使它们更易于阅读,人们通常以“点分十进制”表示法在 UI 中显示它们,其中每个八位字节(8 位字节)从最高有效位开始,表示为十进制数,用点与下一个八位字节分隔。
一些 UI 可能允许您输入任何可以解释为 UInt32 的内容并使用生成的 UInt32 作为您想要的 IPv4 地址,这并不奇怪。