为了好玩,我想更好地理解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地址,因此它并不完全理想。
一般来说,是的,你的观点是正确的。
你确定你读过RFC吗? RFC 3513,第2.2节 正是你所要求的。对于RFC来说,它写得非常好。 =)我不禁指出这一点,因为它可能对未来读这个问题的人非常有帮助。
显然这是一个错字:
可以使用双冒号语法来表示具有零的一个或多个块。 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);
}
}
}
带有区域ID的IPv6地址具有唯一的表示法,尽管它不是特定于地址本身的。在具有多个启用IPv6的接口的系统中,必须以某种方式消除链接本地地址的歧义。它使用“%”表示法完成。
FE80 :: AA%的eth0 是指通过eth0接口可达的链路本地地址。
它可以是某些平台中的接口索引, FE80 :: AA 10%