The Internet is a big complicated network of computers and routers passing data signals back and forth. Computers have addresses that let the signals find the right connections to their ultimate destinations.
Unfortunately there’s a bit of a snag. When this system of addresses and signaling was first worked out the designers didn’t anticipate that the Internet would get quite so big. Over the years clever people have found ways to stretch out the address space but we’ve hit a point where the Internet needs an upgrade.
That’s where IPv6 comes in. This article is a high-level look at what IPv6 is and why it’s nifty.
The numbers behind the names
Most of the time we use abstracted addresses for computers, friendly domain names that we can read and remember. You can throw “www”, “rackspace”, and “com” together with some periods and get to Rackspace’s website with a minimum of fuss.
Behind the scenes, however, computers work with a different sort of address. While we usually just see the domain names that abstract computer addresses, the computers and routers work with numerical addresses called IP addresses (IP stands for “Internet Protocol”).
The addresses most machines use are based on Internet Protocol version 4, or IPv4. In technical terms, an IPv4 address is a 32-bit address that’s comprised of four 8-bit octets.
In less-technical terms it’s four numbers from 0-255 separated by periods. An IPv4 address looks like this:
When you point a web browser to “www.example.com”, behind the scenes your computer turns that into an IP address like the above. It uses that number to navigate its way through the network and find the machine with that address.
This system has been working pretty well for decades. Over those decades clever people have been tacking features onto IPv4 to help it transfer data more efficiently.
The big problem we’re running into now is that “32 bits” means that the total IPv4 address space is a bit over 4 billion addresses. When you consider how many people and companies connect to the Internet today, and how many devices each of those people can use with the Internet (home computers, work computers, smart phones, smart cars, smart TVs, etc.), 4 billion is a relatively small number.
Small enough that the world is running out of IP addresses. We need more.
That’s where Internet Protocol version 6 comes in. The IPv6 address space is a lot bigger.
In technical terms an IPv6 address is a 128-bit address that’s comprised of 8 16-bit hextets.
In less-technical terms, IPv6 addresses look like a gobbledygook collection of numbers and letters separated by colons. There are four numbers or letters in each section and eight parts in all. An IPv6 address might look like:
That’s much uglier than IPv4. But! It’s also much bigger. The address range we expand into is beyond billions – more like a billion billion billions. The mathematical term would be “about 340 undecillion”, which means “wow that’s a whole lot of zeroes at the end”.
There are a few metaphors that have been offered up to describe how many addresses that is. “Multiple addresses for every grain of sand on the planet” is one. Short version: We won’t run out of IPv6 addresses soon.
IPv6 isn’t just about the address space though. The designers of the protocol learned from IPv4 and how it was used and extended. They applied that experience to the design of IPv6, simplifying and streamlining several aspects of the protocol. That means IPv6 should make network administrators’ jobs easier in the long run, even though the process of transitioning to IPv6 will bring them quite a few headaches before it’s done.
There was an IPv5 but it never saw widespread use. It was a more narrowly-focused streaming protocol. When network designers wanted to work on a more general replacement for IPv4 they skipped to IPv6.
So now we’re looking at two different versions of the Internet protocol and have to somehow move millions of computers on the Internet from one version to the other. That’s not going to happen overnight.
Fortunately IPv4 and IPv6 can co-exist, even if they can’t talk to each other without help. A server can be set up to accept connections from both IPv4 and IPv6 at the same time (called a dual stack) so web sites don’t need to leave any customers behind in order to support IPv6. And there are translation mechanisms that can be used to let IPv6-only networks talk to IPv4-only networks and vice versa (like NAT64 and 6in4 tunneling).
Right now the translation between a person-friendly domain name and its equivalent IP address is performed by the Domain Name System – DNS. When you use a domain name as an address your computer has a DNS server turn the domain name into an IP address.
IPv6 addresses will work the same way. You’ll still be able to use a domain name when you tell a computer to connect to another machine. The IPv6 address is just an additional record the DNS server can store for the domain name (an AAAA record, as opposed to IPv4’s A record).
Interpreting an IPv6 address
It’s useful at this point to look at the IPv6 address format and try to de-mystify it a bit.
Here’s our example IPv6 address again:
The numbers are in hexadecimal format – base 16, for the mathematicians. Zero through nine mean what you’re used to, and then “a” is 10, “b” is 11, and so on up to “f” representing 15. The important thing to know is that the letters are shorthand for higher numbers.
You might remember that each of those hextets (the clumps separated by colons) are supposed to be four numbers. But “234” is one of the hextets, and that’s just 3 numbers.
We can get away with that because a computer reading the address knows how long the address is supposed to be. We can leave out zeroes in places where the computer can extrapolate how many zeroes to fill in. The zeroes are implied.
Thus, “0234” can become “234”. The computer reading it sees the three numbers and inserts a zero at the beginning to fill it out to four numbers.
With that in mind, we can write our example address as:
We can’t leave out the trailing zeroes in those chunks of four numbers – just the ones at the beginning. It’s kind of like writing the number “10”. You could put a couple zeroes at the beginning and still be able to tell it’s 10 – “0010”. If you take out the last zero, however, you change the number entirely. It goes from “10” to “1”.
We can go even further when taking out zeroes. Since the computer knows how long the address is supposed to be you can leave out entire chunks of zeroes, putting double colons (“::”) in their place:
When a computer reads the address it will count the number of hextets, see that there are only six, and then know to fill in two “0000” chunks where the double colons are.
You can only do that once in an address. That comes back to the computer needing to be able to work out how many chunks are missing based on how long the address is supposed to be. If you left chunks out in two places:
…Then the computer wouldn’t know how many chunks of zeroes to add where. If it inserted two sets of zeroes in place of the first double colons and only one for the second it would wind up with the wrong address.
Subnets and prefixes
IPv6 addresses are usually handed out in subnets. A subnet is a chunk of consecutive IPv6 addresses with the same numbers at the beginning (the “prefix”). If you have a home network or could potentially manage several servers at a hosting provider you’ll get a subnet of IPv6 addresses from your service provider when they support it.
When we talk about a specific subnet we usually refer to it with its prefix, zeroes to mask the rest of the address (and usually double colons to shorthand all those zeroes), then a slash and the length of the prefix. So it could look like:
Yes, another notation to learn. Fortunately it’s pretty logical.
The “/64” at the end denotes a 64-bit prefix. Remember how we said that an IPv6 address is 128 bits? The 64-bit prefix, then, is the first half of the address.
Each hextet (chunk of numbers) is 16 bits (16 times 8 equals 128). With that in mind, if the prefix for our example address were 96 bits the subnet would be written as:
That’s because the first 96 bits are represented by the first 6 hextets of the address.
Once you have a subnet you can allocate the addresses in the subnet however you like, secure in the knowledge that because it’s your subnet, whatever address you pick won’t be used by anyone else in the world.
So that’s IPv6 in a nutshell: A vast address space, a different sort of address notation, and some tweaks and polish behind the scenes. Not so scary now, is it?