Gli indirizzi IP con e senza zero iniziale sono uguali?


90

Ho un sistema di sicurezza e l'impostazione di rete consente solo un indirizzo IP a tre cifre. Non posso impostarlo su 192.168.2.100, invece devo usare 192.168.002.100.

Questi due indirizzi IP sono diversi? Devo impostare la LAN del mio router affinché sia ​​tutto 192.168.xxx.xxxaffinché questo funzioni correttamente? Non riesco a trovare solide informazioni al riguardo.


16
Secondo le risposte di seguito, 192.168.020.100 non dovrebbe essere lo stesso di 192.168.20.100, ma potrebbe essere lo stesso se il tuo sistema consente di inserire gli IP solo in questo modo (l'ho visto con le fotocopiatrici quando l'IP è inserito digitato da cifra con le frecce su-giù). - Se il tuo sistema ha quella stranezza anche quando è possibile un input "normale" da tastiera (ad esempio, puoi tecnicall input 192.168.2.100, ma si lamenta), allora ti suggerisco di parlare con il fornitore (Quanto è affidabile il sistema di sicurezza se la sua convalida dell'input è così schifoso?)
Hagen von Eitzen,

4
Questa è davvero una validazione piuttosto bizzarra. Passerei dai sistemi di sicurezza, come allude a @Hagen.
Razze di leggerezza in orbita

2
Anche questo può essere specifico del software. Sono validi con o senza i primi 0, ma ho incontrato alcune applicazioni che non supportano un indirizzo IP che non aveva 3 cifre in ciascun ottetto.
ps2goat,

2
Tutti gli indirizzi IP (v4) sono in realtà solo 32 bit rappresentati in modo piacevole. Se 192.168.002.100è come il tuo strumento rappresenta 0xc0a80264/ 3232236132 / 192.168.2.100, allora è la stessa cosa.
Tim S.

1
Puoi per favore accettare un'altra risposta? Quello che hai accettato è davvero sbagliato (o almeno incompleto) e ha 11 voti negativi.
Arjan,

Risposte:


102

Dipende dallo strumento.

Per la maggior parte dei casi i due saranno gli stessi, ma non sempre.

Ad esempio, se si utilizza un numero di 3 cifre che inizia con uno zero (o uno di due cifre che inizia con zero, grazie a @ Dietrich-Epp), il ping presupporrà che i numeri siano ottali.

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
Non tanto ping, ma la routine sottostante che usainet_addr()
cde

2
Succede anche su OSX.
Johann Philipp Strathausen,

21
Non è perché ha tre cifre, è perché il numero ha uno zero iniziale. Puoi provarlo provando a ping 09.09.09.09, che non funziona perché 9 non è valido in ottale.
Dietrich Epp il

65

Supponendo che tutto il software in uso stia utilizzando il punto decimale e la subnet correttamente, sì, sono uguali.

192.168.0.1, ad esempio, è solo la notazione punto-decimale amichevole del valore punto-binario 11000000.10101000.00000000.00000001.

Sia che lo digiti come 192.168.0.1 o 192.168.000.001 sono entrambi uguali a 11000000.10101000.00000000.00000001


63
I punti sono anche per comodità; il vero IP è
11000000101010000000000000000001

14
@cpast o come numero esadecimale:C0A80001
jfs

13
o come numero ottale (che inizia con 0, con o senza punti), ad esempio ping 0300.0250.2.0144 per 192.168.2.100
Sergey,

15
o come un numero decimale3232235521
oldmud0

14
Come sottolineato dalla risposta di @GreenstoneWalker, molti programmi non li percepiranno come gli stessi; un numero con uno zero iniziale (che non contiene le cifre 8 o 9) verrà inteso come un numero di notazione ottale; pertanto 010.000.001.063 verrebbe interpretato come "8.0.1.51" (ottale 010 = decimale 8; ottale 063 = decimale 51) anziché "10.0.1.63"!
Doktor J,

37

Dipende dagli strumenti o dalle funzioni utilizzate da un determinato programma per analizzare l'indirizzo indicato. Sia Microsoft che Linux e altri sistemi operativi utilizzano una routine compatibile POSIXinet_addr() per l'analisi degli indirizzi.

Molti programmi TCP / IP come Ping e FTP utilizzano la funzione socket inet_addr () per tradurre stringhe di indirizzi IP in indirizzi a 4 byte. Questa funzione accetta un indirizzo IP in notazione decimale, ottale ed esadecimale standard.
Microsoft KB115388 Ping e FTP risolvono l'indirizzo IP con zero iniziale come ottale

 

La funzione inet_addr () converte l'indirizzo host Internet cp dalla notazione di numeri e punti IPv4 in dati binari in ordine di byte di rete.

In tutte le forme precedenti, i componenti dell'indirizzo tratteggiato possono essere specificati in decimale, ottale (con uno 0 iniziale) o esadecimale, con uno 0X iniziale. Gli indirizzi in ognuna di queste forme sono definiti collettivamente numeri e punti IPv4 . Il modulo che utilizza esattamente quattro numeri decimali viene indicato come notazione decimale puntata IPv4 (o talvolta: notazione quadrata punteggiata IPv4).
inet_addr (3): routine di cambio indirizzo Internet - pagina man di Linux

Pertanto, il tuo sistema specifico potrebbe richiedere una notazione decimale a tre cifre per ogni ottetto, ma questo non è universale e si dovrebbe prestare attenzione per garantire che sia inserito l'indirizzo IP corretto.

Naturalmente, funzioneranno solo numeri validi per ogni tipo. Anche i numeri ottali, esadecimali o decimali non compresi nell'intervallo falliranno o causeranno problemi. Octal 088, Hex 0xGG o Decimal 280 sono tutti esempi non validi.


3
+1 per la funzione sottostante. Per aggiungere, questa funzione farà fallire l'analisi IP se un byte valido (es. .88) è a zero, poiché 8 non è un numero valido in ottale.
Marzo Ho

In Windows XP (e prima) la funzione accetterà numeri ottali non validi e tenterà comunque di convertirli. Questo può portare a comportamenti molto ovvi. A partire da Vista i numeri non validi vengono trattati come nomi di dominio e Windows tenterà di effettuare una ricerca DNS per questi. Anche questo è un comportamento piuttosto strano, ma che almeno non causerà problemi.
Tonny,

@tonny è perché POSIX inet_addr () restituisce -1 per valori non validi, che si aggirano intorno a 255. La routine più recente, come menzionato nella pagina man di Linux, ha una migliore gestione degli errori.
cde

@cde Non mi sono mai preso la briga di approfondire così a fondo la meccanica di inet_addr (). Prenderò la tua parola per questo :-)
Tonny

13

Come hanno sottolineato Lightness Races in Orbit e altri,

La INET(3)pagina man descrive inet_addre inet_atonle funzioni standard utilizzate per convertire la "notazione di numeri e punti IPv4 in forma binaria". Dice

... i componenti dell'indirizzo punteggiato possono essere specificati in decimale, ottale (con uno 0 iniziale) o esadecimale, con uno 0X iniziale.

Quindi tecnicamente, NO , un indirizzo IP con zeri iniziali non è (sempre) uguale a uno senza zeri iniziali. Nel tuo caso però, 192.168.2.100e 192.168.002.100sono identici, perché 002 == 2.

Qualsiasi interfaccia utente che richiede che ogni componente abbia esattamente tre caratteri di lunghezza, con zeri iniziali richiesti in modo errato viene interrotta.


1
L'idea che siano richiesti "zeri iniziali" (su alcune apparecchiature) non sembra essere in discussione; Qual è la base per chiamare "errato-richiesto" / "rotto"? Proprio dal momento che viola INET (3) / inet_addr / inet_aton? Le implementazioni che richiedono tali zeri stanno probabilmente usando altro codice che può comunicare bene, quindi non essere "rotto". (Ho visto gli stampatori fare questo.) C'è una base per dire che la pagina man INET (3) è più "giusta" / una risorsa più autorevole rispetto ad altri documenti ufficiali, come RFC e altri citati da questo progetto di documento ?
TOOGAM,

6

Alcune implementazioni considerano gli ottetti con zeri iniziali come decimali, altre implementano come ottali. Finché l'ottetto è compreso tra 0 e 7, ciò non fa differenza. Quindi, ad esempio, sarebbe 192.168.002.100interpretato come 192.168.2.100in entrambe le implementazioni.

Ma se dovessi digitare un indirizzo in 192.168.010.100quanto potrebbe essere interpretato come uno 192.168.10.100o in 192.168.8.100base all'implementazione. Inoltre, non è improbabile che esistano implementazioni, che considererebbero gli zeri iniziali come un errore di sintassi. Inoltre, ci sono scenari in cui il software può insistere sulla necessità di utilizzare la rappresentazione canonica per un motivo o per l'altro. Per tutti questi motivi, ti consiglio di evitare gli zeri iniziali quando scrivi un indirizzo IP.

Se si scrive software che deve analizzare un indirizzo IP, consiglierei di accettare gli zeri iniziali, ma quando si verifica emette un avviso in una posizione appropriata.

Leggermente correlati ci sono implementazioni che consentono di avere meno di quattro componenti nella notazione punteggiata. Quando ci sono meno di quattro componenti, l'ultimo componente ha più di 8 bit e i componenti precedenti hanno esattamente 8 bit. Ad esempio 192.168.612sarebbe effettivamente un modo valido per scrivere 192.168.2.100. Ma di nuovo non è consigliabile usare quella notazione.


0

Un piccolo consiglio: in alcuni casi è importante utilizzare zero prefissi negli indirizzi IP. Un esempio, è Apache .htaccess nega le regole.

Se usi qualcosa del genere

deny from 11.22.33.22

Apache è così stupido che bloccherà anche l'accesso dai seguenti IP:

111.22.33.22

11.22.33.221

211.22.33.221

e in generale, qualsiasi indirizzo IP che includa 11.22.33.22

Quindi, solo per essere sicuro di non bloccare alcun IP che non intendevi bloccare, dovresti usare:

deny from 011.022.033.022

per essere sicuro che Apache bloccherà l'accesso solo dall'indirizzo IP 11.22.33.22.


3
Interessante. Potete fornire un riferimento per questo?
Scott,

Il riferimento è l'esperienza personale e molte prove ed errori, dopo aver trovato molti visitatori bloccati a causa del mancato utilizzo degli zeri iniziali. Un altro modo per evitare divieti errati è utilizzare l'IP in formato CIDR. Ad esempio, 11.22.33.22/32 anziché solo 11.22.33.22
Nick Gar

0

stai attento con questo. esso DOVREBBE essere lo stesso, ma è NON !
non sono riuscito a trovare una spiegazione per questo, ma posso sicuramente dire che su Windows e Linux gli indirizzi IP con e senza zero iniziale NON sono gli stessi! forse questo ha a che fare con la conversione da altri formati come esadecimale o binario.

dalla mia esperienza con Windows e Linux non dipende dallo strumento, ma dipende dal sistema operativo perché sto funzionando in qualche problema usando ips come 10.08.03.100:

  • nota: "10.08.0.1" e 10.09.0.1 non sono stati trovati
  • nota: "10.010.0.1" è stato risolto in 10.8.0.1

linux / debian7 / 8: stessi risultati con lo strumento "ping" e "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: stessi risultati con lo strumento "ping" e "telnet"

(scusate, non ho una finestra inglese a portata di mano, l'errore indica che l'host non è stato trovato)

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

Uno zero iniziale indica spesso ottale. Infatti, l'ottale 010 è 8 decimale e 08 e 09 sono numeri ottali non validi. Quindi sì, la risposta (attualmente) accettata da AthomSfere è errata (o almeno incompleta). Vedi i suoi commenti e alcune delle altre risposte.
Arjan,

Ugh, quella gestione di 10.010.0.1 è assolutamente terribile. In Microsoft Windows, il ping 10.070.0.1 è trattato come 10.56.0.1 e 10.080.0.1 fornisce un errore istantaneo, "La richiesta di ping non è riuscita a trovare l'host 10.080.0.1. Controlla il nome e riprova."
TOOGAM,

1
Sì, @TOOGAM, l'ottale 070 è decimale 56. E l'ottale 080 non è un numero valido.
Arjan,

-4

I due indirizzi IP sono diversi.

Però:

  • Le persone le considerano generalmente uguali.
  • Alcuni software li considererebbero uguali.
  • Alcuni software, su alcune piattaforme, li considereranno diversi.

Se questo sembra confuso, è perché non esiste uno standard che regola il modo in cui gli indirizzi IP dovrebbero essere scritti, quindi programmatori diversi in punti diversi della storia e su piattaforme diverse, tutti avevano idee diverse su cosa fare.

Gli indirizzi IP sono in realtà binari e le persone tendono a usare una notazione decimale puntata per rappresentare gli indirizzi IP. Il software può accettare varie basi numeriche (es. Decimale, ottale, esadecimale) e interpretare le cose in vari modi in base a come lo scrivi. Come lo scrivi può dire al software in quale base stai scrivendo.

Ti consiglio: non usare zeri iniziali se intendi usare la notazione decimale punteggiata. Alcuni software considereranno che una bandiera significa che stai inserendo un numero ottale. Se intendi inserire un numero decimale, non otterrai i risultati che ti aspetti.

Ho fatto una domanda simile e ho avuto delle buone risposte, quindi se vuoi andare a leggere su RFC, ci sono buone informazioni da avere lì.


-6

Dovrebbe funzionare in entrambi i modi. Puoi anche eseguire il ping con numeri a tre cifre e il computer capirà l'indirizzo IP.

Modifica : Windows lo leggerà come ottale, questo funziona solo per Linux.


Questo è vero. Il formato decimale puntato, come è noto, è in realtà solo per l'uomo. I dispositivi sulla rete non utilizzano questa rappresentazione di un indirizzo IP.
Patrick Seymour,

1
@Brock Vond: Sì, tranne che penso che tu abbia trasposto accidentalmente 186 e 168.
Patrick Seymour,

6
L'uso del ping con numeri a 3 cifre potrebbe non funzionare. Può trattarli come ottali.
Greenstone Walker,

1
@LightnessRacesinOrbit In realtà, l'esempio dato funzionerà anche se li azzererai, almeno in Windows e Debian (non ho un Mac). Il bug / funzione si verifica solo se il numero è a zero, e il numero a zero è maggiore di 7 (poiché ottale e decimale sarebbero identici). Se si tenta di immettere un indirizzo decimale valido con spaziatura zero (ad es. 012.034.056.078), tenterà comunque di analizzarlo come ottale, causando il fallimento della funzione ping.
Marzo Ho

1
@MarchHo: Sì, è quello che stiamo dicendo tutti.
Razze di leggerezza in orbita

-11

Lo zero iniziale non ha senso. Gli ottetti sono (base-10) numeri 0-255, non stringhe.

Dato che non sono esattamente sicuro di ciò che stai chiedendo (o che tu sappia quale domanda porre :)): Detto questo, l'IP # deve trovarsi nella stessa sottorete della tua rete. Se si seleziona 11.12.13.14 in una maschera di sottorete 192.168.0.0, quel dispositivo non sarà in grado di comunicare o utilizzare quella sottorete.


lol - no ho sicuramente capito la sottorete e i concetti di base della rete ... non ho mai incontrato un prodotto che richiedesse 3 cifre lì. Stavo solo usando l'11.12.13.14 come variabili ... ma grazie :)
Brock Vond,

9
-1: No, inet_addre le centinaia di migliaia di strumenti che si basano su di esso per l'analisi degli indirizzi assumono uno 0 iniziale per indicare che il byte è indicato nella notazione di base 8. Difficilmente "insignificante".
Razze di leggerezza in orbita,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.