IP 주소를 ping하려고 하면 10.10.208.57
해당 IP 주소를 가진 네트워크에 아무것도 없기 때문에 응답이 없습니다.
그러나 ping을 시도하면10.10.208.
057
대신 다른 IP 주소가 응답합니다.
root@everest:/root# ping 10.10.208.057
PING 10.10.208.057 (10.10.208.47) 56(84) bytes of data.
64 bytes from 10.10.208.47: icmp_seq=1 ttl=253 time=0.732 ms
64 bytes from 10.10.208.47: icmp_seq=2 ttl=253 time=0.695 ms
64 bytes from 10.10.208.47: icmp_seq=3 ttl=253 time=0.659 ms
64 bytes from 10.10.208.47: icmp_seq=4 ttl=253 time=0.705 ms
Lexmark E120n 프린터를 고려하면 10.10.208.47
이 이상한 문제의 원인은 무엇일까요?
답변1
이러한 동작은 실제로 ping의 일반적인 기능으로 인한 것이며 실제 하드웨어와는 관련이 없습니다.
실제로 IP 주소(또는 그 일부) 앞에 0을 붙이면 숫자가 다음과 같이 해석됩니다.8진수.
따라서 8진법은 47을 057
의미합니다 . 따라서 핑은57
ICMP주소에 있는 기계에 질의하여 10.10.208.47
응답을 얻습니다.
0 대신 0x 접두사를 사용하여 16진수로 주소를 ping할 수도 있습니다.
편집: 많은 의견에서 알 수 있듯이 이 기능은 실제로 ping
IP 주소를 조작하는 많은 CLI 소프트웨어에만 국한되지 않으며 찾을 수 있습니다.
답변2
다른 많은 유닉스 프로그램과 마찬가지로 Ping은 이름 확인을 위해 유닉스 시스템의 C 라이브러리를 사용합니다. 사용되는 기능 중 하나는 입니다 inet_aton
.
매뉴얼 페이지는 다음과 같이 inet_aton
말합니다.
모든 숫자는 `.'에서 ``부분''으로 제공됩니다. 표기법은 C 언어에 지정된 대로 10진수, 8진수 또는 16진수일 수 있습니다(즉, 앞에 오는 0x 또는 0X는 16진수를 의미합니다. 그렇지 않으면 앞에 0이 8진수를 의미하고, 그렇지 않으면 숫자는 10진수로 해석됩니다).
따라서 앞에 0을 사용하면 숫자는 8진수로 해석됩니다. 따라서 57 = 047 = 0x39입니다.