L’ Internet Protocol, o più comunemente conosciuto come IP, è stato introdotto nell’ RFC 791 nel 1981.
Il primo sistema operativo ad introdurre uno stack TCP/IP completo, è stato BSD nella versione 4.2.
Dandosi come obbiettivo la scrittura di un parser di indirizzi IP corretto, vediamo alcune rappresentazioni non “comuni” possibili per specificare degli indirizzi ip; sia IPv4 che IPv6.
La forma più conosciuta è probabilmente:
- IPv4:
192.168.0.1
: Lo spazio di indirizzi IPv4 è 232 ( o 4 bytes), nella “dotted decimal notation” ogni punto (.) separa 1 byte. - IPv6:
1:2:3:4:5:6:7:8
: Lo spazio di IPv6 è 264 (o 16 bytes), con la “colon-hex” notation, ogni “due punti” (:) separa campi che rappresentano 2 bytes.
Fin qui, tutto semplice e nessuna novità.
La prima complessità nasce proprio dalla forma canonica di IPv6. L’assenza di numeri fra due colon (i due punti), indica implicitamente il valore 0 – viene utilizzato in stile padding.
Ad esempio, l’ipv4 192.168.0.1
in termini di IPv6 potremmo scriverlo come ::ffff:c0a8:1
. Questo è equivalente a 0:0:0:0:0:FFFF:C0A8:0001
.
Un modo più semplice per rappresentare un ipv4 in termini di ipv6, è usando la “Ipv4 quad-dotted notation”: ::ffff:192.168.0.1
.
Il padding dato dai due ::
funziona sia se messo l’inizio che messo alla fine, quindi:
- ::1 =
0:0:0:0:0:0:0:1
, 1::
=1:0:0:0:0:0:0:0
- Ed ovviamente :: =
0:0:0:0:0:0:0:0
Visto che ogni campo sono 4 cifre in esadecimale, la seguente notazione è anche accettabile: 0000:0000:0000:0000:0000:0000:0000:0000
.
Rappresentazioni di IPv4
Prima di IPv6, la rappresentazione testuale di IPv4 non è stata mai standardizzata. Essendo BSD 4.2 il primo sistema ad introdurre gli IP, tutto si riduce a ciò che loro hanno deciso di supportare.
Usando come esempio di ipv4: 192.168.0.1, è possibile interpretare i 4 bytes dell’ip come un big-endian intero senza segno da 32 bits, quindi:
- 192.168.0.1 in esadecimale è
0xc0a80001
.
- Questo valore in decimale è 3232235521.
- Che succede se provi a visitare http://3232235521? Il tuo browser lo sostituisce con l’indirizzo ip nel formato più comune.
E’ anche possibile utilizzare la notazione dotted quad, ma scrivendo i numeri in ottale, quindi:
- 192 in base 8 vale 0o300
- 168 in base 8 vale 0o250
- 0 e 1 non cambiano.
Il risultato è: 0300.0250.0000.0001
Ovviamente se la notazione in ottale è supportata, non poteva mancare quella in esadecimale: 0xc0.0xa8.0x00.0x01
Tecnicamente, un’ ip scritto nel formato 192.168.0.1 utilizza una notazione di Classe C. Mentre adesso abbiamo CIDR (Classless Inter-Domain Routing), iInizialmente internet era infatti suddiviso in classi di IP.
E’ in effetti possibile scrivere un indirizzo ip usando la notazione in “Classe B”: 192.168.1, o la notazione in “Classe A”: 192.11010049. Questi sono tutti formati validi per lo stesso indirizzo ip. In questi formati, a seconda della classe l’ultimo campo diventa un intero a 16 o 24 bit.
Questo è anche il motivo per cui eseguendo ad esempio “ping 127.1” è equivalente a “ping 127.0.0.1”. In questo caso infatti, il campo che contiene il valore “1” è un intero a 24 bits.
Conclusione
Conoscere questi formati di indirizzi ip può essere molto utile sopratutto se abbiamo spesso a che fare con tasks relativi al networking. In alcuni casi, la validazione di un indirizzo ip può essere davvero complicata.
Questo post è stato ispirato da questo articolo.