L'ho scritto l'anno scorso come documento di riferimento interno quando alcuni dei nostri ingegneri si sono confusi quando gli è stato chiesto di inserire gli indirizzi IPv6 nel DNS. Non ho affrontato il DNS in modo specifico, ma la maggior parte delle preoccupazioni sembrava riguardare il formato degli indirizzi e non "capire" come funzionavano. Forse sarà utile anche per gli altri:
Quindi, la prima cosa da riconoscere è che gli indirizzi IPv6 sembrano brutti. Loro fanno.
Ma penso che sia solo perché non siamo abituati a gestirli e non capiamo cosa significano a un livello molto basso come facciamo con gli indirizzi IPv4. Penso che ci vorrà del tempo per mettersi a proprio agio con loro, ma dobbiamo iniziare da qualche parte.
Un'altra cosa importante da ricordare è che gli indirizzi IPv4 sono numeri a 32 bit e gli indirizzi IPv6 sono numeri a 128 bit. Quando un router instrada o un firewall filtra, lo fanno in base a quel numero. Come un essere umano scelga di mostrare quel numero è totalmente arbitrario ed è principalmente solo tradizione. Quindi questa intera e-mail spiega come gli umani scelgono di rappresentare questi numeri: alle macchine non importa, è tutto un pezzo per loro.
Un indirizzo IPv4 è di 32 bit o quattro byte. Quello che pensiamo come un indirizzo IP "reale" è solo il metodo che è diventato standard per rappresentare quella stringa di bit, separando i bit in 4 gruppi a 8 bit, rappresentando ogni 8 bit come un numero decimale e separando quei numeri decimali in questo un periodo. Quindi, prendi l'indirizzo IP casuale 172.30.154.249. Quando un router "pensa" a questo indirizzo IP, lo pensa davvero in questo modo:
10101100000111101001101011111001
Che possiamo tradurre nella nostra forma:
10101100 = 172
00011110 = 30
10011010 = 154
11111001 = 249
A volte potresti anche vedere questi scritti come un numero decimale puro:
10101100000111101001101011111001 = 2,887,686,905
Quasi nessuno usa questo modulo apposta (*), ma è un modo storicamente valido per scrivere un indirizzo IPv4. In realtà, questo modulo viene utilizzato in RFC821 che ha definito SMTP nel 1982. Se si desidera instradare manualmente la posta verso una macchina specifica anziché utilizzare DNS, è possibile utilizzare due diversi tipi di valori letterali. Il primo era il familiare "quadretto tratteggiato" tra parentesi ("utente @ [172.30.154.249]"). Il secondo utilizzava la forma decimale dell'IP con il prefisso ("user @ # 2887686905").
Tutto quanto sopra era solo quello di fornire un framework per tradurre le tue conoscenze su come funzionano gli indirizzi IPv4 in indirizzi IPv6. Proprio come un IPv4 è un numero a 32 bit, gli indirizzi IPv6 sono numeri a 128 bit. ARIN ha assegnato a MY AWESOME COMPANY (**) la gamma IP 2311: FD67 / 32. Per avere un esempio su cui lavorare userò l'IP 2311: FD67 :: AC1E: 9AF9.
Quindi, ecco la stringa di bit che rappresenta quell'ip6:
00100011000100011111110101100111000000000000000000000000000000000000000000000000000000000000000010101100000111101001101011111001
Se rappresentassimo queste stringhe di bit nel modo in cui eseguiamo stringhe di bit IPv4 (convertiamo ogni blocco di 1 byte in decimale, separandoli con un punto), otterremmo quanto segue:
35.17.253.103.0.0.0.0.0.0.0.0.172.30.154.249
Questo ha un paio di problemi. Il primo è che sembra un numero IPv4 funky, il che non è buono, vuoi un modo solido per differenziarli. L'altro è che sono molte informazioni, molti numeri e molto spazio vuoto. Pertanto, entrambi i problemi vengono risolti utilizzando un diverso separatore (due punti (:) anziché punto (.)) E rispondendo byte in esadecimali anziché decimali. Laddove IPv4 separa blocchi di 8 bit, rappresentati in decimale, con punti, IPv6 separa blocchi di 16 bit, separati da due punti. Ecco quindi la suddivisione del nostro IP di esempio IPv6:
0010001100010001 = 2311
1111110101100111 = FD67
0000000000000000 = 0
0000000000000000 = 0
0000000000000000 = 0
0000000000000000 = 0
1010110000011110 = AC1E
1001101011111001 = 9AF9
2311:FD67:0:0:0:0:AC1E:9AF9
Questo ha ancora molto spazio bianco al suo interno, quindi c'è una tolleranza che la più grande stringa di zeri può essere omessa e rappresentata con un doppio punto. Quindi, l'IP sopra può essere scritto:
2311:FD67::AC1E:9AF9
Non l'ho visto molto, ma a quanto ho capito c'è anche una convenzione ordinata per consentire agli ultimi 32 bit di essere scritti come un quad punteggiato con prefisso, consentendo un facile riconoscimento degli indirizzi legacy durante la migrazione da IPv4 a IPv6 . Quindi, come probabilmente avrai notato, il mio indirizzo di esempio IPv6 termina con gli stessi 32 bit che comprendono interamente il mio esempio di IPv4. Ciò è particolarmente utile quando scrivi in questo stile. In tal caso, il mio indirizzo IPv6 sarebbe simile a:
2311:FD67::172.30.145.249
Per tornare indietro a dove ho iniziato con IPv6, ho detto che ci erano stati assegnati 2311: FD67 / 32. La / 32 è una maschera di bit, proprio come negli indirizzi IPv4. Significa in sostanza che ci sono stati assegnati staticamente i primi 32 dei 128 bit in un indirizzo IPv4 che potremmo creare. Dal 2311: FD67 è 32 bit, ciò significa che ogni indirizzo IP che creiamo da quell'intervallo inizierà con quello.
Per dirla in altro modo, proprio come 172.17 / 16 può essere considerato come "ogni IP tra 172.17.0.0 e 172.17.255.255", 2311: FD67 / 32 può essere considerato come "ogni IP tra 2311: FD67: 0: 0: 0: 0: 0: 0 e 2311: FD67: FFFF: FFFF: FFFF: FFFF: FFFF: FFFF ".
Penso che passerà molto tempo prima che iniziamo a migrare verso IPv6, ma spero che questa spiegazione ti aiuterà a sentirti più a tuo agio nell'utilizzarli e nel farvi riferimento.
Ancora una volta, è davvero importante capire che l'unica cosa di cui sto parlando qui è letteralmente come scrivere un indirizzo IPv6. Sembra che ci sia molta intelligenza integrata nello schema di numerazione per l'instradamento, ecc., Che non ho ancora capito, quindi tutto ciò che posso affrontare in questo momento è quello che sembra =).
(*) Ho già visto la rappresentazione decimale di IPv4 in alcuni debug di software in precedenza, ma sono quasi certo che sia stato un errore o una pigrizia, penso che sia stato molto più esagerato nel codice C stampare l'intero numero di 32 bit più rapidamente di quanto non fosse formattare un quad punteggiato per la stampa.
(**) Ho aggiunto il nome della mia azienda e il prefisso