Pingowanie adresu IP odpowiada innym adresem IP

21

Kiedy próbuję pingować adres IP, 10.10.208.57nie mam odpowiedzi, ponieważ nic nie istnieje w sieci z tym adresem IP.

Jeśli jednak spróbuję pingować 10.10.208.0,57 inny adres IP odpowiada:

root@everest:/root# ping 10.10.208.057
PING 10.10.208.057 (10.10.208.47) 56(84) bytes of data.
64 bytes from 10.10.208.47: icmp_seq=1 ttl=253 time=0.732 ms
64 bytes from 10.10.208.47: icmp_seq=2 ttl=253 time=0.695 ms
64 bytes from 10.10.208.47: icmp_seq=3 ttl=253 time=0.659 ms
64 bytes from 10.10.208.47: icmp_seq=4 ttl=253 time=0.705 ms

Biorąc pod uwagę, że 10.10.208.47jest to drukarka Lexmark E120n, co może być przyczyną tego dziwnego problemu?

PsyStyle
źródło
3
Bump, spójrz na odpowiedź w tym wątku: superuser.com/questions/486788/…
Michał Sokołowski

Odpowiedzi:

43

To zachowanie jest w rzeczywistości spowodowane normalną funkcją pingowania i nie ma związku z twoim sprzętem.

Rzeczywiście, prefiksowanie adresu IP (lub jego części) wiodącym zerem spowoduje interpretację liczby jako ósemkowej .

Tak więc 057środki 57na bazie 8, który jest 47. Zatem ping wysyła ICMP zapytanie do maszyny znajduje się pod adresem 10.10.208.47, a zatem uzyskać odpowiedź od niego.

Zauważ, że możesz również pingować adresy w systemie szesnastkowym, używając przedrostka 0x zamiast tylko 0.

Edycja: jak sugeruje wiele komentarzy, ta funkcja w rzeczywistości nie jest specyficzna pingi można ją znaleźć w wielu programach CLI manipulujących adresami IP.

eltrai
źródło
Zaraz! Dziękuję Ci! Moje serce zatrzymało się na kilka minut :-)
PsyStyle
4
Nie tylko ping. Robi to wiele rzeczy.
Jenny D mówi Przywróć Monikę
1
Bash traktuje wszystkie „liczby całkowite” w ten sposób askubuntu.com/questions/621500/...
Tim
15

Ping, podobnie jak wiele innych programów uniksowych, korzysta z bibliotek C w systemie uniksowym do rozpoznawania nazw. Jedną z używanych funkcji jest inet_aton.

Strona inet_atonpodręcznika dla mówi:

Wszystkie liczby podane jako `` części '' w ``. '' notacja może być dziesiętna, ósemkowa lub szesnastkowa, jak określono w języku C (tzn. wiodące 0x lub 0X oznacza szesnastkowy; w przeciwnym razie wiodące 0 oznacza ósemkowe; w przeciwnym razie liczba jest interpretowana jako dziesiętna).

Kiedy więc używasz wiodącego zera, liczba jest interpretowana jako ósemka. Zatem 57 = 047 = 0x39.

Jenny D mówi Przywróć Monikę
źródło
Zauważyłem, że nawet Windows zachowuje się tak samo. Dziękujemy za szczegółową odpowiedź!
PsyStyle
@PsyStyle Nie ma za co! Jest to standardowa notacja liczb w szerokim spektrum systemów operacyjnych i języków programowania.
Jenny D mówi Przywróć Monikę
„Więc kiedy używasz wiodącego zera, liczba jest interpretowana jako dziesiętna.”. Myślę, że to literówka, miałeś na myśli interpretację ósemkową, prawda?
Cruncher
1
Dzięki @Cruncher. Obwiniam zbyt wysokie stężenie krwi w moim strumieniu kofeiny.
Jenny D mówi Przywróć Monikę