Пинг IP-адреса отвечает с другим IP

21

Когда я пытаюсь пропинговать 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, что может быть причиной этой странной проблемы?

PsyStyle
источник
3
Поднимись, посмотри ответ в этой теме: superuser.com/questions/486788/…
Михал Соколовский

Ответы:

43

Такое поведение на самом деле происходит из-за обычной функции ping и не имеет никакого отношения к вашему фактическому оборудованию.

Действительно, префикс IP-адреса (или его части) с начальным нулем приведет к тому, что число будет интерпретировано как восьмеричное .

Таким 057образом, 57в базе 8 имеется значение 47. Таким образом, ping отправит ICMP- запрос на компьютер, расположенный по адресу, 10.10.208.47и, следовательно, получит от него ответ.

Обратите внимание, что вы также можете пинговать адреса в шестнадцатеричном формате, используя префикс 0x вместо 0.

Редактировать: Как отмечается во многих комментариях, эта функция на самом деле не является специфической pingи может быть найдена во многих программах CLI, управляющих IP-адресами.

eltrai
источник
Вау! Спасибо! Мое сердце остановилось на
пару
4
Не просто пинг. Многие вещи делают это.
Дженни Ди говорит восстановить Монику
1
Баш обрабатывает все "целые числа" вот так: askubuntu.com/questions/621500/…
Тим
15

Ping, как и многие другие программы Unix, использует библиотеки C в вашей системе Unix для разрешения имен. Одна из функций , используемых в inet_aton.

Страница руководства для inet_atonговорит:

Все числа поставляются как `` части '' в `. ' нотация может быть десятичной, восьмеричной или шестнадцатеричной, как указано в языке Си (т. е. ведущий 0x или 0X подразумевает шестнадцатеричное; в противном случае начальный 0 подразумевает восьмеричное; в противном случае число интерпретируется как десятичное).

Поэтому, когда вы используете начальный ноль, число интерпретируется как восьмеричное. Таким образом, 57 = 047 = 0x39.

Дженни Ди говорит восстановить Монику
источник
Я заметил, что даже Windows ведет себя так же. Спасибо за ваш подробный ответ!
PsyStyle
@PsyStyle Добро пожаловать! Это стандартная запись чисел в широком спектре операционных систем и языков программирования.
Дженни Ди говорит восстановить Монику
«Поэтому, когда вы используете начальный ноль, число интерпретируется как десятичное число». Я думаю, что это опечатка, вы имели в виду истолкованы как восьмеричное право?
Cruncher
1
Спасибо @Cruncher. Я обвиняю слишком высокую концентрацию крови в моем потоке кофеина.
Дженни Ди говорит восстановить Монику