Un indirizzo IPv4 è un numero a 32 bit
La familiare forma puntata non è altro che quattro byte scritti in decimale. 192.168.1.1 sono i byte C0 A8 01 01, che letti come un unico numero big-endian a 32 bit danno 0xC0A80101 = 3.232.235.777. Ogni ottetto viene moltiplicato per una potenza di 256: 192×256³ + 168×256² + 1×256 + 1.
- Prendi ogni ottetto in ordine: a, b, c, d.
- Calcola a×16.777.216 + b×65.536 + c×256 + d.
- Per tornare indietro, dividi ripetutamente per 256 e tieni i resti (oppure scorri a destra di 8 e maschera con 255).
Dove si usa la forma intera
- Database:
INET_ATON()/INET_NTOA()di MySQL e il tipoinetdi PostgreSQL memorizzano e indicizzano gli indirizzi come numeri perché le query per intervallo (ip BETWEEN start AND end) siano veloci. Le tabelle GeoIP usano lo stesso trucco. - Programmazione:
inet_atonin C,ip2longin PHP,int(ipaddress.ip_address(x))in Python,binary.BigEndian.Uint32(ip.To4())in Go. - Access list e firewall, che confrontano il numero con una maschera.
Forme strane che i browser accettano
Poiché l’indirizzo è un numero, http://3232235777/ e http://0xC0A80101/ raggiungono entrambi 192.168.1.1 nella maggior parte dei browser, e 192.168.257 viene interpretato come 192.168.1.1 (l’ultima parte trabocca nell’ottetto precedente). È un modo classico di nascondere un indirizzo in un link di phishing, e una ragione per validare l’input in modo rigoroso, come fa questo strumento.
Domande
Quanto vale 192.168.1.1 come intero?
3.232.235.777 in decimale, 0xC0A80101 in esadecimale. Viene da 192×256³ + 168×256² + 1×256 + 1.
Perché memorizzare gli indirizzi IP come interi?
Un intero occupa 4 byte invece di fino a 15 caratteri, si ordina in ordine di rete e permette di verificare l’appartenenza a un intervallo con due confronti. La maggior parte dei dati GeoIP e dei firewall è memorizzata così.
Qual è il più grande intero IPv4?
4.294.967.295 (2³² − 1), cioè 255.255.255.255.
Funziona con IPv6?
Gli indirizzi IPv6 sono numeri a 128 bit e richiedono un altro strumento: usa il calcolatore IPv6, che mostra le forme espansa, compressa e binaria.
192.168.001.001 è uguale a 192.168.1.1?
Non in modo affidabile. Alcuni parser trattano un ottetto con zero iniziale come ottale (001 va bene, ma 010 varrebbe 8). Scrivi gli ottetti senza zeri iniziali per evitare l’ambiguità; questo strumento li rifiuta proprio per questo.