用ipv6划分子网

时间:2013-12-12 10:52:10

标签: php arrays algorithm iteration ipv6

例如,我从POST ip和mask接收:

$ip = 2001:db8::1428:55ab;
$mask = 48;

我希望划分这个子网,我选择例如掩码和我想要多少个子网,例如$ mask = 50,subnets = 2

我的结果是(表中的树),如下所示:

ip                           mask         status
2001:db8::1428:55ab          48           divided
 - 2001:db8::??????          50           free
 - 2001:db8::??????          50           free

我该怎么做?需要帮助!

1 个答案:

答案 0 :(得分:1)

$mask实际上是前缀长度。它是“固定”的位数。因此/48前缀长度意味着前48位是固定的,最后(128 - 48 =)80位可用。

在IPv6中,LAN总是获得/64。这意味着使用/48得到(64 - 48 = 16位.2 16 =)65536个子网。

IPv6地址和前缀以十六进制表示。每个十六进制字符为4位。在IPv6中,:之间的每组数字都是16位。可以省略每组中的前导零。因此2001:0db8:0000:0000:0000:0000:0000:00012001:db8:0:0:0:0:0:1相同。组合::意味着该点仅为零。因此,该地址也可以写为2001:db8::1

您提供的信息有点令人困惑。您指定2001:db8::1428:55ab/48。问题是您指定IPv6地址的最后32位(1428:55ab),而桅杆指定这些位不固定。因此,我将以2001:db8:1a2b::/48为例。

前缀长度的每次增加都会将前一个前缀分成两部分。

2001:db8:1a2b::/48可以拆分为:

  • 2001:db8:1a2b::/49
  • 2001:db8:1a2b:8000::/49

2001:db8:1a2b::/49可以拆分为:

  • 2001:db8:1a2b::/50
  • 2001:db8:1a2b:4000::/50

2001:db8:1a2b:8000::/49可以拆分为:

  • 2001:db8:1a2b:8000::/50
  • 2001:db8:1a2b:c000::/50

你可以把它写成一棵树(只显示几个分支,我不想用完整的65536个子网填充页面):

  • 2001:0db8:1a2b:0000::/48
    • 2001:0db8:1a2b:0000::/49
    • 2001:0db8:1a2b:8000::/49
      • 2001:0db8:1a2b:8000::/50
        • 2001:0db8:1a2b:8000::/51
        • 2001:0db8:1a2b:a000::/51
          • 2001:0db8:1a2b:a000::/52
            • 2001:0db8:1a2b:a000::/53
            • 2001:0db8:1a2b:a800::/53
          • 2001:0db8:1a2b:b000::/52
            • 2001:0db8:1a2b:b000::/53
            • 2001:0db8:1a2b:b800::/53
      • 2001:0db8:1a2b:c000:/50

正如您所看到的那样,阅读并不容易。如果你以4的倍数划分子网会更容易,因为它匹配十六进制字符:

  • 2001:0db8:1a2b:0000::/48
    • 2001:0db8:1a2b:0000::/52
    • 2001:0db8:1a2b:1000::/52
    • 2001:0db8:1a2b:2000::/52
      • 2001:0db8:1a2b:2000::/56
        • 2001:0db8:1a2b:2000::/60
          • 2001:0db8:1a2b:2000::/64
          • 2001:0db8:1a2b:2001::/64
          • ...
          • 2001:0db8:1a2b:200f::/64
        • 2001:0db8:1a2b:2010::/60
          • 2001:0db8:1a2b:2010::/64
          • 2001:0db8:1a2b:2011::/64
          • ...
          • 2001:0db8:1a2b:201f::/64
        • ...
        • 2001:0db8:1a2b:20f0::/60
    • 2001:0db8:1a2b:3000::/52