問題
IPアドレス:199.32.10.85、ネットマスク:255.255.255.192と設定された端末がある。この端末が所属するネットワークのネットワークアドレスを答えなさい。
CCNAなどネットワーク関連の資格試験には、このような問題が頻出されていますね。また実務においても、ネットワーク機器の設計や設定を行うためには、IPアドレスとネットマスク値からネットワークアドレスや収容できるホスト数を算出できなくてはいけません。
このような計算をするたびに、
- 「なぜ、こんなに面倒な計算をするのだろう?」
- 「誰が、こんな面倒なことを考えたのだろう?」
と思うことはありませんか?
今回のコラムでは、「ルータを作った人たち」の気持ちになって、ネットマスク、ワイルドカードマスクの仕組みを理解してみようと思います。
ネットマスク、ワイルドカードマスクの仕組みを理解する
まず、ルータにIPパケットが到着したときの動作を考えてみましょう。
- インターフェースにIPパケットが到着すると、ルータは宛先IPアドレスを読み込みます。
- 次に、ルーティングテーブルを検索し、ネクストホップのアドレスなどを調べます。
- ネクストホップの方向へIPパケットを転送します。
この動作をパケットが到着するたびに行うわけですから、当然ながらなるべく簡単な方法(CPU負荷の低い処理方法)で実現できたほうが、ルータの性能が向上しますね。
さらに、上記の2.の処理の詳細について考えてみましょう。
たとえば、ルーティングテーブルに「199.32.10.64/26」の情報が記載されていたとして、宛先のIPアドレスが「199.32.10.85」のパケットが到着した場合、以下のような処理が行われます。
まず、ルータ(CPU)の内部では、全ての数値は2進数として処理されます。
199.32.10.85 →11000111.00100000.0001010.01010101
そして、宛先IPアドレスとネットマスクの論理積(AND)を計算します。
ここで言う"AND"とはいわゆる論理演算の一種であり、コンピュータが持っている最も基本的な能力のひとつです。論理演算については、皆さんもご存知だと思いますが、念のためANDの動作を説明します。
要は 1 AND 1 の場合だけ答えが“1”になるわけですが、別の見方をすると、
- 2番目の数値が"0"なら、答えは必ず"0"
- 2番目の数値が"1"なら、答えは1番目の数値と同じ
と言うこともできますね。
この特性によってIPアドレスとネットマスクのANDを計算すると、ネットワークアドレスを得ることができるのです。
これをルーティングテーブルに掲載されているネットワークアドレスと比較すれば良さそうですね。ちなみに、2進数の比較は排他的論理輪(XOR)を使うと簡単です。
2つの数値が同じ場合だけ、XORの結果が"0"になりますね。ですから、比較したい2進数のXORを計算し、結果が0になれば「一致」、0以外の結果になれば「不一致」と判断できます。
ANDやXORのような論理演算は、私たち人間が息をするのと同じくらい、コンピュータにとっては基本的な動作であり、ネットマスクによって、たった1回のANDを計算するだけでIPアドレスからネットワークアドレスを取得できるよう、合理的に考えられているのですね。
ワイルドカードマスク
次に、Cisco IOSのアクセスリストなどで使われる「ワイルドカードマスク」についても考えてみましょう。例として、以下のようなアクセスリストが設定されていたとします。
- (1行目)deny 199.32.10.64 0.0.0.7
- (2行目)permit 199.32.10.64 0.0.0.31
ここに、送信元が「199.32.10.85」のIPパケットが到着しました。どのような処理が行われるでしょうか?
まず、アクセスリストが設定された時点で、設定されたIPアドレスとワイルドカードマスクの論理和(OR)を算出します(ここでは、この結果を「フィルターアドレス」と呼ぶことにします)。ORの計算については、念のため、以下に示します。
ANDと逆の性質を持っていますね。フィルターアドレスの算出結果は以下のとおりです。
この例の場合、1行目のフィルターアドレスが「199.32.10.71」、2行目が「199.32.10.95」となりました。
そして、比較対象となるIPパケットが到着すると、同じように各行のワイルドカードマスクとのORを算出し、さきほどのフィルターアドレスとの比較を行います。
1行目のワイルドカードマスク「0.0.0.7」とIPアドレス「199.32.10.85」のORは「199.32.10.87」であり、さきほど算出した1行目のフィルターアドレスと一致しません。したがって、このパケットは1行目のアクセスリストにはヒットしません。
2行目は「199.32.10.95」でフィルターアドレスと一致するので、アクセスリストにマッチして、このパケットは"permit"(許可)されることになります。
ちょっと複雑でしたが、ご理解いただけましたでしょうか? ネットマスクと同様に、私たち人間には難しく感じますが、コンピュータが扱う2進数と論理演算に置き換えて考えると、とても合理的にできていることがわかると思います。
なお、ここで紹介した考え方は原始的なルータの動作原理を示したものであり、現在販売されている製品は、高速化・高機能化のためのさまざまな仕組みが追加されていますので、実際のCisco IOSがこのような内部処理を行っているわけではありません。