【问题标题】:Get a set of subnets/adresses from IP range从 IP 范围获取一组子网/地址
【发布时间】:2014-07-31 14:15:27
【问题描述】:

我正在寻找一个好的算法(或代码,如果你说得比英语好)来执行以下操作:

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

例子:

  • 对于 1.1.1.1 - 1.1.2.1,您会得到比 {1.1.1.1, 1.1.1.2, ..., 1.1.1.255, 1.1 更好/更小的 {1.1.1.1/24, 1.1.2.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 的任意范围上匹配网络流量。之所以需要这种优化,是因为硬件交换机/路由器对这些流配置的空间有限,而且编程/修改需要相对较长的时间。

【问题讨论】:

  • 没有这样的IP:1.1.2.347
  • 抱歉 347 = 247。现在我只有一组预定义的子网并枚举其余子网,但这并不总是给出最小的集
  • 你需要澄清你所说的最小是什么意思。
  • 感谢@Raedwald,已编辑。

标签: algorithm subnet openflow space-efficiency sdn


【解决方案1】:

如果您将 IP 地址视为 32 位数字,那么这就是找​​到一组区间的问题,该区间的并集是您需要填充的 IP 地址范围。查看您的第一个示例,我将假设当您说 0.1 时,您允许间隔包含 .0,因为 1.1.1.1/24 是 1.1.1.0/24 的地址集。

将 IP 地址视为数字,我将从最小的数字开始,并从该数字开始寻找最大的子网,该数字不超过最终 IP 地址。将其作为您的第一个子网并计算出刚刚覆盖的范围末尾的 IP 地址。然后重新开始寻找从该 IP 地址开始并不会走得太远的最大子网 - 依此类推。

这是最优的,因为可用的子网都按 2 的幂排列。要使用覆盖 2^n 个地址的大型子网,您必须移动到低 n 位已清除的起始地址。如果您的清除位少于 n 位,那么执行此操作的方法是在每个阶段选择可能的最大步长,并且每个步长都会清除当前地址中的最低设置位。

【讨论】:

  • 感谢@mcdowella,很好且完整的答案!我很难优化那些设置了较低位的地址。
猜你喜欢
  • 2018-03-09
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
  • 2015-10-13
  • 2016-01-15
  • 2021-12-15
  • 1970-01-01
相关资源
最近更新 更多