如何拆分 IPV6 半字节?

网络工程 子网 IPv6
2022-02-28 07:44:25

我的任务是分配 IPV6 地址,将其拆分到多个不同城市、多个不同国家/地区的多个不同大陆的数据中心。部分说明是使用“2-6-6-2”解决方案来分配这些 IP(即使有更好的解决方案我也别无选择,只能这样做),这意味着我不会在半字节上分裂边界。我的问题是,如何将其显示为 IPV6 地址?我知道在半字节边界上分割给了我 0-F 来处理每个数字,但它如何在半字节边界上不分割?如何用一位数字表示 6 位?我在网上看过,我能找到的只是在半字节边界上分割的例子。

希望这是有道理的。

2个回答

您必须以二进制计算前缀长度才能有意义。对于 2-6-6-2 解决方案,我假设您在谈论 /48 和 /64 之间的 16 位,基本上是终端站点必须从中创建子网的位。

假设您有2001:db8:1234::/48您的终端站点。这为您提供了可以2001:db8:1234:0000::/64使用2001:db8:1234:ffff::/64的子网。每个十六进制字符代表 4 位,正如您所说,您收到的模式与十六进制字符不一致(基本上是自然的 4-4-4-4 拆分)。

所以,回到二进制。只看 /48 和 /64 之间的 16 位就可以得出:

0000 0000 0000 0000  =  ..:0000::/64
1111 1111 1111 1111  =  ..:ffff::/64

现在将它们组织成您描述的 2-6-6-2 拆分。让我们写出前两位的所有组合。当然,十六进制表示法仍然基于 4 位组。我会给你前两位的每个值的第一个和最后一个地址:

00 000000 000000 00  =  0000 0000 0000 0000  =  ..:0000::/50
00 111111 111111 11  =  0011 1111 1111 1111  =  ..:3fff::/50

01 000000 000000 00  =  0100 0000 0000 0000  =  ..:4000::/50
01 111111 111111 11  =  0111 1111 1111 1111  =  ..:7fff::/50

10 000000 000000 00  =  1000 0000 0000 0000  =  ..:8000::/50
10 111111 111111 11  =  1011 1111 1111 1111  =  ..:bfff::/50

11 000000 000000 00  =  1100 0000 0000 0000  =  ..:c000::/50
11 111111 111111 11  =  1111 1111 1111 1111  =  ..:ffff::/50

让我们采取第一个::0000::3fff:. 我将为您提供第二个字段(6 位)的一些示例:

00 000000 000000 00  =  0000 0000 0000 0000  =  ..:0000::/56
00 000000 111111 11  =  0000 0000 1111 1111  =  ..:00ff::/56

00 000001 000000 00  =  0000 0001 0000 0000  =  ..:0100::/56
00 000001 111111 11  =  0000 0001 1111 1111  =  ..:01ff::/56

00 000010 000000 00  =  0000 0010 0000 0000  =  ..:0200::/56
00 000010 111111 11  =  0000 0010 1111 1111  =  ..:02ff::/56

etc, let's take some in the middle:

00 010001 000000 00  =  0001 0001 0000 0000  =  ..:1100::/56
00 010001 111111 11  =  0001 0001 1111 1111  =  ..:11ff::/56
...
00 100001 000000 00  =  0010 0001 0000 0000  =  ..:2100::/56
00 100001 111111 11  =  0010 0001 1111 1111  =  ..:21ff::/56

etc, to the last ones:

00 111101 000000 00  =  0011 1101 0000 0000  =  ..:3d00::/56
00 111101 111111 11  =  0011 1101 1111 1111  =  ..:3dff::/56

00 111110 000000 00  =  0011 1101 0000 0000  =  ..:3e00::/56
00 111110 111111 11  =  0011 1101 1111 1111  =  ..:3eff::/56

00 111111 000000 00  =  0011 1101 0000 0000  =  ..:3f00::/56
00 111111 111111 11  =  0011 1101 1111 1111  =  ..:3fff::/56

您对地址中的其他位执行相同操作。与在半字节边界上划分相比,它需要更多的思考,但在二进制中,将边界放在哪里并不重要。只是十六进制的“人类”符号变得难以阅读/解释。

您不代表一位数字中的六位。每个数字是四位。您所做的是使用 CIDR 表示法。例如,有一些用于特殊功能的 IPv6 地址范围:

  • fe80::/10 用于链接本地
  • fc00::/7 用于 ULA

它都是二进制的,就像 IPv4 中的地址不映射到八位字节边界一样。