在 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。
我尝试过研究,但大部分都是空的。我想到的唯一方法(可能是由于我对网络编程缺乏经验)是:
- CIDR -> IP 扩展列表
- 匹配常见 IP 并将其从列表中删除
- 将修改后的列表转换回 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 位较小的地址。每一个都可以表示为一个范围。
只需反复重复此过程即可。
我正在尝试找出一种方法来确定 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。
我尝试过研究,但大部分都是空的。我想到的唯一方法(可能是由于我对网络编程缺乏经验)是:
- CIDR -> IP 扩展列表
- 匹配常见 IP 并将其从列表中删除
- 将修改后的列表转换回 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 位较小的地址。每一个都可以表示为一个范围。
只需反复重复此过程即可。