Ping并使用三个八位位组ipv4地址。它为什么有效?

时间:2015-02-11 11:20:42

标签: linux debian ip-address ipv4

偶然我发错了,发现我可以ping和ssh到IP地址10.8.290 ...正确的一个八位字节丢失了。有人可以向我解释一下吗?这是协议的一部分还是一些linux-black-magic(我使用的是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 个答案:

答案 0 :(得分:3)

它的工作原理是因为您使用值290作为IP地址的第三个字节。一个字节可以存储从0255的值,并提供256个值。由于IPv4地址是4字节值,因此将290传递给第三个字节会导致整数溢出到第4个字节 - > 290 - 256 => 34

它与协议"功能" 无关。 ping只是不验证target命令行参数的各个八位字节的值,只是将其传递给较低级别​​的C函数inet_aton()(aton表示ascii为number) 。这会导致ping 10.8.1.34

我不确定,但我希望其他版本的ping(在Windows,BSD上)表现相同。