【问题标题】:Dividing subnets with ipv6用 ipv6 划分子网
【发布时间】:2013-12-30 17:51:04
【问题描述】:

例如,我收到了 POST ip 和掩码:

$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

我该怎么做?需要帮助!

【问题讨论】:

    标签: php arrays algorithm iteration ipv6


    【解决方案1】:

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

    在 IPv6 中,LAN 总是得到/64。这意味着使用/48,您可以获得 (64 - 48 = 16 位。216 = ) 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),而 mast 指定这些位不固定。因此,我将以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

    【讨论】:

    • 很好的解释!谢谢!你能帮我做另一个步骤吗,我收到了 $_POST 前缀长度和地址,例如地址 = 2001:db8:1a2b::, 前缀 = 48,我有编辑表单,我需要将其拆分为子网,一个可以选择子网的前缀和数量,如何在 PHP 中做到这一点?
    • 可能最简单的方法是使用inet_pton() 将其转换为二进制,然后使用其中的位。然后使用inet_ntop() 将其转换回人类可读的形式。
    猜你喜欢
    • 2023-01-28
    • 2013-10-26
    • 1970-01-01
    • 2015-04-11
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    相关资源
    最近更新 更多