There is a chicken-and-egg problem with getting people to migrate to IPv6, but IPv6 shouldn’t scare anyone who is familiar with IPv4.
|IPv4 Meaning||IPv4 Address||IPv6 Short Address||IPv6 Full Address||IPv6 Meaning|
|“Everything” broadcast, or nothing at all||0.0.0.0||::||0:0:0:0:0:0:0:0||Same as IPV4|
|Local host||127.0.0.1||::1||0:0:0:0:0:0:0:1||Local host|
|Broadcast||255.255.255.255||ff02::1||ff02:0:0:0:0:0:0:1||All nodes multicast|
|Link-Local Address Range||169.254.0.0/16||fe80::/10||Link-Local Address Range|
|Reserved Private Addressing||10.0.0.0/8 192.168.0.0/16 172.16.0.0/12||fc00::/7 fec0::/10||fc00:0:0:0:0:0:0:0/7 fec0:0:0:0:0:0:0:0/10||Unique Local Addressing (ideally each user chooses a globally unique fc00::/64 prefix) (fec0::/10 is deprecated but not used for other purposes)|
|Multicast Address Range||184.108.40.206/4||ff00::/8||ff00:0:0:0:0:0:0:0/8||Multicast Address Range|
IPv4 is notated four dotted decimal-formatted octets (value of 0-255), such as
192.168.5.34 . IPv6 is formatted in hexadecimal with colon separators every two bytes:
2001:db8:0000:0000:0000:0000:0000:0001 . It is fine to leave out leading zeros in each set:
2001:db8:0:0:0:0:0:1 . For one run of zeros, two colons can represent them all:
2001:db8::1 . You can’t use two double colons because the value of the number could not then be determined. Since colons are reserved characters many places you might want to use a literal address, IPv6-aware programs accept bracketed literal IPs:
[2001:db8::1] . Hexadecimal formatting is helpful in conjunction wtih CIDR netmask notation as each hex digit is 4 bits, and each set of numbers between colons (including leading zeroes) is 16 bits.
::1 is the IPv6 equivalent to
:: is the equivalent to
ff02::1 is the closest analog to
255.255.255.255, but IPv6 uses multicasts instead of broadcasts, so various protocols may have their own multicast address rather than this “all nodes” link-local multicast address.
Routing and Subnets
Both IPv4 and IPv6 use CIDR notation for routing. It’s just that we now have 128 bits instead of 32. The smallest subnet you should see is a /64 which leaves the last 64 bits for the host address. This may sound huge, but it is intended to leave room for 64-bit globally unique identifiers. In fact stateless autoconfiguration transliterates the 48-bit MAC into a unique 64-bit Extended Unique Identifier to act as the host portion of the address. (Actually it is 63-bit since bit 7 is reserved as a flag indicating whether the EIU-64 is globally unique or not.) So far the trend seems to be to assign end users blocks of /48. Again, this may sound huge, but the goal is for a hierarchical routing system. A /48 gives a consumer 65,536 network prefixes of /64 size, so they can grow a lot and not need an unmatched block that will complicate core routing tables.
Network interface MAC addresses play a big role in local communication in both protocols. In IPv4 the ARP protocol resolves physical addresses for a given IP address. In IPv6 this is replaced by the Neighbor Discovery Protocol (NDP) which finds link-local neighbors as well as listens for router advertisements and has some other enhancements over ARP. NDP does not use MAC directly, but each IPv6 host has a link-local address whose scope is limited to the physical subnet. The end user will not use this address, but the inner workings of IPv6 use this address extensively in communicating over the link.
The IPv6 link-local communication is analagous to IPv4’s reserved
169.254.0.0/16 range of autoconfiguration addresses. An IPv4 host may assign itself an IP from this range if it has no other configuration guidance, but it can only communicate on the local subnet. On Ethernet networks the IPv6 link-local address is based on a transliteration of the 48-bit MAC, so each MAC will result in one unique global 64-bit host address following a network prefix of
fe80::/10 . Future network interfaces may have 64-bit identifiers, and IPv6 is ready for them. The analog to
arp -a is to show the neighbors; in Windows this is
netsh interface ipv6 show neighbors; in Linux this can be
ip neigh show. This will generally show you the public addresses and not the link-local addresses.
If you find yourself needing or wanting to ping or otherwise access a link-local address, you may have to specify a scope. I generally haven’t needed to use link-local addresses, but when toying around I had trouble pinging one until I specified the scope. In Windows you do this by appending a percent sign and number at the end of the address. The number is the interface number to specify the ping will happen on that interface. An example:
ping fe80::214:d1ff:fe1a:a533%11. You may also notice these scope designations when reviewing
ipconfig /all. The number is the index number of the interface as shown in
netsh interface ipv6 show interfaces.
The private address ranges of
172.16.0.0/12 were originally set aside for private networks. With the popularity of NAT many people will recognize these address ranges as their home or work LAN addresses. Although IPv6 should eliminate the need for NAT, there may still be the desire for private IPv6 networks. Unique Local Addressing defines the
fc00::/7 prefix for private use. A site should be assigned a prefix of
fcrr:rrrr:rrrr::/48 with the “r”s being a random 40-bit number. This is to avoid everybody using the same private addressing so there is no ambiguity when merging private networks, connecting private networks with VPN or having a mobile device move between private networks. If you want a private IPv6 address for your home LAN or lab, this is what you are supposed to use.
Site-local addressing is now deprecated, but you might see private addresses of the
Unicast, Broadcast, Multicast
IPv4 can do all of these, but unicasting and broadcasting make up the vast majority of IPv4 communication. IPv6 does not have the concept of broadcasting. Instead multicasting is used extensively to address a set of hosts. Multicast addresses begin with
ff00::/8 and have a few bits to designate scope. The multicast can be link-local, site-local or a number of other scopes.
The APIs for IPv4 typically work for IPv6 since their use is quite similar, so in theory the applications would not need to be changed to work over IPv6. But applications that input or store literal addresses may need to be updated to store and parse literal IPv6 addresses. Protocols such as SMB that store the source or destination address in their packets need to be updated to support IPv6 addressing or to avoid storing the address in the transported packets. (CIFS, the successor to SMB, works over IPv6.) Since IPv6 eliminates the need for NAT, many applications will be improved. VoIP and network gaming will no longer need to rely on UPnP or connection brokers since they will be able to directly address any other host on the internet.