Усі надмірно ускладнюють це RFC, IP класами тощо. Просто проведіть кілька тестів, щоб побачити, як ping
команда аналізує вхід IP-адресою користувачем (стороннє обрив видалено):
> ping 1
Pinging 0.0.0.1 with 32 bytes of data:
> ping 1.2
Pinging 1.0.0.2 with 32 bytes of data:
> ping 1.2.3
Pinging 1.2.0.3 with 32 bytes of data:
> ping 1.2.3.4
Pinging 1.2.3.4 with 32 bytes of data:
> ping 1.2.3.4.5
Ping request could not find host 1.2.3.4.5. Please check the name and try again.
> ping 255
Pinging 0.0.0.255 with 32 bytes of data:
> ping 256
Pinging 0.0.1.0 with 32 bytes of data:
Як бачите, ping
команда (в Windows) дозволяє використовувати різні формати IP-адреси. Адреса IPv4 може бути розбита на чотири частини ("пунктирний квадратик") так:, A.B.C.D
і ping
команда дозволяє залишити деякі, заповнюючи за замовчуванням 0
наступне:
1 part (ping A) : 0.0.0.A
2 parts (ping A.B) : A.0.0.B
3 parts (ping A.B.C) : A.B.0.C
4 parts (ping A.B.C.D) : A.B.C.D
Якщо ви подаєте лише одну частину, то якщо вона менше 255 (максимум для октету), вона обробляється як октет, як вище, але якщо вона більша за 255, вона перетворюється і перекочується в наступне поле (тобто mod 256
).
Є кілька крайових випадків, таких як надання більш ніж чотирьох частин, схоже, не працює (наприклад, google.com
IP-адреса Pinging не буде працювати ні для одного, 0.74.125.226.4
ні для 74.125.226.4.0
).
Ви також можете використовувати шістнадцяткові позначення як у пунктирній, так і у плоскій формі, але потрібно відформатувати їх, попередньо очікуючи 0x
на кожен октет.
Отже, існує безліч способів представити IP-адресу (IPv4). Ви можете використовувати плоский або крапковий (або пунктирний-потрійний, пунктирний-подвійний або навіть крапковий-одинарний) формат, і для кожного з них ви можете використовувати (або навіть змішувати та зіставляти) десятковий, вісімковий і шістнадцятковий. Наприклад, ви можете ввести пінг google.com
такими способами:
google.com
(Доменне ім'я)
74.125.226.4
(пунктир)
1249763844
(плоска десяткова)
0112.0175.0342.0004
(пунктир)
011237361004
(плоский восьмикутник)
0x4A.0x7D.0xE2.0x04
(пунктир)
0x4A7DE204
(плоский шестигранник)
74.0175.0xe2.4
(ಠ_ಠ)
(Слава богу, що підтримка бінарних нотацій не додана!)
Застосування :
У вашому випадку pinging 192.168.072
використовує третій формат у наведеній вище таблиці ( A.B.0.C
), тож ви насправді пінгінгу 192.168.0.072
. Далі, оскільки у вас є попередній нуль на останній частині, він трактується як вісімковий, який у десятковій частині дорівнює 58.
Таємниця вирішена.
Зауважте, що, хоча команда Windows ping
дозволяє настільки широкий спектр форматів для введення та інтерпретує нестандартні формати у видимий спосіб, це не обов'язково означає, що ви можете використовувати такі формати скрізь. Деякі програми можуть змусити вас надати всі чотири частини крапки з пунктиром, інші можуть не дозволяти змішувати та співставляти десятковий і восьмеричний тощо.
Також адреси IPv6 ще більше ускладнюють логіку розбору та прийнятність формату введення.
Додаток :
syss вказував, що якщо ви використовуєте недійсний символ в одному з чисел (наприклад, 8
або 9
при використанні восьмеричного, g
в шістнадцятковому режимі тощо), то ping
це досить розумно, щоб розпізнати це і інтерпретувати його як рядок (-al? -ic?) URL, а не як числова IP-адреса.
(Оскільки той, хто мав численні аневризми та серцеві напади, намагаючись написати нібито «простий» код для розміщення експоненціально вибухової кількості перестановок значень даних, я розумію, що це, здається, - правильно обробляє всі вхідні зміни; в цьому випадку, принаймні 3 1 +3 2 +3 3 +3 4 = 120 варіантів.)
Отже, визначаючи, як 010.020.030.040
буде ping, 8.16.24.32
як очікувалося, перехід 010.020.030.080
до ping
буде розглядатися як URL-адреса, а не IP-адреса, як, наприклад, foo.bar.baz.com
яка (але, на жаль, не існує). Іншими словами, він намагається пінг піддомену 010
на піддомен 020
в домені 030
на домені верхнього рівня 080
. Однак, оскільки 080
не є дійсним TLD (як .com
, .net
і їхні приятелі), з'єднання не вдається відразу на першому кроці.
Те саме відбувається з тим, 090.010.010.010
де недійсний символ знаходиться в іншому октеті. Так само 0xf.0xf.0xf.0xf
пінг 15.15.15.15
, але 0xh1.0x1.0xg0.0f
не вдається.
Ну добре, я думаю, що це ви отримуєте за те, що не володієте кількома базами даних.
Напевно, простіше і безпечніше просто переконатися, що завжди використовувати 4-крапкові ("40q"? "Quaddy-quad"? "Cutie-q"?) Адреси.
Тому продовжуйте вивчати основи чисел . Ви зможете продемонструвати себе і прожити життя партій, і, як кажуть, є 10 типів людей: тих, хто знає бінарне, і тих, хто цього не робить.
Давайте навіть не думати про IPv6 адреси; Я думаю, що вони одна з 111 печаток !!!