Пінгінг IP-адреси відповідає різним IP-адресою


21

Коли я намагаюся пінг-адреси IP-адреси, у 10.10.208.57мене немає відповіді, оскільки в мережі нічого не існує з цією IP-адресою.

Однак якщо я спробую ввести ping 10.10.208.0,57 замість цього відповість інша 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, що може бути джерелом цієї дивної проблеми?


3
Бум, подивіться на відповідь у цій темі: superuser.com/questions/486788/…
Міхал Соколовський

Відповіді:


43

Така поведінка насправді пояснюється звичайною особливістю ping і не має відношення до вашого фактичного обладнання.

Дійсно, префіксація IP-адреси (або її частини) первинним нулем призведе до інтерпретації числа як восьмеричний .

Це 057означає, що 57в базі 8, що становить 47. Таким чином, ping відправить ICMP- запит на машину, розташовану за адресою, 10.10.208.47і, отже, отримає відповідь від нього.

Зауважте, що ви також можете пінг-адреси в шістнадцятковій формі, використовуючи префікс 0x замість всього 0.

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


Ого! Дякую! Моє серце зупинилося на купу хвилин :-)
PsyStyle

4
Не просто пінг. Багато речей це роблять.
Дженні Д каже, що поверніть Моніку

1
Bash ставиться до всіх "цілих чисел", таких як 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 Я звинувачую в занадто високій концентрації крові в моєму потоці кофеїну.
Дженні Д каже, що поверніть Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.