Усі надмірно ускладнюють це 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.comIP-адреса 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 печаток !!!