2017-03-06 6 views
0

ネットブロックとその中から割り当てられたリストを考慮して、CIDRネットブロック内の「フリープレフィックス」を判断する方法を見つけようとしています。例えばCIDRネットブロック内でフリープレフィックスを見つける

LETのネットブロック= 10.0.0.0/22

LET割り当て= {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をカバーする単一の連続ブロックを定義することはできず、10.0.0.0-10.0.2.107プラスM個の出力ブロックをカバーするN個の出力ブロックを定義する必要があります10.0.2.112-10.0.3.255をカバーする。それでもやり遂げることはできますが、(少なくとも最適な解を見つけたい場合はNとMを可能な限り小さくしてください)より難しい作業です。 @エッペリンは確かに – zeppelin

+0

です。まあ、私の場合、割り当てサイズは常に少なくとも/ 24であることが保証されていますが、私はあなたが言っていることを理解しています。 –

答えて

0

アドレスx/yを指定すると、それをアドレスの集合から減算すると、セットa/yのアドレスが返されます。ここでは、< xとセットb/y、ここでb> x

10.0.0.0/24から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/10.0.0.0のアドレスy/24は、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

関連する問題