Il ping di un indirizzo IP risponde con un IP diverso


21

Quando provo a eseguire il ping dell'indirizzo IP non 10.10.208.57ho risposta poiché non esiste nulla nella rete con quell'indirizzo IP.

Tuttavia, se provo a eseguire il ping 10.10.208.057 invece risponde un altro indirizzo IP:

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

Considerando che 10.10.208.47è una stampante Lexmark E120n quale potrebbe essere l'origine di questo strano problema?


3
Bump, guarda la risposta in questa discussione: superuser.com/questions/486788/…
Michal Sokolowski,

Risposte:


43

Tale comportamento è in realtà dovuto a una normale funzionalità di ping e non ha alcuna relazione con l'hardware effettivo.

In effetti, il prefisso dell'indirizzo IP (o parte di esso) con uno zero iniziale provocherà l'interpretazione del numero come ottale .

Quindi 057significa 57in base 8 che è 47. Pertanto ping invierà la query ICMP alla macchina situata all'indirizzo 10.10.208.47e quindi riceverà una risposta da essa.

Nota che puoi anche eseguire il ping degli indirizzi in esadecimali, utilizzando il prefisso 0x anziché solo 0.

Modifica: come molti commenti suggeriscono, questa funzione non è in realtà specifica pinge può essere trovata in molti software CLI che manipolano gli indirizzi IP.


Whoa! Grazie! Il mio cuore si è fermato per alcuni minuti :-)
PsyStyle,

4
Non solo ping. Molte cose lo fanno.
Jenny D dice di reintegrare Monica

1
Bash tratta tutti gli "interi" come quello askubuntu.com/questions/621500/…
Tim

15

Il ping, come molti altri programmi unix, utilizza le librerie C sul sistema unix per la risoluzione dei nomi. Una delle funzioni utilizzate è inet_aton.

La pagina man per inet_atondice:

Tutti i numeri forniti come `` parti '' in un `. ' la notazione può essere decimale, ottale o esadecimale, come specificato nel linguaggio C (ovvero, uno 0x o 0X iniziale implica esadecimale; altrimenti, uno 0 iniziale implica ottale; altrimenti, il numero viene interpretato come decimale).

Quindi, quando si utilizza uno zero iniziale, il numero viene interpretato come un ottale. Pertanto, 57 = 047 = 0x39.


Ho notato che anche Windows si comporta allo stesso modo. Grazie per la tua risposta dettagliata!
PsyStyle,

@PsyStyle Prego! È una notazione standard per numeri, su un ampio spettro di sistemi operativi e linguaggi di programmazione.
Jenny D dice di reintegrare Monica

"Quindi quando si utilizza uno zero iniziale, il numero viene interpretato come un decimale.". Penso che questo sia un refuso, intendevi interpretato come ottale giusto?
Cruncher,

1
Grazie @ Cruncher. Incolpo una concentrazione di sangue troppo alta nel mio flusso di caffeina.
Jenny D dice di reintegrare Monica
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.