12
votes

For fun, I'd like to better understand the building blocks or elements that are within an IPv6 address.

Here are the basics, from my understanding:

  • IPv6 addresses are 128 bits long (written as 8 blocks, each with 16 bits)
  • Each block is encoded as hex digits between 0 and 0xffff. Leading zeroes may be omitted.
  • One can append an IPv4 doted-quad address, and it will occupy the lower 32 bits of the IPv6 address. 1:2:3:4:5:6:200.201.202.203. (The rules for the IPv4 are as expected.)
  • The IPv4 representation can only appear at the end.
  • It is possible to use double colons syntax to represent one or more blocks with zeroes. 1:2::7:8 is equivalent to 1:2:0:0:0:0:7:8.
  • Each IPv6 address may only have one double colon within it, otherwise it is syntactically wrong.
  • Double colon may appear at the beginning, middle or end of an ip6, but not within an IPv4 dotted-quad address.

Are all the above points correct?

Please don't tell me to read the RFC. There are several about this matter, and none actually comes with a few simple examples to describe the various encoding mechanisms. I'm sure many would appreciate a simple list with examples.

Online testing tool The closest online tool to help is http://www.dominicsayers.com/source/beta/is_email/test/ but the messages are confusing and it does not actually say in plain English what is right and wrong and why. It's also actually built for emails which of course may contain IPv6 addresses, so its not exactly ideal.

3
The dominicsayers link to the is_email/test program is broken, unfortunately. - Brenda J. Butler
In an IPv4 address you can omit middle zero-quads. Eg, 10.0.0.248 can be written 10.248. I'm not sure if you can do that at the tail end of an IPv6 address though, like 1:2:3:4:5:6:10.248. - Brenda J. Butler
You can only use double colons once. If any other blocks are :0000: you can shorten each to :0:. - tbc0

3 Answers

7
votes

In general, yes, your points are correct.

Are you sure you read the RFC? RFC 3513, section 2.2 has exactly what you are asking for. It's very well written, for an RFC. =) I can't help but point this out since it may be very helpful to future people reading this question.

6
votes

Obviously this bit is a typo:

it is possible to use double colons syntax to represent one or more blocks with zeroes. 1:2::6:7 is equivalent to 1:2:3:4:5:6:7:8.

1:2::6:7 means 1:2:0:0:0:0:6:7.

I hadn't heard this before:

double colon may [not appear] within an ip4 dot address.

But I made a test program, and it seems to confirm it.

$ ./testipv6 0:0:0:0:0:0:192.168.0.1
0:0:0:0:0:0:192.168.0.1: OK

$ ./testipv6 0:0:0:0:0:0:192.168::1
0:0:0:0:0:0:192.168::1: ERROR

Otherwise I think everything you said is OK.


testipv6.c

#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>

int convert(const char *addr)
{
    struct in6_addr dst;

    return inet_pton(AF_INET6, addr, (void *)&dst);
}

int main(int argc, char **argv)
{
    if (argc == 1) {
        fprintf(stderr, "Usage: testipv6 <addr>\n");
        exit(2);
    }

    while (argc > 1) {
        argc--, argv++;
        const char *addr = argv[0];

        if (convert(addr)) {
            printf("%s: OK\n", addr);
        } else {
            printf("%s: ERROR\n", addr);
        }
    }
}
0
votes

IPv6 addresses with zone ID has a unique notation though its not specific to the address itself. In a system with multiple IPv6 enabled interfaces the link local address has to be disambiguated in some way. Its done using the "%" notation.

FE80::AA%eth0 refers to the link local address reachable through the eth0 interface. It can be an interface index in some plaforms, FE80::AA%10