Ping和使用三位IPv4地址。为什么它可以工作?

4

我不小心打错了一个数字,发现我可以ping和ssh到IP地址10.8.290 ... 一个八位中有一位缺失。有人能解释一下吗?这是协议的一部分还是一些Linux黑魔法(我正在使用Debian)?

user@ws:~$ ping -c3 10.8.290
PING 10.8.290 (10.8.1.34) 56(84) bytes of data.
64 bytes from 10.8.1.34: icmp_req=1 ttl=62 time=0.910 ms
64 bytes from 10.8.1.34: icmp_req=2 ttl=62 time=0.686 ms
64 bytes from 10.8.1.34: icmp_req=3 ttl=62 time=0.708 ms

--- 10.8.290 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.686/0.768/0.910/0.100 ms
user@ws:~$ ssh root@10.8.290
The authenticity of host '10.8.290 (10.8.1.34)' can't be established.
ECDSA key fingerprint is 21:bd:7e:fb:1e:6d:1e:c1:e9:11:c0:a9:73:a8:cf:85.
Are you sure you want to continue connecting (yes/no)? no
Host key verification failed.
1个回答

3
它能正常工作是因为您正在使用值为290的第三个字节的IP地址。一个字节可以存储0255之间的值,共有256个值。由于IPv4地址是一个4字节的值,将290传递给第三字节会导致整数溢出到第四字节->290-256 => 34

这与协议"特性"无关。 ping只是不验证target命令行参数的单个八位组的值,而是简单地将其传递给较低级别的C函数inet_aton()(aton表示ascii to number)。这会导致ping10.8.1.34

我不确定,但我认为其他版本的ping(在Windows、BSD上)也会表现出相同的行为。


谢谢,那帮了我大忙。我刚在Windows上测试了一下,结果一样! - zio
不客气。我查看了BSD版本的“ping”源代码,结果相同。 - hek2mgl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接