W jaki sposób brakujące zera są automatycznie dodawane do adresów IP? („ping 10.5” odpowiada „ping 10.0.0.5”)

36

Przypadkowo wpisałem

ssh 10.0.05

zamiast

ssh 10.0.0.5

i byłem bardzo zaskoczony, że zadziałało. Próbowałem też 10.005i 10.5a te również rozszerzony automatycznie 10.0.0.5. Próbowałem również 192.168.1i to rozszerzyło się na 192.168.0.1. Wszystko to również pracował pingzamiast ssh, więc podejrzewam, że to działa w wielu innych poleceń, które łączą się z dowolnym dostarczone przez użytkownika hosta.

Dlaczego to działa? Czy to zachowanie jest gdzieś udokumentowane? Czy to zachowanie jest częścią POSIX czy coś takiego? A może to tylko dziwna implementacja? (Używanie Ubuntu 13.10 za to, co jest warte.)

Nicu Stiurca
źródło

Odpowiedzi:

43

Cytowanie z 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).

Dla zabawy spróbuj tego:

$ 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
diabelnie
źródło
2
Dlaczego ma to zapewnić bardziej użyteczny sposób reprezentowania adresów w sieciach klasy A, B, C. Na przykład 127.1 to adres sprzężenia zwrotnego w sieci sprzężenia zwrotnego klasy A 127.0 / 8, który obejmuje 16 milionów adresów od 127.0 do 127.0xffffff. A w sieci 192.168.0 / 16 klasy B zazwyczaj będziesz mieć adresy od 192.168.1 do 192.168.65534. Adres INADDR_ANY to adres 0rozgłoszeniowy DHCP 0xffffffff, który jest krótszy do
wpisania
4
Człowieku, chciałbym, żeby użytkownicy spróbowali http: // 1249767214, zanim zadadzą takie proste pytania.
blahdiblah
21

Dodając do dokładnej odpowiedzi @ devnull , adresy IPv4 można przedstawić w następujący sposób.

Przykład

Tę nazwę domeny google.commożna reprezentować na następujące sposoby:

  • 74.125.226.4  (kropka dziesiętna)
  • 1249763844  (ułamek dziesiętny)
  • 0112.0175.0342.0004  (kropkowany ósemkowy)
  • 011237361004  (płaskie ósemki)
  • 0x4A.0x7D.0xE2.0x04  (kropkowany hex)
  • 0x4A7DE204  (płaski hex)
  • 74.0175.0xe2.4  (ಠ_ಠ)

Źródło: Dlaczego polecenie ping 192.168.072 (tylko 2 kropki) zwraca odpowiedź z 192.168.0.58? .

slm
źródło
3
Mieszanie liczb ósemkowych i dziesiętnych jest dziełem diabła.
Nit
4
Nazwa domeny nie jest w żadnym sensie adresem IPv4.
David Conrad
@DavidConrad - Myślałem, że to trochę oczywiste, ponieważ nie jest liczbowe. Uściślono dla tych, którzy nie znają tego.
slm