Definitive guide to understanding how to formulate an IPv6 address

后端 未结 3 650
北荒
北荒 2021-02-08 01:03

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 a
相关标签:
3条回答
  • 2021-02-08 01:19

    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

    0 讨论(0)
  • 2021-02-08 01:20

    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 讨论(0)
  • 2021-02-08 01:31

    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.

    0 讨论(0)
提交回复
热议问题