Dlaczego MacOSX próbuje rozpoznać zerowane adresy IP jako nazwy hostów?

4

Ten spowodował przyjacielowi ból głowy podczas konfigurowania przełączanego połączenia internetowego, które miało zerowane adresy IP w dokumencie konfiguracji, tak jak poniżej:

192.168.019.254

Bez względu na to, jak próbował skonfigurować stos sieci Mac, po prostu nie działało. Ale GUI również nie narzekało na błędy.

Później dowiedziałem się, że pingowanie tych adresów wypełnionych zerami w terminalu pokazało „niemożność rozwiązania”, podczas gdy pingowanie tego samego adresu bez zerowanych zer ( 192.168.19.254vs. 192.168.019.254) pokazało „niemożność dotarcia”, co wniosło dużo światła do tego mysterium. Usunięcie niepotrzebnych zer sprawiło, że wszystko działało.

Czy to błąd, czy funkcja? Nigdy wcześniej nie spotkałem się z tak dziwnym zachowaniem - bez względu na to, czy używam GUI lub CLI do konfigurowania lub testowania IP.

hurikhan77
źródło

Odpowiedzi:

10

Tłumaczenie z ciągu na adres jest zwykle wykonywane przez funkcję POSIX getaddrinfo(). Ta funkcja najpierw sprawdza numeryczny adres IP inet_addr(), a jeśli to się nie powiedzie, spróbuje rozpoznać ciąg jako nazwę domeny. inet_addr()interpretuje liczby z wiodącym 0 jako ósemkowe, więc na przykład 010stałby się 8i 019byłby błędem (i dlatego zostałby rozwiązany jako nazwa domeny). To samo zachowanie występuje również w systemie Linux i Solaris.

Od getaddrinfo():

Jeśli podana rodzina adresów to AF_INET lub AF_UNSPEC, ciągi adresów korzystające ze standardowej internetowej notacji kropkowej, jak określono w, inet_addr()są prawidłowe.

Od inet_addr():

Wszystkie liczby podawane jako części w notacji dziesiętnej z kropkami IPv4 mogą być dziesiętne, ósemkowe lub szesnastkowe, jak określono w normie ISO C (to znaczy, wiodące 0x lub 0X oznacza liczbę szesnastkową; w przeciwnym razie wiodące „0” oznacza liczbę ósemkową; w przeciwnym razie liczba jest interpretowana jako dziesiętna).

Zanotuj adres 192.168.8.254 w nawiasach:

$ ping 192.168.010.254
PING 192.168.010.254 (192.168.8.254): 56 data bytes
Request timeout for icmp_seq 0
mark4o
źródło
Ok, to całkiem sprzeczne z intuicją, ale może być przydatne. Nadal nie wyjaśnia, dlaczego 192.168.010.254 nie był w stanie rozwiązać, podczas gdy 192.168.10.254 nie był w stanie osiągnąć. Czy obaj nie powinni być w stanie dotrzeć?
hurikhan77
3
Po prostu uderzyło mnie to błyskawicznie: mówiąc o liczbach ósemkowych, pamiętam, że pierwotne IP, o którym mowa, to coś w rodzaju xxx.xxx.019.xxx - co oczywiście nie jest prawidłowym numerem, a zatem nieprawidłową nazwą hosta.
Zmieniam
Zaktualizowałem swoją odpowiedź, aby odpowiedzieć na zaktualizowane pytanie.
mark4o
+1 i acc za świetne wyjaśnienie. Pozostaje pytanie, dlaczego graficzny interfejs użytkownika systemu Mac OS nie interpretuje liczb dziesiętnych tak, jak powinien. Jednak i tak dokument konfiguracyjny ISP jest po prostu niewłaściwy. Testowałem na komputerze z systemem Windows (ponieważ nie jest on posix), który wykazuje taką samą interpretację w interfejsie CLI - jednak nie robi tego w interfejsie GUI.
hurikhan77
@ hurikhan77 Masz to. To nie jest prawidłowy adres IP, ponieważ 9nie jest on prawną cyfrą ósemkową, więc zasadą jest traktowanie go jako nazwy hosta.
David Schwartz,