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.