php - 用ipv6划分子网

标签 php arrays algorithm iteration ipv6

例如,我从 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

我该怎么做?需要帮助!

最佳答案

$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),而桅杆指定这些位不固定。因此,我将使用 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
      • 等等

关于php - 用ipv6划分子网,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20541462/

相关文章:

javascript - Json 数组从 $_POST ['id' 增加我的 id 值]

php - Laravel 验证器 mimes 规则不适用于文档

java - 简化与数组的比较

java - 将一个数组分配给另一个数组

javascript - 键上的 JS 过滤器数组

查找排序集交集的算法

algorithm - 找到 "cover-all"路径的开始和结束位置然后连接它们

php - 使用 Controller 和操作作为查询字符串美化 url

algorithm - 在 Powershell 中打印所有 16 位二进制数的最快算法?

php - 将 CSS 规则减少到最小公分母