首页 文章

了解如何制定IPv6地址的权威指南

提问于
浏览
12

为了好玩,我想更好地理解IPv6地址中的构建块或元素 .

根据我的理解,以下是基础知识:

  • IPv6地址长度为128位(写为8个块,每个块有16位)

  • 每个块编码为0到0xffff之间的十六进制数字 . 可以省略前导零 .

  • 可以附加IPv4 doted-quad地址,它将占用IPv6地址的低32位 . 1:2:3:4:5:6:200.201.202.203 . (IPv4的规则与预期一致 . )

  • IPv4表示只能出现在最后 .

  • 可以使用双冒号语法来表示带有零的一个或多个块 . 1:2 :: 7:8相当于1:2:0:0:0:0:7:8 .

  • 每个IPv6地址中只能有一个双冒号,否则它在语法上是错误的 .

  • 双冒号可能出现在ip6的开头,中间或末尾,但不在IPv4点分四地址内 .

以上几点都是正确的吗?

请不要告诉我阅读RFC . 关于这个问题有几个,实际上没有一个简单的例子来描述各种编码机制 . 我相信很多人会欣赏带有示例的简单列表 .

Online testing tool 最近的在线帮助工具是http://www.dominicsayers.com/source/beta/is_email/test/,但这些消息令人困惑,实际上并没有用简单的英语说出什么是对错,为什么 . 它实际上也是为电子邮件构建的,当然可能包含IPv6地址,因此它并不完全理想 .

3 回答

  • 6

    一般来说,是的,你的观点是正确的 .

    你确定你读过RFC吗? RFC 3513, section 2.2正是你所要求的 . 它有帮助,但指出这一点,因为它可能对未来的人阅读这个问题非常有帮助 .

  • 7

    显然这是一个错字:

    可以使用双冒号语法来表示带有零的一个或多个块 . 1:2 :: 6:7相当于1:2:3:4:5:6:7:8 .

    1:2::6:7 表示 1:2:0:0:0:0:6:7 .

    我之前没有听过这个:

    双重冒号可能[不会出现]在ip4点地址中 .

    但我做了一个测试程序,似乎证实了这一点 .

    $ ./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
    

    否则我觉得你说的一切都还可以 .


    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

    带有区域ID的IPv6地址具有唯一的表示法,尽管它不是特定于地址本身的 . 在具有多个启用IPv6的接口的系统中,必须以某种方式消除链接本地地址的歧义 . 它使用“%”表示法完成 .

    FE80 :: AA%eth0是指通过eth0接口可到达的链路本地地址 . 它可以是某些平台的接口索引,FE80 :: AA%10

相关问题