在 CIDR 网络块中查找空闲前缀

Find Free Prefixes within a CIDR netblock

我正在尝试找出一种方法来确定 CIDR 网络块中的 "free prefixes" 给定网络块和其中的分配列表。

例如:

让 netblock = 10.0.0.0/22

让作业 = { 10.0.0.0/24, 10.0.1.0/24 }

从 10.0.0.0/22 中找出 "free" 网络块的计算效率最高的方法是什么?我需要为上面的例子输出 10.0.2.0/23。

我尝试过研究,但大部分都是空的。我想到的唯一方法(可能是由于我对网络编程缺乏经验)是:

  1. CIDR -> IP 扩展列表
  2. 匹配常见 IP 并将其从列表中删除
  3. 将修改后的列表转换回 CIDR 表示法。

然而,这听起来效率很低(我将其称为 "bruteforce" 方法)。

我可以接受一般算法,它不一定是 Java 特定答案。

谢谢! :)

给定一个地址 x/y,当你从一组地址中减去它时,你剩下的是集合 a/y 中的地址,其中 a < x,以及设置 b/y,其中 b > x

因此,在您的示例中,当您从 10.0.0.0/22 中减去 10.0.0.0/24 时,剩下 10.0.1-3.0/24。

10.0.0.0/22 中没有地址 x/24,其中 x < 10.0.0.0。地址y/24 in 10.0.0.0/22 where y > 10.0.0.0 are 10.0.1.0/24, 10.0.2.0/24, and 10.0.3.0/24, or 10.0.1-3.0/24.

另一种看待它的方式:您要删除前 24 位为 10.0.0 的所有地址

这样就剩下所有前 24 位较大的地址,以及所有前 24 位较小的地址。每一个都可以表示为一个范围。

只需反复重复此过程即可。