Czy adresy IP z zerami wiodącymi i bez nich są takie same?


89

Mam system bezpieczeństwa, a ustawienie sieciowe pozwala tylko na trzycyfrowy adres IP. Nie mogę tego ustawić 192.168.2.100, zamiast tego muszę użyć 192.168.002.100.

Czy te dwa adresy IP są różne? Czy muszę ustawić, aby sieć LAN mojego routera była cała 192.168.xxx.xxx, aby działała poprawnie? Nie mogę znaleźć żadnych solidnych informacji na ten temat.


16
Przechodząc do poniższych odpowiedzi, 192.168.020.100 nie powinien być taki sam jak 192.168.20.100, ale może być taki sam, jeśli twój system zezwala na wprowadzanie adresów IP tylko w ten sposób (widziałem to z koparkami, gdy adres IP jest wprowadzany cyfrowo przez cyfra ze strzałkami góra-dół). - Jeśli system ma to dziwactwo nawet gdy „normalna” klawiatura jest możliwe (czyli ty może technicall wejście 192.168.2.100, ale twierdzi), to proponuję porozmawiać z dostawcą (Jak wiarygodne jest system zabezpieczenia, jeżeli jego sprawdzania poprawności danych wejściowych jest taki gówniany?)
Hagen von Eitzen,

4
To naprawdę dziwna walidacja. Zmieniłbym systemy bezpieczeństwa, jak to nawiązuje @Hagen.
Wyścigi lekkości na orbicie

2
Może to być również specyficzne dla oprogramowania. Są poprawne z wiodącymi literami „ 0s” lub bez nich , ale natknąłem się na niektóre aplikacje nieobsługujące adresu IP, który nie zawierał 3 cyfr w każdym oktecie.
ps2goat

2
Wszystkie adresy IP (v4) to tak naprawdę tylko 32 bity reprezentowane w ładny sposób. Jeśli 192.168.002.100twoje narzędzie reprezentuje 0xc0a80264/ 3232236132 / 192.168.2.100, to jest to samo.
Tim S.

1
Czy możesz zaakceptować inną odpowiedź? Ten, który zaakceptowałeś, jest naprawdę zły (lub przynajmniej niekompletny) i ma 11 głosów negatywnych.
Arjan

Odpowiedzi:


101

To zależy od narzędzia.

W większości przypadków oba będą takie same, ale nie zawsze.

Na przykład, jeśli użyjesz 3-cyfrowej liczby rozpoczynającej się od zera (lub dwucyfrowej liczby rozpoczynającej się od zera, dzięki @ Dietrich-Epp), to ping przyjmie, że liczby są ósemkowe.

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Users>ping 011.012.013.014

Pinging 9.10.11.12 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 9.10.11.12:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

37
Nie tyle ping, ale podstawowa procedura, której używainet_addr()
cde

2
Dzieje się tak również w OSX.
Johann Philipp Strathausen

21
To nie dlatego, że ma trzy cyfry, to dlatego, że liczba ma wiodące zero. Możesz to sprawdzić, próbując wykonać polecenie ping 09.09.09.09, co nie działa, ponieważ 9 nie jest poprawne ósemkowo.
Dietrich Epp

65

Zakładając, że całe oprogramowanie, którego używasz, używa poprawnie dziesiętnych kropek i podsieci, tak, są one takie same.

Na przykład 192.168.0.1 jest tylko przyjaznym zapisem dziesiętnym kropkowej wartości binarnej 11000000.10101000.00000000.00000001.

Bez względu na to, czy wpiszesz go jako 192.168.0.1, czy 192.168.000.001, oba są równe 11000000.10101000.00000000.00000001


63
Kropki są również dla wygody; prawdziwy adres IP to 11000000101010000000000000000001
cpast

14
@cpast lub jako liczba szesnastkowa:C0A80001
jfs

13
lub jako liczba ósemkowa (zaczynająca się od 0, z kropkami lub bez) np. ping 0300.0250.2.0144 dla 192.168.2.100
Sergey

15
lub jako liczba dziesiętna3232235521
oldmud0

14
Jak wskazała odpowiedź @GreenstoneWalker, wiele programów nie będzie postrzegać ich jako takich samych; liczba z wiodącym zerem (która nie zawiera cyfr 8 lub 9) będzie rozumiana jako liczba ósemkowa; dlatego 010.000.001.063 można interpretować jako „8.0.1.51” (ósemkowy 010 = dziesiętny 8; ósemkowy 063 = dziesiętny 51) zamiast „10.0.1.63”!
Doktor J

37

Zależy to od narzędzi lub funkcji używanych przez dany program do analizowania podanego adresu. Zarówno Microsoft, Linux, jak i inne systemy operacyjne używają procedury zgodnej z POSIXinet_addr() do analizowania adresów.

Wiele programów TCP / IP, takich jak Ping i FTP, używa funkcji gniazd inet_addr () do tłumaczenia ciągów adresów IP na adresy 4-bajtowe. Ta funkcja akceptuje adres IP w standardowej notacji dziesiętnej, ósemkowej i szesnastkowej.
Microsoft KB115388 Ping i FTP rozwiązują adres IP z wiodącą wartością zerową jako ósemkową

 

Funkcja inet_addr () przekształca adres hosta internetowego cp z notacji liczb i kropek IPv4 na dane binarne w sieciowej kolejności bajtów.

We wszystkich powyższych formach składniki adresu kropkowanego można podawać w postaci dziesiętnej, ósemkowej (z wiodącym 0) lub szesnastkowym z wiodącym 0X). Adresy w dowolnej z tych form są wspólnie nazywane notacjami liczb i kropek IPv4 . Formularz, który używa dokładnie czterech liczb dziesiętnych, jest nazywany notacją kropkowo-dziesiętną IPv4 (lub czasami: notacją kwadratu kropkowanego IPv4).
inet_addr (3): Procedury zmiany adresu internetowego - strona podręcznika użytkownika systemu Linux

W związku z tym twój system może wymagać trzycyfrowej notacji dziesiętnej dla każdego oktetu, ale nie jest to uniwersalne i należy zadbać o to, aby wprowadzić prawidłowy adres IP.

Oczywiście działają tylko prawidłowe liczby dla każdego typu. Poza zakresem Liczby ósemkowe, szesnastkowe lub dziesiętne również zawiodą lub spowodują problemy. Liczby ósemkowe 088, Heks 0xGG lub Dziesiętny 280 są niepoprawnymi przykładami.


3
+1 za podstawową funkcję. Aby dodać, ta funkcja spowoduje, że parsowanie IP zakończy się niepowodzeniem, jeśli poprawny bajt (np. .88) jest uzupełniony zerami, ponieważ 8 nie jest poprawną liczbą ósemkową.
Marzec Ho

W Windows XP (i wcześniej) funkcja BĘDZIE akceptować nieprawidłowe liczby ósemkowe i nadal będzie próbowała je przekonwertować. Może to prowadzić do bardzo nieoczywistych zachowań. Począwszy od systemu Vista, nieprawidłowe numery są traktowane jak nazwy domen i system Windows spróbuje je wyszukać w DNS. Co też jest dość dziwne, ale przynajmniej nie spowoduje żadnych problemów.
Tonny

@tonny, ponieważ POSIX inet_addr () zwraca -1 dla niepoprawnych wartości, które zapętlają się do 255. Nowsza procedura, jak wspomniano na stronie podręcznika systemu Linux, ma lepszą obsługę błędów.
cde

@cde Nigdy nie zadałem sobie trudu, aby zagłębić się w mechanikę inet_addr (). Wierzę ci na słowo :-)
Tonny

13

Jak zauważyli Lightness Races in Orbit i inni,

INET(3)Strona człowiek opisano inet_addri inet_atonstandardowe funkcje używane do przetwarzania „zapis IPv4 numery-kropkową na postać binarną”. To mówi

... komponenty adresu kropkowanego mogą być określone w systemie dziesiętnym, ósemkowym (z wiodącym 0) lub szesnastkowym z wiodącym 0X).

Tak więc technicznie NIE , adres IP z zerami wiodącymi nie jest (zawsze) taki sam jak adres bez zer wiodących. W twoim przypadku jednak, 192.168.2.100i 192.168.002.100są identyczne, ponieważ 002 == 2.

Każdy interfejs użytkownika, który wymaga, aby każdy komponent miał dokładnie trzy znaki, z niepoprawnie wymaganymi zerami wiodącymi, jest uszkodzony.


1
Pomysł, że wymagane są „wiodące zera” (na niektórych urządzeniach), nie wydaje się kwestionowany; Jaka jest podstawa nazwania tego „niepoprawnym wymaganiem” / „zepsutym”? Skoro narusza INET (3) / inet_addr / inet_aton? Implementacje wymagające takich zer prawdopodobnie używają innego kodu, który może komunikować się dobrze, a zatem nie jest „zepsuty”. (Widziałem, jak robią to drukarki). Czy istnieje podstawa, by stwierdzić, że strona podręcznika użytkownika INET (3) jest bardziej „odpowiednia” / jest bardziej autorytatywnym źródłem niż inne oficjalne dokumenty, takie jak RFC i inne cytowane w tym projekcie dokumentu ?
TOOGAM,

6

Niektóre implementacje uważają oktety z wiodącymi zerami jako dziesiętne, inne implementacje uważają je za ósemkowe. Dopóki oktet mieści się w zakresie od 0 do 7, nie ma to znaczenia. Na przykład 192.168.002.100interpretowano by to tak, jak 192.168.2.100w obu implementacjach.

Ale jeśli było wpisać adres jak 192.168.010.100mogłoby to być interpretowane jako albo 192.168.10.100czy 192.168.8.100w zależności od implementacji. Nie jest również mało prawdopodobne, że istnieją implementacje, które uznają zera wiodące za błąd składniowy. Ponadto istnieją scenariusze, w których oprogramowanie może nalegać na konieczność użycia reprezentacji kanonicznej z tego czy innego powodu. Z tych wszystkich powodów zalecamy unikanie początkowych zer podczas pisania adresu IP.

Jeśli piszesz oprogramowanie, które musi analizować adres IP, zalecam przyjmowanie zer wiodących, ale gdy to nastąpi, wypisz ostrzeżenie do odpowiedniej lokalizacji.

Nieznacznie powiązane są implementacje, które pozwalają mieć mniej niż cztery komponenty w notacji kropkowanej. Gdy jest mniej niż cztery komponenty, ostatni komponent ma więcej niż 8 bitów, a wcześniejsze komponenty mają dokładnie 8 bitów. Na przykład 192.168.612faktycznie byłby prawidłowym sposobem pisania 192.168.2.100. Jednak ponowne użycie tej notacji nie jest zalecane.


0

Mała wskazówka: w niektórych przypadkach ważne jest stosowanie zerowych prefiksów w adresach IP. Przykładem jest Apache .htaccess odmawiaj reguł.

Jeśli użyjesz czegoś takiego

deny from 11.22.33.22

Apache jest tak głupi, że blokuje również dostęp z następujących adresów IP:

111.22.33.22

11.22.33.221

211,22.33.221

i ogólnie każdy adres IP, który zawiera 11.22.33.22

Aby mieć pewność, że nie zablokujesz adresów IP, których nie chciałeś zablokować, powinieneś użyć:

deny from 011.022.033.022

aby mieć pewność, że Apache zablokuje dostęp tylko z adresu IP 11.22.33.22.


3
Ciekawy. Czy możesz podać referencje?
Scott

Odniesieniem jest osobiste doświadczenie oraz wiele prób i błędów, po znalezieniu wielu odwiedzających zablokowanych w wyniku nieużywania zer wiodących. Innym sposobem uniknięcia błędnych zakazów jest użycie adresu IP w formacie CIDR. Na przykład 11.22.33.22/32 zamiast tylko 11.22.33.22
Nick Gar

0

bądź ostrożny z tym. to POWINNY być takie same, ale to NIE !
nie mogłem znaleźć wytłumaczenia tego, ale z całą pewnością mogę powiedzieć, że w systemach Windows i Linux adresy IP z wiodącymi zerami i bez nich NIE są takie same! może ma to związek z konwersją z innych formatów, takich jak hex lub binarny.

z mojego doświadczenia z Windows i Linuksem to nie zależy od narzędzia, ale wydaje się, że zależy od systemu operacyjnego, ponieważ mam problem z używaniem ips, takich jak 10.08.03.100:

  • Uwaga: nie można znaleźć „10.08.0.1” i 10.09.0.1
  • Uwaga: „10.010.0.1” rozwiązano do 10.8.0.1

linux / debian7 / 8: takie same wyniki z narzędziami „ping” i „snmpget”

user@test:~$ ping 10.7.0.1
PING 10.7.0.1 (10.7.0.1) 56(84) bytes of data.
^C
--- 10.7.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.07.0.1
PING 10.07.0.1 (10.7.0.1) 56(84) bytes of data.
^C
--- 10.07.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
^C
--- 10.8.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.08.0.1
**ping: unknown host 10.08.0.1**
user@test:~$ ping 10.9.0.1
PING 10.9.0.1 (10.9.0.1) 56(84) bytes of data.
^C
--- 10.9.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.09.0.1
ping: unknown host 10.09.0.1
user@test:~$ ping 10.10.0.1
PING 10.10.0.1 (10.10.0.1) 56(84) bytes of data.
^C
--- 10.10.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.010.0.1
PING 10.010.0.1 (10.8.0.1) 56(84) bytes of data.
^C
--- 10.010.0.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1001ms

Windows7 / 8/10: te same wyniki z narzędziami „ping” i „telnet”

(przepraszam, nie mam pod ręką angielskiego okna, błąd informuje, że nie można znaleźć hosta)

C:\Users\user>ping 10.7.0.1

Ping wird ausgeführt für 10.7.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.07.0.1

Ping wird ausgeführt für 10.7.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.8.0.1

Ping wird ausgeführt für 10.8.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.08.0.1
Ping-Anforderung konnte Host "10.08.0.1" nicht finden. Überprüfen Sie den Namen,

C:\Users\user>ping 10.9.0.1

Ping wird ausgeführt für 10.9.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.09.0.1
Ping-Anforderung konnte Host "10.09.0.1" nicht finden. Überprüfen Sie den Namen,

C:\Users\user>ping 10.10.0.1

Ping wird ausgeführt für 10.10.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.010.0.1

Ping wird ausgeführt für 10.8.0.1 mit 32 Bytes Daten:
STRG-C
^C

Zero wiodące często oznacza liczbę ósemkową. Rzeczywiście, liczba ósemkowa 010 jest liczbą dziesiętną 8, a 08 i 09 są niepoprawnymi liczbami ósemkowymi. Tak więc (obecnie) zaakceptowana odpowiedź przez AthomSfere jest błędna (lub przynajmniej niepełna). Zobacz jego komentarze i niektóre inne odpowiedzi.
Arjan

Ugh, obsługa 10.010.0.1 jest po prostu okropna. W systemie Microsoft Windows polecenie ping 10.070.0.1 jest traktowane jak 10.56.0.1, a 10.080.0.1 daje natychmiastowy błąd: „Żądanie ping nie może znaleźć hosta 10.080.0.1. Sprawdź nazwę i spróbuj ponownie”.
TOOGAM,

1
Tak, @TOOGAM, liczba ósemkowa 070 jest liczbą dziesiętną 56. A liczba ósemkowa 080 nie jest poprawną liczbą.
Arjan

-4

Dwa adresy IP są różne.

Jednak:

  • Ludzie na ogół uważają je za takie same.
  • Niektóre oprogramowanie uważa je za takie same.
  • Niektóre programy na niektórych platformach uznają je za różne.

Jeśli to brzmi myląco, to dlatego, że nie ma standardu określającego sposób zapisywania adresów IP, więc różni programiści w różnych momentach historii i na różnych platformach mieli różne pomysły na to, co należy zrobić.

Adresy IP są w rzeczywistości binarne, a ludzie używają kropkowanej notacji dziesiętnej do reprezentowania adresów IP. Oprogramowanie może przyjmować różne podstawy liczbowe (tj. Dziesiętne, ósemkowe, szesnastkowe) i interpretować różne rzeczy na podstawie sposobu pisania. Jak piszesz, może powiedzieć oprogramowaniu, w jakiej bazie piszesz.

Radzę: nie używaj zer wiodących, jeśli chcesz użyć kropkowanej notacji dziesiętnej. Niektóre programy uznają tę flagę za oznaczającą liczbę ósemkową. Jeśli zamierzasz wprowadzić liczbę dziesiętną, nie uzyskasz oczekiwanych wyników.

Zadałem podobne pytanie i otrzymałem kilka dobrych odpowiedzi, więc jeśli chcesz przeczytać więcej na temat RFC, znajdziesz tam dobre informacje.


-6

Powinno działać tak czy inaczej. Możesz nawet pingować przy użyciu trzycyfrowych liczb, a komputer zrozumie adres IP.

Edycja : Windows odczyta go jako ósemkowy, działa to tylko w systemie Linux.


To prawda. Kropkowany format dziesiętny, jak wiadomo, jest naprawdę tylko dla ludzi. Urządzenia w sieci nie używają tej reprezentacji adresu IP.
Patrick Seymour

1
@Brock Vond: Tak, chyba że myślę, że przypadkowo transponowałeś 186 i 168.
Patrick Seymour

6
Używanie polecenia ping z trzycyfrowymi liczbami może nie działać. Może traktować je jako ósemkowe.
Greenstone Walker

1
@LightnessRacesinOrbit Właściwie podany przykład będzie działał, nawet jeśli wyzerujesz je, przynajmniej w Windows i Debianie (nie mam Maca). Błąd / funkcja występuje tylko wtedy, gdy liczba jest wypełniona zerami, a zerowana liczba jest większa niż 7 (ponieważ liczby ósemkowe i dziesiętne byłyby identyczne). Jeśli spróbujesz wprowadzić poprawny adres dziesiętny z dopełnieniem zerowym (np. 012.034.056.078), nadal będzie próbował przetworzyć go jako liczbę ósemkową, co spowoduje awarię funkcji ping.
Marzec Ho

1
@MarchHo: Tak, wszyscy tak mówimy.
Wyścigi lekkości na orbicie

-11

Zero wiodące jest bez znaczenia. Oktety są liczbami (podstawa-10) 0-255, a nie ciągami.

Ponieważ nie jestem do końca pewien, o co pytasz (lub czy wiesz jakie pytanie zadać :)): To powiedziawszy, IP # musi znajdować się w tej samej podsieci co twoja sieć. Jeśli wybierzesz 11.12.13.14 w ramach maski podsieci 192.168.0.0, to urządzenie nie będzie mogło komunikować się z tą podsiecią ani z niej korzystać.


lol - no i def, rozumiem podsieć, a podstawowe pojęcia dotyczące sieci ... nigdy nie spotkałem produktu, który wymagałby 3 cyfr. Właśnie użyłem 11.12.13.14 jako zmiennych ... ale dziękuję :)
Brock Vond

9
-1: Nie, inet_addra setki tysięcy narzędzi, które polegają na nim podczas analizy adresów, przyjmują początkowe 0, co oznacza, że ​​bajt jest podany w notacji base-8. To prawie „bez znaczenia”.
Wyścigi lekkości na orbicie
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.