Dziwny zapis kropki dziesiętnej adresu IP… Jak to działa?


89

Wcześniej dzisiaj myślałem, że mam adres URL w moim schowku, ale tak naprawdę miałem skopiowane cztery 9-cyfrowe liczby całkowite z arkusza kalkulacyjnego, które były numerami identyfikacyjnymi z zastrzeżonego systemu. Całkowicie niezwiązany z danym zadaniem. Wkleiłem go do Firefoksa i zdziwiłem się, że rzeczywiście załadował stronę. Wcześniej widziałem bez kropkowe zapisy dziesiętne adresów IPv4 , ale ta długa liczba jest czymś znacznie, znacznie większym.

714687644714805209715128610715964400 (przyklej HTTP: // z przodu)

Jak to działa? Wszystkie konwertery dziesiętne -> IPv4, które znalazłem w Internecie, uznają to za nieprawidłowe wejście. Jeśli wezmę adres IPv4, który faktycznie ładuje, i wykonam te same obliczenia, aby przekonwertować go na dziesiętne bez kropki, otrzymam znacznie mniejszą liczbę.

Czytałem, że ping może akceptować dwords i dokonać konwersji, ale nie może przekonwertować tej liczby na adres IP. IPv6 nie wchodzi w rachubę, ponieważ ten host nie ma łączności IPv6.

Co to za szaleństwo? Ogłuszyło mnie i moich współpracowników.

Edycja: Teraz jest online.



2
Czy naprawdę jesteś pewien, że nie jest to adres IPv6? Ponieważ liczba ta dzieli się na 8 cyfr w bazie 65536; Adresy IPv6 mają 8 cyfr w bazie 65536. Reprezentowane w postaci szesnastkowej, jak zwykle w przypadku IPv6, to 89: a4d2: 471b: 45ef: 77ed: c70f: da35: 93f0.
Christian

2
@Christian Jego wyjaśnienie źródła jives z pokazanym faktycznym numerem, który ma 36 cyfr (każdy identyfikator to 9 cyfr 714xxxxxx lub 715xxxxxx). Komputer nie ma nawet IPv6, a liczba przyjęta jako adres IPv4 rzeczywiście zwraca stronę internetową. Liczby od ~ 5E33 do ~ 3E38 mają 8 cyfr w podstawie 65536, myślę, że to tylko zbieg okoliczności, że jego zakres mieści się w tym zakresie (plus, każda mniejsza liczba byłaby również prawidłowym adresem IPv6)
Tim S.

1
@beeks Ok, już nie działało, kiedy próbowałem go wczoraj, ale biorąc pod uwagę, że był to niezabezpieczony router, może nie jest to takie zaskakujące. Więc mówisz, że w zasadzie umieszczasz losową liczbę na pasku adresu? Lub jakiego rodzaju arkusz kalkulacyjny miałeś tam, który zawiera dziwnie zakodowane adresy IP niezabezpieczonych routerów? ;)
Christian

1
@Christian, LOL. Były to niektóre unikalne identyfikatory wiadomości w systemie zgodności. Zupełnie dziwna szansa, że ​​wkleiłem je w pasek adresu i zadziałało. Założę się, że już nigdy więcej mi się to nie przydarzy :)
śpiewa

Odpowiedzi:


93

To dość interesujące pytanie i zastanowienie mnie zajęło trochę czasu. Krótka odpowiedź to ostatnie 32 bity liczby to 3660944368 (w systemie dziesiętnym, które można znaleźć przez 714687644714805209715128610715964400 mod 2^32)

Jest to wartość dziesiętna adresu IPv4 218.53.147.240 , którą można znaleźć, konwertując ją na base-256 3660944368 = 218*(256^3)+53*(256^2)+147*(256)+240analogicznie do wypisywania liczb dziesiętnych (base-10). Na przykład 234 = 2*10^2+ 3*10 + 4.

Jak wskazuje @chritohnide, każda sekcja kropkowanych adresów IPv4 jest nazywana oktetem, ponieważ reprezentuje 8 cyfr binarnych. Warto również zauważyć, że różne formaty adresów IPv4 (takie jak dziesiętny z kropkami lub czysty dziesiętny) to po prostu różne sposoby reprezentowania 32-bitowej liczby binarnej dla naszej korzyści.

Ponieważ adresy IPv4 są liczbami 32-bitowymi, do rozstrzygnięcia adresu są używane tylko ostatnie 32-bitowe liczby. Dlaczego to prawda, nie jest tak oczywiste. Jak zauważyli inni, pełna liczba wygląda uderzająco podobnie do adresu IPv6 w systemie dziesiętnym, ale nie jest poprawnym adresem.

Patrząc na specyfikację Teredo (patrz 4. Adresy Teredo ), klient IPv4 zajmuje ostatnie 32 bity adresu IPv6, ale prefiks numeru nie jest zgodny ze specyfikacją Teredo (patrz także wikipedia ).


12
Niezła odpowiedź. Warto również wspomnieć, że każda sekcja kropkowanego adresu IPv4 jest nazywana oktetem, ponieważ jest to dziesiętna reprezentacja 8-bitowej liczby binarnej (4 oktety = 4 x 8 bitów = 32 bity adresu IPv4) i że liczba dziesiętna wersja jest naprawdę tylko dla naszej korzyści.
chritohnide

4
Jesteś pewien, że nie jest to notacja dziesiętna IPv6? Konwertuje z powodzeniem do0089:a4d2:471b:45ef:77ed:c70f:da35:93f0
Izkata

5
@Izkata: Mało prawdopodobne, ponieważ adres ten znajdowałby się w nieprzydzielonej i zarezerwowanej części przestrzeni adresowej IPv6.
Henning Makholm

3
Liczba (w ASCII) prawdopodobnie zostanie po prostu przepuszczona przez jeden z ciągów C stdlib do funkcji int w celu konwersji na 32-bitowy adres ipv4. W większości implementacji C stdlib te konwersje automatycznie wykonają modulo 2 ^ <pożądany rozmiar liczby całkowitej>. Wynikiem tego jest dokładnie obserwowane zachowanie.
Tonny

3
Warto zauważyć, że jest to prawdopodobnie dziwactwo parsera adresów URL Firefoksa. Wydaje się, że rozpoznaje, że jest to liczba, a nie adres URL, i próbuje go parsować jako 32-bitowy, nierozstrzygnięty adres IP (wynikowa parsowana liczba całkowita kończy się na modulo 32-bitowym i tak naprawdę nie sprawdza błędów na wejściu ). Na przykład Chrome nie wykazuje tego zachowania. W rzeczywistości warto zgłosić to jako trywialny błąd w przeglądarce Firefox.
Jason C
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.