Przez pomyłkę przegapiłem kropkę adresu IP i wpisałem 192.168.072
.
Ku mojemu zaskoczeniu podłączyłem się do maszyny pod adresem192.168.0.58
Jeśli pinguję 192.168.072
, otrzymuję odpowiedzi od 192.168.0.58
.
Dlaczego to?
Jestem na komputerze z systemem Windows w domenie Windows.
Jeśli pinguję 192.168.72
, otrzymuję odpowiedź 192.168.0.72
, więc wygląda na to, że znacznik 0
in 072
(w moim pierwotnym błędzie) jest znaczący.
To pytanie było pytaniem superużytkownika tygodnia .
Przeczytać wpis w blogu więcej szczegółów lub przyczynić się do bloga samemu
ip
ping
ip-address
George Duckett
źródło
źródło
ping 192.168.072
drukujePING 192.168.072 (192.168.0.58) 56(84) bytes of data.
[...].192.168.0.58
aby uzyskać odpowiedź. Jakie są tego szanse?192.168.0.58
upłynął limit czasu dla mnie .. czy wszystkie żądania ping mogły w jakiś sposób powalić serwer ?!Odpowiedzi:
Wszyscy nadmiernie komplikują to za pomocą RFC, klas IP i tym podobnych. Wystarczy uruchomić kilka testów, aby zobaczyć, w jaki sposób
ping
polecenie analizuje dane wejściowe IP użytkownika (usunięte zewnętrzne plewy):Jak widać,
ping
polecenie (w systemie Windows) pozwala używać różnych formatów adresów IP. Adres IPv4 można podzielić na cztery części („kropkowane-kwadraty”) w następujący sposób:,A.B.C.D
aping
polecenie pozwala ci je pominąć, wypełniając następujące wartości domyślne0
:Jeśli podasz tylko jedną część, to jeśli jest ona mniejsza niż 255 (maksymalna dla oktetu), jest traktowana jak oktet jak powyżej, ale jeśli jest większa niż 255, to jest konwertowana i przenoszona do następnego pola (tj
mod 256
.).Istnieje kilka przypadków krawędzi, takie jak dostarczanie więcej niż cztery części nie wydają się działać (np pingowanie
google.com
„s IP nie będzie działać albo0.74.125.226.4
albo74.125.226.4.0
).Możesz także użyć notacji szesnastkowej zarówno w formie kropkowanej, jak i płaskiej, ale musisz ją sformatować, oczekując
0x
na każdy oktet.Istnieje wiele sposobów reprezentowania adresu IP (IPv4). Możesz użyć formatu płaskiego lub czterokrotnie z kropką (lub potrójnego z kropkami, podwójnego z kropkami lub nawet pojedynczego z kropkami), a dla każdego z nich możesz użyć (lub nawet mieszać i dopasowywać) dziesiętny, ósemkowy i szesnastkowy. Na przykład możesz pingować
google.com
na następujące sposoby:google.com
(Nazwa domeny)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
(ಠ_ಠ)(Dzięki Bogu, że obsługa notacji binarnych nie została dodana!)
Zastosowanie :
W twoim przypadku ping
192.168.072
używa trzeciego formatu z powyższej tabeli (A.B.0.C
), więc faktycznie pingujesz192.168.0.072
. Ponadto, ponieważ w ostatnim fragmencie znajduje się zero wiodące, traktowane jest ono jako ósemkowe, które w systemie dziesiętnym wynosi 58.Zagadka rozwiązana.
Zauważ, że chociaż
ping
polecenie systemu Windows pozwala na tak szeroką gamę formatów wejściowych i interpretuje niestandardowe formaty w widzialny sposób, niekoniecznie oznacza to, że możesz używać takich formatów wszędzie. Niektóre programy mogą wymusić podanie wszystkich czterech części kwadratu kropkowanego, inne mogą nie zezwalać na mieszanie i dopasowywanie liczb dziesiętnych i ósemkowych itd.Ponadto adresy IPv6 dodatkowo komplikują logikę analizy i akceptację formatu wejściowego.
Dodatek :
syss zwrócił uwagę, że jeśli użyjesz nieprawidłowego znaku w jednej z liczb (np. a
8
lub9
przy użyciu ósemki,g
w trybie szesnastkowym itp.), toping
jest wystarczająco inteligentny, aby rozpoznać to i zinterpretować jako ciąg (-al? -ic?) URL zamiast liczbowego adresu IP.(Jako ktoś, kto miał wiele tętniaków i zawałów serca, próbując napisać rzekomo „prosty” kod, aby pomieścić wykładniczo eksplodującą liczbę permutacji wartości danych, doceniam, że - wydaje się - poprawnie przetwarza wszystkie wariacje wejściowe; w tym przypadek, co najmniej 3 1 +3 2 +3 3 +3 4 = 120 odmian).
Tak więc, podczas określania polecenia
010.020.030.040
ping8.16.24.32
zgodnie z oczekiwaniami, przekazywanie010.020.030.080
doping
będzie traktowane jak adres URL zamiast adresu IP - taki,foo.bar.baz.com
który mógłby (ale niestety nie istnieje). Innymi słowy, próbuje pingować poddomenę010
w subdomenie020
w domenie030
w domenie najwyższego poziomu080
. Jednak, ponieważ080
nie jest to prawidłowy TLD (jak.com
,.net
i ich kumple), połączenie nie powiedzie się w prawo na pierwszym etapie.To samo dzieje się,
090.010.010.010
gdy nieprawidłowy znak znajduje się w innym oktecie. Podobnie0xf.0xf.0xf.0xf
pinguje15.15.15.15
, ale0xh1.0x1.0xg0.0f
zawodzi.No cóż, myślę, że to właśnie dostajesz za brak biegłości w wielu bazach liczb.
Prawdopodobnie łatwiej i bezpieczniej jest po prostu zawsze używać adresów z 4 kropkami („40q”? „„ Quaddy-quad ”?„ „Cutie-q”?).
Więc idź i poznaj podstawy liczb . Będziesz mógł pochwalić się i być życiem imprez, a jak mówią, istnieje 10 rodzajów ludzi: tych, którzy znają binarny i tych, którzy nie.
Załóżmy nawet nie myśleć o adresach IPv6; Myślę, że to jedna ze 111 pieczęci !!!
źródło
inet_aton()
) dokumentacji są prostsze pod jednym względem - brak warunków dla „poniżej / powyżej 255”.ping
polecenie (przynajmniej w systemie Windows) jest podobne do wielu programów Microsoftu (szczególnie notorycznego) IE. Stara się być zbyt wyrozumiałym i bierze wszystko, co w niego rzucisz, i próbuje to interpretować. Tak, istnieje oficjalny dokument dotyczący formatów adresów IP, ale że nie jest to pytanie o ISO i RFC, jest praktyczne, zrobiłem coś i jest to dziwne pytanie, na które można odpowiedzieć bez uciekania się (co prawda długie, suche, nudne specyfikacje techniczne) - chociaż linkowanie do nich na wypadek, gdyby PO chciał je przeczytać, jest również dobre.chmod
. Otóż to. To jedyny dozwolony wyjątek dla ósemki. Kropka.C:\>ping 0xffffcc
Pinging 0.255.255.204 with 32 bytes of data:
Są dwa powody:
Po pierwsze, przedrostek „0” oznacza liczbę ósemkową . Ponieważ oct (072) = dec (58), 192.168.072 = 192.168.58.
Po drugie, od ostatniego do ostatniego 0 można usunąć z adresów IP jako skrót . 127.0.1 jest interpretowany jako 127.0.0.1, aw twoim przypadku 192.168.58 jest interpretowany jako 192.168.0.58.
źródło
Oprócz ważnego punktu @ neu242 dotyczącego notacji ósemkowej i obserwacji, że adresy IP można skracać, drugą ważną kwestią jest znajomość interpretacji skróconych adresów IP.
Można naiwnie zgadywać, że jeśli brakuje niektórych z czterech liczb, parser dodałby bajty wypełnione zerami na końcu (lub początku) sekwencji bajtów. Ale to nie pasuje do zachowania zgłoszonego przez OP: 192.168.072 zostało przeanalizowane jako 192.168. 0 0,58, a nie jako 192.168.58. 0 , ani 0 .192.168.58.
Najwyraźniej ping i Windows i Linux (wersja, którą wypróbowałeś i te, których próbowałem) używają czegoś równoważnego inet_aton () do analizy argumentu adresu IP. Strona podręcznika dla inet_aton () mówi:
Więc masz ...
192.168.072
pasuje do wzorca abc, więc072
(po analizie jako liczba ósemkowa) został zinterpretowany jako 16-bitowa wartość, która definiuje skrajnie prawe 2 bajty adresu binarnego, równoważne0.58
.Powyższe zasady są równoważne z informacją, że jeśli brakuje jednej z czterech liczb, potrzebne bajty wypełnione zerami są dodawane bezpośrednio przed podaną ostatnią liczbą ... nie na końcu ani na początku ciągu bajtów. (Wyrażenie tego w ten sposób działa, jeśli ostatni podany numer jest mniejszy niż 256.)
Zauważ, że nowsze wersje ping mogą nie dopuszczać tego rodzaju skrótów ani interpretacji ósemkowej. Kod źródłowy iputils 2010 (w tym ping), które znalazłem wykorzystuje inet_pton () zamiast inet_aton () do analizowania argumentów adresów IP. Strona podręcznika dla inet_pton () mówi:
źródło
inet_addr
w Winsock.Trzeba również wziąć pod uwagę, że ip może być reprezentowany przez liczby całkowite dodane razem w zależności od ich pozycji.
Oto fajna rzecz:
192.168.58 będzie 192.168.0.58, ponieważ
192.11010106 będzie również 192.168.0.58, ponieważ
3232235578 będzie również 192.168.0.58, ponieważ
źródło
1.2.3.
powoduje błąd, ponieważ analizator składni nie może znaleźć ostatniej liczby do dodania do sumy.