2017-03-06 79 views
0

我試圖找出一種方法來確定給定網絡塊和分配來自其內部列表中的CIDR網塊內「自由前綴」中找到免費的前綴。一個CIDR網絡塊

例如:

設網塊= 10.0.0.0/22

設作業= {10.0.0.0/24,10.0.1.0/24}

什麼是最有效的計算從10.0.0.0/22中找出「空閒」網絡塊的方法?上面的例子需要輸出10.0.2.0/23。

我試過研究和大多拿出空。這使我的心(可能是由於我缺乏經驗與網絡編程)的唯一方法是:

  1. CIDR - > IP地址擴展
  2. 賽上常見的IP地址的列表,從列表中
  3. 刪除將修改後的列表轉換回CIDR表示法。

這聽起來相當低效(我稱之爲「暴力」方法)。

我很好的通用算法,它並沒有成爲一個Java具體的答案。

謝謝! :)

+0

你舉的例子是「完美的情況下」,因爲你的任務是在父塊開始分配,並且由位邊界對齊很好,但你可能也有類似「10.0.2.111/30」在列表中,則就不能以限定單一的連續塊以覆蓋10.0.0.0-10.0.2.110在這種情況下,將不得不定義N個輸出塊,以覆蓋範圍10.0.0.0-10.0.2.107加上M個輸出塊覆蓋10.0.2.112-10.0.3.255。這仍然可以完成,但是這是一個更難的任務(至少如果你想找到一個最佳的解決方案,保持N和M儘可能小)。 – zeppelin

+0

@zeppelin的確如此。那麼,就我而言,任務大小保證總是至少爲24,但我明白你在說什麼。 –

回答

0

給定一個地址x/y,當你從一組地址中減去它時,你剩下的是集合a/y中的地址,其中一個< x和集合b/y,其中b> X

所以在你的榜樣,留下10.0.1-3.0/24,當您從10.0.0.0/22 10.0.0.0/24減去。

沒有地址的x /在10.0.0.0/22其中x < 10.0.0.0 24。 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位較小的所有地址。每個可以表示爲一個範圍。

只需重複這個過程即可。

+0

每一個都可以表示爲一個範圍。情況並非總是如此,例如如果你的源塊是10.0.0.0/21,而你從中刪除10.0.5.0/24,最後剩下的(偏低)是10.0.0.0-1.0.4。255在CIDR表示法中不能寫成單個範圍。 – zeppelin