在CIDR网络块中查找免费前缀

时间:2017-03-06 09:56:53

标签: java networking routing cidr

我试图找出一种方法来确定"免费前缀"在给定网络块的CIDR网络块内以及其中的分配列表。

例如:

让netblock = 10.0.0.0/22

让分配= {10.0.0.0/24,10.0.1.0/24}

什么是计算效率最高的方法来确定" free" netblocks在10.0.0.0/22之内?我需要为上面的例子输出10.0.2.0/23。

我已经尝试过研究,并且大部分都是空洞的。我想到的唯一方法(可能是由于我对网络编程经验不足)是:

  1. CIDR - > IP扩展列表
  2. 匹配公共IP并将其从列表中删除
  3. 将修改后的列表转换回CIDR表示法。
  4. 然而,这听起来效率很低(我称之为" bruteforce"方法)。

    我使用通用算法,但它不一定是Java特定的答案。

    谢谢! :)

1 个答案:

答案 0 :(得分:1)

给定一个地址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。 10.0.0.0/22中的地址y / 24,其中y> 10.0.0.0是10.0.1.0/24,10.0.2.0/24和10.0.3.0/24,或10.0.1-3.0 / 24.

另一种查看方式:删除前24位为10.0.0的所有地址

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

只需迭代重复此过程。