从IP范围获取一组子网/地址

时间:2014-06-10 17:31:05

标签: algorithm subnet openflow space-efficiency sdn

我正在寻找一个好的算法(或代码,如果你说得比英语好),以便做到以下几点:

对于给定的IP范围(例如1.1.1.1 - 1.1.2.247),找到包含指定范围内所有IP的子网/地址的最小组合。忽略广播,子网0限制和网络类。

示例:

  • 对于1.1.1.1 - 1.1.2.1,你得到的{1.1.1.1/24,1.1.2.1}比{1.1.1.1,1.1.1.2,......,1.1.1.255,1.1更好/更小.2.1}
  • 对于1.1.1.12 - 1.1.1.31,你会得到{1.1.1.12/30,1.1.1.16/28},它比{1.1.1.12,1.1.1.13,1.1.1.14,1.1.1.15更好/更小,1.1.1.16 / 28}

好奇的, 用例使用Openflow协议匹配具有最小流量的源/目标IP的任意范围上的网络流量。这种优化的需要源于硬件交换机/路由器对这些流配置的空间有限,并且编程/修改需要相对较长的时间。

1 个答案:

答案 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位,则执行此操作的方法是在每个阶段选择可能的最大步长,并且每个步骤清除当前地址中的最低设置位。