Когда я пытаюсь пропинговать IP-адрес 10.10.208.57
У меня нет ответа, поскольку в сети ничего не существует с этим IP-адресом.
Однако, если я попытаюсь пинговать 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
Учитывая, что 10.10.208.47
это принтер Lexmark E120n, в чем может быть причина этой странной проблемы?
Такое поведение на самом деле связано с нормальной функцией ping и не имеет отношения к вашему реальному оборудованию.
Действительно, добавление к IP-адресу (или его части) начального нуля приведет к тому, что число будет интерпретировано как восьмеричный.
Так 057
средства 57
в базе 8, которая равна 47. Таким образом, ping отправит ICMP запрос к машине, расположенной по адресу 10.10.208.47
и поэтому получить от него ответ.
Обратите внимание, что вы также можете пинговать адреса в шестнадцатеричном формате, используя префикс 0x вместо 0.
Изменить: как предполагают многие комментарии, эта функция на самом деле не относится к ping
и его можно найти во многих программах CLI, управляющих IP-адресами.
Ping, как и многие другие программы unix, использует библиотеки C в вашей системе unix для разрешения имен. Одна из используемых функций - inet_aton
.
Страница руководства для inet_aton
говорит:
Все номера представлены как `` части '' в `. ' нотация может быть десятичной, восьмеричной или шестнадцатеричной, как указано в языке C (т.е. ведущий 0x или 0X подразумевает шестнадцатеричный; в противном случае ведущий 0 подразумевает восьмеричный; в противном случае число интерпретируется как десятичное).
Поэтому, когда вы используете начальный ноль, число интерпретируется как восьмеричное. Таким образом, 57 = 047 = 0x39.