Почему pinging 192.168.072 (всего 2 точки) возвращает ответ от 192.168.0.58?

Я ошибочно пропустил точку с IP-адреса и набрал 192.168.072.
К моему удивлению, я подключился к машине в 192.168.0.58

Если я ping 192.168.072, я получаю ответы от 192.168.0.58.

Почему это?


Я на ПК с Windows в домене Windows.


Если я ping 192.168.72, я получаю ответ от 192.168.0.72, поэтому он выглядит 0 в 072 (в моей первоначальной ошибке).


  

Этот вопрос был Суперпользовательский вопрос недели .
Прочитайте запись в блоге для более подробной информации или внести вклад в блог

370 голосов | спросил George Duckett 12 +04002012-10-12T14:26:07+04:00312012bEurope/MoscowFri, 12 Oct 2012 14:26:07 +0400 2012, 14:26:07

4 ответа


565

Все чрезмерно усложняют его с помощью 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).

Есть несколько краевых случаев, таких как предоставление более четырех частей, которые, похоже, не работают (например, pinging google.com) не будет работать для любого 0.74.125.226.4 или 0.74.125.226.4).

Вы также можете использовать шестнадцатеричную нотацию как в пунктирной, так и в плоской форме, но должны форматировать ее с предварительным ожиданием 74.125.226.4.0 для каждого октета.


Таким образом, существует множество способов представления IP-адреса (IPv4). Вы можете использовать формат flat или dotted-quad (или dotted-triple, dotted-double или even dotted-single), и для каждого из них вы можете использовать (или даже смешивать и сопоставлять) десятичные, восьмеричные и шестнадцатеричные. Например, вы можете выполнить ping 0x следующими способами:

  • google.com   (доменное имя)
  • google.com   (пунктирная десятичная)
  • 74.125.226.4 Â (плоская десятичная)
  • 1249763844 Â (пунктирная восьмеричная)
  • 0112.0175.0342.0004 Â Â (плоский восьмеричный)
  • 011237361004 Â Â (пунктирный шестнадцатеричный)
  • 0x4A.0x7D.0xE2.0x04 Â Â (flat hex)
  • 0x4A7DE204   (a² _à²) литий>

(Слава богу, что поддержка двоичной нотации не была добавлена!)


Application

В вашем случае pinging 74.0175.0xe2.4 использует третий формат в приведенной выше таблице (192.168.072), поэтому вы на самом деле пинговаете A.B.0.C. Кроме того, поскольку у вас есть начальный ноль на последней части, он рассматривается как восьмеричный, который в десятичном значении равен 58.

Тайна решена.


Обратите внимание, что, хотя команда Windows 192.168.0.072 позволяет таким широким разнообразием форматов ввода и интерпретирует нестандартные форматы способами, которые не обязательно означают, что вы можете использовать такие форматы везде. Некоторые программы могут заставить вас предоставить все четыре части четвероногого, другие могут не допускать смешивания и сопоставления десятичных и восьмеричных и т. Д.

Кроме того, адреса IPv6 еще более усложняют логику синтаксического анализа и приемлемость входного формата.


Добавление

syss указал что если вы используете недопустимый символ в одном из чисел (например, ping или 8) при использовании восьмеричного кода 9 в шестнадцатеричном режиме и т. д.), тогда g достаточно умен, чтобы распознать это и интерпретировать его как URL-адрес строки (-al? -ic?), а не как числовой IP-адрес.

(Как человек, у которого были многочисленные аневризмы и сердечные приступы, пытающиеся написать предположительно «простой» код для размещения экспоненциально взрывающегося количества перестановок значений данных, я ценю, что он, кажется, правильно обрабатывать все входные вариации, в этом случае не менее 3 1 +3 2 +3 3 +3 4 = 120 .)

Итак, при указании ping будет пинговать 010.020.030.040, как ожидалось, передавая 8.16.24.32 в 010.020.030.080 code> будет рассматриваться как URL, а не IP-адрес, например ping, который может (но, к сожалению, не существует). Другими словами, он пытается выполнить ping поддомен foo.bar.baz.com в субдомене 010 в домене 020 в домене верхнего уровня 030. Однако, поскольку 080 не является допустимым TLD (например, 080, .com и их приятелями), соединение завершается с ошибкой на первом шаг.

То же самое происходит с .net, гденедопустимый символ находится в другом октете. Аналогично, 090.010.010.010 pings 0xf.0xf.0xf.0xf, но 15.15.15.15 не работает.

Хорошо, я думаю, это то, что вы получаете за то, что не свободно владеете многочисленными базами чисел.

Вероятно, проще и безопаснее просто использовать 4-х точечные квадраты («40q» - «квадраты»).

Итак, и изучите некоторые базы чисел . Вы сможете похвастаться жизнью и быть участниками вечеринок, и, как говорится, есть 10 типов людей: те, кто знает двоичных и тех, кто не жертвует.

Пусть даже думает о адресах IPv6; Я думаю, что они являются одним из 111 тюленей !!!

ответил Synetech 12 +04002012-10-12T21:06:12+04:00312012bEurope/MoscowFri, 12 Oct 2012 21:06:12 +0400 2012, 21:06:12
147

Для этого есть две причины:

Во-первых, префикс '0' указывает восьмеричный номер. Так как oct (072) = dec (58), 192.168.072 = 192.168.58.

Во-вторых, второе-последнее 0 можно отбросить с IP-адресов как сокращение . 127.0.1 интерпретируется как 127.0.0.1, а в вашем случае 192.168.58 интерпретируется как 192.168.0.58.

ответил neu242 12 +04002012-10-12T14:39:57+04:00312012bEurope/MoscowFri, 12 Oct 2012 14:39:57 +0400 2012, 14:39:57
97

В дополнение к важному пункту @ neu242 об восьмеричной нотации и наблюдении, что IP-адреса могут быть сокращены, другая критическая часть знает, как интерпретируются сокращенные IP-адреса.

Можно было бы наивно предположить, что если некоторые из четырех чисел отсутствуют, парсер добавит нулевые заполненные байты в конец (или начало) последовательности байтов. Но это не соответствует поведению, о котором сообщает OP: 192.168.072 анализировался как 192.168. 0 .58, а не как 192.168.58. 0 , ни 0 .192.168.58.

Очевидно, что Windows и Linux ping (версия, которую вы пробовали, и те, которые я пробовал) используют что-то эквивалентное inet_aton () для анализа аргумента IP-адреса. справочная страница для inet_aton () говорит:

The address supplied in cp can have one of the following forms:

 a.b.c.d   Each of the four numeric parts specifies a byte of the address; the
           bytes are assigned in left-to-right order to produce the binary
           address.

 a.b.c     Parts a and b specify the first two bytes of the binary address.
           Part c is interpreted as a 16-bit value that defines the rightmost
           two bytes of the binary address.  This notation is suitable for
           specifying (outmoded) Class B network addresses.

 a.b       Part a specifies the first byte of the binary address.  Part b is
           interpreted as a 24-bit value that defines the rightmost three bytes
           of the binary address.  This notation is suitable for specifying
           (outmoded) Class C network addresses.

 a         The value a is interpreted as a 32-bit value that is stored directly
            into the binary address without any byte rearrangement.

Итак, у вас есть это ... 192.168.072 соответствует шаблону abc, поэтому 072 (после синтаксического анализа как восьмеричное число) был интерпретирован как 16- битное значение, которое определяет самые правые 2 байта двоичного адреса, эквивалентные 0.58.

Вышеупомянутые правила эквивалентны тому, что если любое из четырех чисел отсутствует, нулевые заполненные байты добавляются непосредственно перед последним номером ... не в конце или в конце начало строки байтов. (Выражение этого способа работает, если последнее заданное число меньше 256.)

Обратите внимание, что более поздние версии ping могут не допускать такого сокращения или восьмеричную интерпретацию. исходный код 2010 для iputils (включая ping), который я нашел, использует inet_pton (), а не inet_aton () для анализа аргумента IP-адреса. справочная страница для inet_pton () говорит:

  

В отличие от inet_aton (3) и inet_addr (3), inet_pton () поддерживает адреса IPv6. На   с другой стороны, inet_pton () принимает только адреса IPv4 в методе с десятичной точностью,   тогда как inet_aton (3) и inet_addr (3) допускают более общие   обозначение чисел и точек (шестнадцатеричные и восьмеричные форматы и   форматы, которые не требуют, чтобы все четыре байта были явно записаны).

ответил LarsH 12 +04002012-10-12T19:33:28+04:00312012bEurope/MoscowFri, 12 Oct 2012 19:33:28 +0400 2012, 19:33:28
25

Вы также должны учитывать, что ip может быть представлен целыми числами, добавленными по значимости к их позиции.

192.168.0.58 is :
  192 * 256^3
+ 168 * 256^2
+   0 * 256^1
+  58 * 256^0

Вот крутая вещь:

192.168.58 будет 192.168.0.58, потому что

    0 * 256^1 
+  58 * 256^0 
=  58

192.11010106 также будет 192.168.0.58, потому что

  168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 11010106

3232235578 также будет 192.168.0.58, потому что

  192 * 256^3 
+ 168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 3232235578
ответил vesquam 12 +04002012-10-12T17:57:16+04:00312012bEurope/MoscowFri, 12 Oct 2012 17:57:16 +0400 2012, 17:57:16

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132