我正在寻找一个好的算法(或代码,如果你说得比英语好),以便做到以下几点:
对于给定的IP范围(例如1.1.1.1 - 1.1.2.247),找到包含指定范围内所有IP的子网/地址的最小组合。忽略广播,子网0限制和网络类。
示例:
好奇的, 用例使用Openflow协议匹配具有最小流量的源/目标IP的任意范围上的网络流量。这种优化的需要源于硬件交换机/路由器对这些流配置的空间有限,并且编程/修改需要相对较长的时间。
答案 0 :(得分:0)
如果您将IP地址视为32位数字,则需要找到一组间隔,其间的并集是您需要填充的IP地址范围。看看你的第一个例子,我假设当你说.1你允许间隔包含.0,因为1.1.1.1/24是地址集合为1.1.1.0/24。
将IP地址作为数字处理,我将从最小的数字开始,并查找从此数字开始的最大子网,该子网不会超过结束IP地址。将此作为您的第一个子网接受,并在您刚刚介绍的范围的末尾处计算出IP地址。然后再次开始寻找从该IP地址开始的最大子网,这个子网不会太远 - 依此类推。
这是最佳的,因为可用的子网都排在2的幂上。要使用覆盖2 ^ n个地址的大型子网,必须移动到具有较低n位清除的起始地址。如果清除少于n位,则执行此操作的方法是在每个阶段选择可能的最大步长,并且每个步骤清除当前地址中的最低设置位。