2017-11-20 6 views
3

入力IPサブネット間のすべてのギャップを計算する最も効率的なアルゴリズムは何ですか?IPサブネット間のギャップを計算する方法は?

例入力

192.168.1.24/29 
192.168.1.40/30 
192.168.1.64/28 

出力例

192.168.1.0/28 <--- auto-created 
192.168.1.16/29 <--- auto-created 
192.168.1.24/29 <--- INPUT 
192.168.1.32/29 <--- auto-created 
192.168.1.40/30 <--- INPUT 
192.168.1.44/30 <--- auto-created 
192.168.1.48/28 <--- auto-created 
192.168.1.64/28 <--- INPUT 
192.168.1.80/28 <--- auto-created 
192.168.1.96/27 <--- auto-created 
192.168.1.128/25 <--- auto-created 

これまで研究:入力ペアの場合

ステップ1:192.168.1.0/28、192.168.1.24/29

IPサブネットの数値表現の違いを計算しましょう:

diff = 3232235800 - 3232235776 = 24 

そして、ベース2に対数を計算する:

log2 = log2(24) = 4.58 

そして、我々は、サブネットのCIDRと長さを計算することができます

cidr = 32 - 4 = 28 
ipStart = 3232235776 
ipEnd = 3232235776 + 2^4 - 1 = 3232235776 + 15 = 3232235791 

だから我々はリストに追加します。

192.168.1.0/28 

しかしまだギャップがあります:

diff = 3232235800 - 3232235792 = 8 
log2 = log2(8) = 3 
cidr = 32-3=29 
ipStart = 3232235792 
ipEnd = 3232235799 

だから我々は、第1に追加しますように

192.168.1.16/29 

と。ただし、ギャップを見つけてサブネットを生成するより効率的な方法はありますか?

+1

これまでに何を試しましたか?あなたの発見を共有する! – MrSmith42

+0

私は少しの研究で自分の質問を編集しました。しかし私の解決策はまだまだ複雑です。 – Politechniczny

+2

「偶数」の境界線から開始しないギャップには注意してください。 192.168.1.4/30と192.168.1.24/30の間のギャップを考慮してください。これは16アドレスのギャップですが、/ 28サブネットは16で割り切れるアドレスから開始する必要があるため、そのギャップに "192.168.1.8/28"を入れることはできません。 –

答えて

0

サブネットが昇順でリストされているとします。 32桁のバイナリ文字列sと、対応するサブネットマスクの長さnを考慮します。

長さnの接頭辞を考慮してください。このプレフィックスによって表される数に1を加えることによって、次のサブネット内の最初のアドレスのプレフィックスを得る。これを見るには、接頭辞の右にあるすべてを1で埋めると想像してください。これがsのサブネットで可能な最大のアドレスであるため、次のアドレスは次のサブネットになければなりません。それに1を加えることで、サブネットマスク内のアドレスの部分に運ばれるので、それを直接考慮することができます。

これは私たちに必要なビット列を与えますが、対応するサブネットマスクの長さnはわかりません。確かに、nは少なくとも私たちが得た文字列のゼロでない数字をすべて含めるのに十分な長さでなければなりません。それ以外の場合は、現在のサブネットにアドレスを含めることが示されます。しかし、リストの次のサブネットとの重複を避けるために、さらに多くの0が必要な場合があります。新しいサブネットがリスト内の次のサブネットと少なくとも1桁、すなわち次のアドレスの最後の非ゼロ桁と異なるように、十分なゼロを保持する必要があります。

192.168.1.24/29 
192.168.1.40/30 
192.168.1.64/28 

我々は、今

11000000 10101000 00000001 00011000/29 
11000000 10101000 00000001 00101000/30 
11000000 10101000 00000001 01000000/28 

としてこれらを読んで私たちは、長さの接頭辞を考慮してこれらの

11000000 10101000 00000001 00011000/29 

の最初のを検討します:ここでは

はあなたの問題の例です29:

11000000 10101000 00000001 00011 

1を追加します。

11000000 10101000 00000001 00100 

私たちのnが私たちのリスト内の次のサブネットを考慮し、少なくとも27、それは長くする必要があるかどうかを確認するためにでなければなりません:

11000000 10101000 00000001 00101000/30 
11000000 10101000 00000001 00100 
          ^

私たちのサブネットが異なり次のサブネットの右端のゼロでない位置でもある29番目の位置にある次の位置。したがって、n = 29;先ほど作成したサブネットに同じ手順を適用した場合、私たちは、元のリストの次のサブネットに該当するとして、我々はまったく同じ接頭辞を生成見つけるだろう

11000000 10101000 00000001 00100000/29 

:。我々は新しいサブネットを作成しました私たちはこれを検出し、これがここに記入するギャップがなくなり、移動するということを認識します。

11000000 10101000 00000001 01000000/28 
11000000 10101000 00000001 001011 

11000000 10101000 00000001 001011 

は、次のサブネットに比較:長さ30のプレフィックスは1を追加

11000000 10101000 00000001 001010 

11000000 10101000 00000001 00101000/30 

ある

次のサブネットがされます

我々は選択のn = 30を最低でも、私たちは、サブネットを取得する必要があります。

11000000 10101000 00000001 00101100/30 

は、長さ30の接頭辞を考慮し、1を追加します。

11000000 10101000 00000001 001011 
+        1 
================================= 
11000000 10101000 00000001 001100 

は、次のと比較:

11000000 10101000 00000001 01000000/28 
11000000 10101000 00000001 001100 

nが28以上必要です。

11000000 10101000 00000001 00110000/28 

長さ28の部分文字列を考えてみましょう。元のリストの次のサブネットに属するものと同じビット文字列を取得します。私たちはこれがギャップを埋めるということを認識しています。

元の入力の最後を確認しているため、入力する必要はありません。コンプリート。サブネット:

11000000 10101000 00000001 00011000/29 
11000000 10101000 00000001 00100000/29 <<< 
11000000 10101000 00000001 00101000/30 
11000000 10101000 00000001 00101100/30 <<< 
11000000 10101000 00000001 00110000/28 <<< 
11000000 10101000 00000001 01000000/28 

これは、指定された入力以外のサブネット範囲を作成しないことに注意してください。そうしたい場合、アルゴリズムは最小サブネットをリストの先頭に追加し、最大サブネットをリストに追加できます。のが最大のサブネットとして最低限のサブネット広告255.255.255.255/32として0.0.0.0/1で最低限のことをやってみましょう:

00000000 00000000 00000000 00000000/1 
0 
+1 
=1 
11000000 10101000 00000001 00011000/29 
^
=> n = 2 
=> 10000000 00000000 00000000 00000000/2 <<<<<<<<< 

10000000 00000000 00000000 00000000/2 
10 
+1 
=11 
11000000 10101000 00000001 00011000/29 
     ^
=> n = 9 
=> 11000000 00000000 00000000 00000000/9 <<<<<<<<< 

11000000 00000000 00000000 00000000/9 
11000000 0 
+1 
= 11000000 1 
    11000000 10101000 00000001 00011000/29 
      ^
=> n = 11 
=> 11000000 10000000 00000000 00000000/11 <<<<<<<<< 

11000000 10000000 00000000 00000000/11 
11000000 100 
+1 
= 11000000 101 
    11000000 10101000 00000001 00011000/29 
      ^
=> n = 13 
=> 11000000 10100000 00000000 00000000/13 <<<<<<<<< 

11000000 10100000 00000000 00000000/13 
11000000 10100 
+1 
= 11000000 10101 
    11000000 10101000 00000001 00011000/29 
         ^
=> n = 24 
=> 11000000 10101000 00000000 00000000/24 <<<<<<<<< 

11000000 10101000 00000000 00000000/24 
11000000 10101000 00000000 
+1 
= 11000000 10101000 00000001 
    11000000 10101000 00000001 00011000/29 
           ^
=> n = 28 
=> 11000000 10101000 00000001 00000000/28 <<<<<<<<< 

11000000 10101000 00000001 00000000/28 
11000000 10101000 00000001 0000 
+1 
= 11000000 10101000 00000001 0001 
    11000000 10101000 00000001 00011000/29 
           ^
=> n = 29 
=> 11000000 10101000 00000001 00010000/29 <<<<<<<<< 

次のものが私たちの最初の本当の入力サブネットを提供します。サブネットは次のようになります。私たちは、もう一方の端に運動を繰り返すことができ

00000000 00000000 00000000 00000000/1 <<< 
10000000 00000000 00000000 00000000/2 <<< 
11000000 00000000 00000000 00000000/9 <<< 
11000000 10000000 00000000 00000000/11 <<< 
11000000 10100000 00000000 00000000/13 <<< 
11000000 10101000 00000000 00000000/24 <<< 
11000000 10101000 00000001 00000000/28 <<< 
11000000 10101000 00000001 00010000/29 <<< 

11000000 10101000 00000001 00011000/29 
11000000 10101000 00000001 00100000/29 <<< 
11000000 10101000 00000001 00101000/30 
11000000 10101000 00000001 00101100/30 <<< 
11000000 10101000 00000001 00110000/28 <<< 
11000000 10101000 00000001 01000000/28 

:それは単調得るために起こっているので

11000000 10101000 00000001 01000000/28 
11000000 10101000 00000001 0100 
+1 
= 11000000 10101000 00000001 0101 
    11111111 11111111 11111111 11111111 
           ^
=> n = 28 (must include rightmost 1 of s + 1) 
=> 11000000 10101000 00000001 01010000/28 <<<<<<< 

11000000 10101000 00000001 01010000/28 
11000000 10101000 00000001 0101 
+1 
= 11000000 10101000 00000001 0110 
    11111111 11111111 11111111 11111111 
          ^
=> n = 27 
=> 11000000 10101000 00000001 01100000/27 <<<<<<< 

11000000 10101000 00000001 01100000/27 
11000000 10101000 00000001 011 
+1 
= 11000000 10101000 00000001 100 
    11111111 11111111 11111111 11111111 
          ^
=> n = 25 
=> 11000000 10101000 00000001 10000000/25 <<<<<<< 

11000000 10101000 00000001 10000000/25 
11000000 10101000 00000001 1 
+1 
= 11000000 10101000 00000010 0 
    11111111 11111111 11111111 11111111 
         ^
=> n = 23 
=> 11000000 10101000 00000010 00000000/23 <<<<<<< 

のではなく、リストアウトすべての用語を、私たちはそのとき、私たちに気づくことができます0の文字列を持っているなら、nを1つ減らして、左端の1つ左のスペースを左に移動させます。そこで、私たちは先に進む:01^kは10^kになり、nはkだけ減少する。私たちは再び

=> 11000000 10110000 00000000 00000000/12 <<<<<<< 
=> 11000000 11000000 00000000 00000000/10 <<<<<<< 
=> 11000001 00000000 00000000 00000000/8  <<<<<<< 

戻る#1を支配するために追加進ん:

=> 11000010 00000000 00000000 00000000/7  <<<<<<< 
=> 11000100 00000000 00000000 00000000/6  <<<<<<< 
=> 11001000 00000000 00000000 00000000/5  <<<<<<< 
=> 11010000 00000000 00000000 00000000/4  <<<<<<< 

次の動き、私達は私達の範囲の終わりに一致するサブネットを取得するので、私たちは余分なゼロを含まなければなりませんそれは明確な作り:

=> 11100000 00000000 00000000 00000000/4  <<<<<<< 

私たちは本当に255.255.255.255サブネットを気にしている場合、正しい方法は、27の以上のサブネットのようなものを得るために1ずつnと、1の数を増やすことでこれを継続することです。私達はちょうど私たちは私たちの現在の状況を認識し、追加することができ、ギャップを埋めるためにしたい場合は、:

=> 11110000 00000000 00000000 00000000/4  <<<<<<<< 

これは、範囲の残りの部分をカバーしてい 255.255.255.255を含むので、それは解決策ではありません増強された問題そのものですが、ギャップを埋めるという元の問題を解決します。私たちの完全なリストは以下のとおりである:それは同じですので、代わりに前述したように2/4サブネットを持つの

00000000 00000000 00000000 00000000/1 <<< 
10000000 00000000 00000000 00000000/2 <<< 
11000000 00000000 00000000 00000000/9 <<< 
11000000 10000000 00000000 00000000/11 <<< 
11000000 10100000 00000000 00000000/13 <<< 
11000000 10101000 00000000 00000000/24 <<< 
11000000 10101000 00000001 00000000/28 <<< 
11000000 10101000 00000001 00010000/29 <<< 

11000000 10101000 00000001 00011000/29 
11000000 10101000 00000001 00100000/29 <<< 
11000000 10101000 00000001 00101000/30 
11000000 10101000 00000001 00101100/30 <<< 
11000000 10101000 00000001 00110000/28 <<< 
11000000 10101000 00000001 01000000/28 

11000000 10101000 00000001 01010000/28 <<< 
11000000 10101000 00000001 01100000/27 <<< 
11000000 10101000 00000001 10000000/25 <<< 
11000000 10101000 00000010 00000000/23 <<< 
11000000 10101000 00000100 00000000/22 <<< 
11000000 10101000 00001000 00000000/21 <<< 
11000000 10101000 00010000 00000000/20 <<< 
11000000 10101000 00100000 00000000/19 <<< 
11000000 10101000 01000000 00000000/18 <<< 
11000000 10101000 10000000 00000000/17 <<< 
11000000 10101001 00000000 00000000/16 <<< 
11000000 10101010 00000000 00000000/15 <<< 
11000000 10101100 00000000 00000000/14 <<< 
11000000 10110000 00000000 00000000/12 <<< 
11000000 11000000 00000000 00000000/10 <<< 
11000001 00000000 00000000 00000000/8 <<< 
11000010 00000000 00000000 00000000/7 <<< 
11000100 00000000 00000000 00000000/6 <<< 
11001000 00000000 00000000 00000000/5 <<< 
11010000 00000000 00000000 00000000/4 <<< 
11100000 00000000 00000000 00000000/3 <<< 

、私は、このリストには、単一/ 3サブネットを置きます。

関連する問題