Как получается, что пропущенные 0 автоматически добавляются в IP-адреса? (`ping 10.5` эквивалентно` ping 10.0.0.5`)

36

Я случайно набрал

ssh 10.0.05

вместо того

ssh 10.0.0.5

и был очень удивлен, что это сработало. Я также пытался, 10.005и 10.5те также расширились автоматически 10.0.0.5. Я также попытался, 192.168.1и это расширилось до 192.168.0.1. Все это также работало с, pingа не с ssh, так что я подозреваю, что это будет работать для многих других команд, которые подключаются к произвольному хосту, предоставленному пользователем.

Почему это работает? Это поведение где-то задокументировано? Это поведение является частью POSIX или что-то? Или это просто странная реализация? (Использование Ubuntu 13.10 для чего стоит.)

Нику Стирка
источник

Ответы:

43

Цитирование из man 3 inet_aton:

   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.

   In all of the above forms, components of the dotted address can be
   specified in decimal, octal (with a leading 0), or hexadecimal, with
   a leading 0X).  Addresses in any of these forms are collectively
   termed IPV4 numbers-and-dots notation.  The form that uses exactly
   four decimal numbers is referred to as IPv4 dotted-decimal notation
   (or sometimes: IPv4 dotted-quad notation).

Для развлечения попробуйте это:

$ nslookup unix.stackexchange.com
Non-authoritative answer:
Name:   unix.stackexchange.com
Address: 198.252.206.140

$ echo $(( (198 << 24) | (252 << 16) | (206 << 8) | 140 ))
3338456716

$ ping 3338456716         # What?  What did we ping just now?
PING stackoverflow.com (198.252.206.140): 48 data bytes
64 bytes from 198.252.206.140: icmp_seq=0 ttl=52 time=75.320 ms
64 bytes from 198.252.206.140: icmp_seq=1 ttl=52 time=76.966 ms
64 bytes from 198.252.206.140: icmp_seq=2 ttl=52 time=75.474 ms
devnull
источник
2
Что касается того, почему, это предоставить более полезный способ представления адресов в сетях классов A, B, C. Например, 127.1 является адресом обратной связи в сети обратной связи класса A 127.0 / 8, которая включает 16 миллионов адресов от 127.0 до 127.0xffffff. А в сети класса 192.168.0 / 16 класса B вы обычно будете иметь адреса от 192.168.1 до 192.168.65534. Адрес INADDR_ANY это 0, то DHCP широковещательный адрес 0xffffffff , который короче , чтобы напечатать и т.д.
Stéphane Chazelas
4
Человек, я хотел бы, чтобы пользователи попробовали http: // 1249767214, прежде чем задавать простые вопросы, подобные этому.
Blahdiblah
21

Если добавить точный ответ @ devnull , адреса IPv4 можно представить следующими способами.

пример

Это доменное имя, google.comможет быть представлено следующими способами:

  • 74.125.226.4  (десятичный пунктир)
  • 1249763844  (десятичная дробь)
  • 0112.0175.0342.0004  (восьмеричный пунктир)
  • 011237361004  (плоский восьмеричный)
  • 0x4A.0x7D.0xE2.0x04  (пунктирный гекс)
  • 0x4A7DE204  (плоский гекс)
  • 74.0175.0xe2.4  (ಠ_ಠ)

Источник: Почему ping 192.168.072 (только 2 точки) возвращает ответ от 192.168.0.58? ,

SLM
источник
3
Смешивать восьмеричное и десятичное - это работа дьявола.
Nit
4
Доменное имя ни в каком смысле не является адресом IPv4.
Дэвид Конрад
@DavidConrad - я подумал, что это вроде очевидно, так как это не цифра. Сделано понятнее для тех, кто не знает их.
SLM