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


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

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

  • IPv6地址长度为128位(写为8个块,每个块有16位)
  • 每个块编码为0到0xffff之间的十六进制数字。可以省略前导零。
  • 可以附加IPv4点对四地址,它将占用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。关于这个问题有几个,实际上没有一个简单的例子来描述各种编码机制。我相信很多人会欣赏一个带有例子的简单列表。

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


12620
2018-02-04 00:56


起源

不幸的是,is_email / test程序的统治者链接被破坏了。 - Brenda J. Butler
在IPv4地址中,您可以省略中间零四边形。例如,10.0.0.248可以写成10.248。我不确定你是否可以在IPv6地址的尾端执行此操作,例如1:2:3:4:5:6:10.248。 - Brenda J. Butler


答案:


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

你确定你读过RFC吗? RFC 3513,第2.2节 正是你所要求的。对于RFC来说,它写得非常好。 =)我不禁指出这一点,因为它可能对未来读这个问题的人非常有帮助。


7
2018-02-09 05:31



我希望我阅读正确的RFC,因为有一些是相关的。 2.2确实包含了一些样本,但它不包含容易出错的任何例子...例如,它不包含带有两个空::块的ip6,并注明为什么这是错误的... - mP.
@mP,嗯,确实如此 The "::" can only appear once in an address.,但你说得对,并没有说明原因。如果你仔细想想,找出原因并不难。想象一下像这样的地址 ::1::,可以扩展到6个唯一的地址。允许两个是不明确的,并且在不明确的情况下,它将是无用的。 - mpontillo
RFC 5952,IPv6地址文本表示的建议书 已更新IPv6地址的规范文本表示的标准。 - Ron Maupin


显然这是一个错字:

可以使用双冒号语法来表示具有零的一个或多个块。 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);
        }
    }
}

6
2018-02-04 01:14



感谢拼写错误。我自己并不确定,因为有很多例外。看看电子邮件可能存在的废话 - 可以在其中嵌入评论......这可能已经过时,但为什么它被包含在我之外。我尝试编写程序,但这种黑盒测试可能会遗漏一些我不知道的奇怪情况:) - mP.
我只给了迈克的积分,因为他在官方的rfc中找到了一个片段。 - mP.
+1源代码。有时学习的最好方法就是亲自体验。 =)另外,这是对inet_pton()的一个很好的介绍,任何用C编写IPv6的人都需要知道。 - mpontillo


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

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


0
2017-12-22 01:41