Java 在CIDR netblock中查找免费前缀

Java 在CIDR netblock中查找免费前缀,java,networking,routing,cidr,Java,Networking,Routing,Cidr,我正试图找出一种方法来确定CIDR netblock中的“自由前缀”,给定netblock和其中的分配列表 例如: 设netblock=10.0.0.0/22 让赋值={10.0.0.0/24,10.0.1.0/24} 从10.0.0.0/22中计算出“免费”NetBlock的计算效率最高的方法是什么?对于上面的示例,我需要输出10.0.2.0/23 我试过研究,结果大部分都是空的。我想到的唯一方法(可能是由于我缺乏网络编程经验)是: CIDR->IP扩展列表 匹配常见IP并将其从列表中删除 将

我正试图找出一种方法来确定CIDR netblock中的“自由前缀”,给定netblock和其中的分配列表

例如:

设netblock=10.0.0.0/22

让赋值={10.0.0.0/24,10.0.1.0/24}

从10.0.0.0/22中计算出“免费”NetBlock的计算效率最高的方法是什么?对于上面的示例,我需要输出10.0.2.0/23

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

  • CIDR->IP扩展列表
  • 匹配常见IP并将其从列表中删除
  • 将修改后的列表转换回CIDR符号
  • 然而,这听起来相当低效(我称之为“暴力力量”方法)

    我对通用算法很满意,它不一定是Java特定的答案


    谢谢!:)

    给定一个地址x/y,当你从一组地址中减去它时,剩下的是集合a/y中的地址,其中ax

    在你的例子中,当你从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位较小的所有地址。其中每一个都可以表示为一个范围


    只需反复重复此过程。

    您的示例是一个“完美案例”,因为您的赋值分配在父块的开头,并通过位边界很好地对齐,但您最好在列表中有类似“10.0.2.111/30”的内容,在这种情况下,您将无法定义单个连续块以覆盖10.0.0.0-10.0.2.110,并且必须定义N个输出块以覆盖范围10.0.0-10.0.2.107,再加上M个输出块以覆盖范围10.0.2.112-10.0.3.255。这仍然可以做到,但这是一项更艰巨的任务(至少如果你想找到一个最优的解决方案,保持N和M尽可能小)。@zeppelin确实如此。在我的例子中,分配的大小保证总是至少是a/24,但我理解你的意思,每一个都可以表示为一个范围。情况并非总是如此,例如,如果源代码块为10.0.0.0/21,并且从中删除了10.0.5.0/24,则剩下的(低端)是10.0.0.0-1.0.4.255,不能在CIDR表示法中记为单个范围。