今回はサブネットマスクの理解です。私も「255.0.0.0」、「255.255.0.0」、「255.255.255.0」以外のサブネットマスクだとすぐにはピンとこないのですが、理屈を抑えておけば理解は簡単です。是非仕組みを理解しましょう。

サブネットのマスクである

まず、そもそも「サブネットマスク」という言葉ですが、これは『「ネットワーク」を複数の「サブネットワーク」に分割するための「マスク」』というように私は理解しています。

ネットワークは分割される

TCP/IPのネットワークは大きく扱うこともできるのですが、ブロードキャスト(同一ネットワーク上の全てのホストに対してパケットを送る)が数多くとびかってしまい、これがネットワーク全体のパフォーマンスを下げてしまったり、ホストに対しても負荷をかけてしまったりするため、適当な大きさに「分けて」使うということをします。同時に、セキュリティ上の理由からも複数のネットワークに分けておき、ネットワークの分け目の部分でパケットのコントロールを行うようなこともあります(ファイアウォール)。

とまぁ、このようなわけでネットワークを分割するニーズがあります。

クラス、CIDR

昔はネットワークの分割方法としては以下の5つだけでした。

- クラスA(0.0.0.0-127.255.255.255)
- クラスB(128.0.0.0-191.255.255.255)
- クラスC(192.0.0.0-223.255.255.255)
- クラスD(224.0.0.0-239.255.255.255)
- クラスE(240.0.0.0-255.255.255.255)

ですが、これだとちょっと粒度が大きすぎるということで、CIDRという手法が一般的に用いられるようになりました。これはルーターがルーティングする際の情報を集約できるようにするための手法なのですが、これがそのままホスト上のTCP/IPの設定にも反映されているわけです。これによって、サブネットマスクのビット長は可変になりました。

うん。ちょっと良くわからない説明になってきてますね。今回はルーターの話は省略して、ホスト上のサブネットマスク周りの話に焦点を絞って、もうちょっと具体的に説明しようとしてみます。

IPアドレス、サブネットマスク、ネットワークアドレス

IPアドレスがあります。

- IPアドレス1 - 192.168.1.1
- IPアドレス2 – 192.168.1.130

唐突ですが、問題です。「2つのIPアドレスは同一ネットワーク上にあるでしょうか、それとも別ネットワークにあるでしょうか?」

昔なら(5つのクラスしかなかったときならば)答えは「同一ネットワーク」でした。ですが、今現在としては「サブネットマスクが提示されていないからわからない(どちらでもありうる)」ということになります。

それでは具体的にサブネットマスクを提示してみます。

- パターン1

IPアドレス1 - 192.168.1.1 / 255.255.255.0
- IPアドレス2 – 192.168.1.130 / 255.255.255.0

- パターン2

IPアドレス1 - 192.168.1.1 / 255.255.255.128
- IPアドレス2 – 192.168.1.130 / 255.255.255.128

- パターン3

IPアドレス1 - 192.168.1.1 / 255.255.255.192
- IPアドレス2 – 192.168.1.130 / 255.255.255.192

それぞれのパターンで同一ネットワークか別ネットワークにあるかわかりますでしょうか?判別するには「IPアドレスをサブネットマスクでマスクしてあげて、ネットワークアドレスを求め、それを比較する」ことが必要です。また、コンピューターの中では全て0,1で計算されているので、このあたりは2進数に変換すると非常に理解しやすくなります。2進数にしてから考えて見ます。

以下で具体的な処理の流れを説明してみます。

IPアドレス

IPアドレス、これは8ビット(オクテット)ごとにドット(.)で区切って表記されています。まずは2進数にして見ましょう。10進数から2進数への変換方法に関しても理解しているのが望ましいのですが、ここでは電卓をつかって変換しちゃいましょう。以下のように10進で入力して、2進に変換すればいいです。

image

image

10進数の1を2進数の1に変換すると、答えが「1」となり桁がたりませんが、IPアドレスは8ビットごとにくぎられていますので、左に8桁になるまで0を足します。

- 192.168.1.1

11000000.10101000.00000001.00000001

- 192.168.1.130

11000000.10101000.00000001.10000010

このようになります。是非自分でやってみてください。

サブネットマスク

次はサブネットマスクを2進数にします。こちらもIPアドレスと同じ構造になっているので、同じように2進数に変換します。

- パターン1 – 255.255.255.0

11111111.11111111.11111111.00000000

- パターン2 - 255.255.255.128

11111111.11111111.11111111.10000000

- パターン3 - 255.255.255.192

11111111.11111111.11111111.11000000

このようになります。やってみてもらって「おおなるほど」と思ってもらいたいのですが、どれもきれいに左からずっと1が連続していて、1つ0になってからは全て0が連続しています。このようにサブネットマスクというのは例外なく「1が左からいくつ並んでいるか」で表現できる数になっています。

ということはつまり、サブネットマスクでは10進数の数字として以下のどれかしか出てこないわけです。

- 0     - 00000000
- 128 - 10000000
- 192 - 11000000
- 224 - 11100000
- 240 - 11110000
- 248 - 11111000
- 252 - 11111100
- 254 - 11111110
- 255 - 11111111

どうでしょう。左側の10進数の数だけを見ていると「なんて不規則な数字がならんでるんだろう」と思うと思いますが、右の2進数に変換した結果を見ると物凄くきれいな数字であることがわかります。このくらいなら暗記してしまってもいいかもしれないですね。(私はいつまでたっても暗記できないのですが。)

#余談ですが、このあたりの数をみて「きりが良い数字だ」という人がいたら、その人は間違いなくネットワーク屋さんだと思います。

ちなみに、ここまで理解すると、いちいちサブネットマスクを「255.255.255.0」なんて書いたり言ったりする必要がないことに納得できるはずです。左からずっと1が連続しているワケですから「左から何ビット目までが1なのか」を伝えればそれで間違いようが無いわけです。なので、IPアドレスのあとに「/ビット数」をつけることでそれを表現します。つまり以下のようになります。

- パターン1

IPアドレス1 - 192.168.1.1/24
- IPアドレス2 – 192.168.1.130/24

- パターン2

IPアドレス1 - 192.168.1.1/25
- IPアドレス2 – 192.168.1.130/25

- パターン3

IPアドレス1 - 192.168.1.1/26
- IPアドレス2 – 192.168.1.130/26

ずいぶんすっきりしました。

マスク

Ipアドレスとサブネットマスクを2進数にできたら次は「マスク」です。風邪をひいたときに口にするもの・・・ではなくて、「マスキング」というやつですね。一部を隠すやつです。

- [マスキングテープ – Wikipedia](http://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B9%E3%82%AD%E3%83%B3%E3%82%B0%E3%83%86%E3%83%BC%E3%83%97)

IPアドレスに関しても一部を隠します。そうすることでネットワークアドレスが出てくるのです。具体的にやってみましょう。

- 192.168.1.1/24
- IPアドレス             11000000.10101000.00000001.00000001
- サブネットマスク     11111111.11111111.11111111.00000000
- ネットワークアドレス 11000000.10101000.00000001.00000000

上記の結果を良く見てもらいたいのですが、IPアドレスとサブネットマスクのAND演算を行ったものがネットワークアドレスになります。つまり、「サブネットマスクが1のビットはIPアドレスがそのまま、サブネットマスクが0のビットはIPアドレスがどうであろうと0」というのがネットワークアドレスになります。

ちなみにAND演算は「両方成り立っていれば(1)なら答えは1」という演算です。つまり以下のようになります。

- 1 and 1 → 1
- 1 and 0 → 0
- 0 and 1 → 0
- 0 and 0 → 0

サブネットマスクは左から何ビットかがずっと1、というパターンなので、つまり**「IPアドレスの左からxビットを取り出したものがネットワークアドレス」であり、「何ビットまでがネットワークなのかを指定するのがサブネットマスク」**です。

ついてきてますでしょうか?ここまで理解できればあとはやるだけです。

回答

- パターン1

IPアドレス1 - 192.168.1.1 / 255.255.255.0

IPアドレス             11000000.10101000.00000001.00000001
- サブネットマスク     11111111.11111111.11111111.00000000
- ネットワークアドレス 11000000.10101000.00000001.00000000

- IPアドレス2 – 192.168.1.130 / 255.255.255.0

IPアドレス              11000000.10101000.00000001.10000010
- サブネットマスク     11111111.11111111.11111111.00000000
- ネットワークアドレス 11000000.10101000.00000001.00000000

パターン1はネットワークアドレスが同一なので、「同一ネットワーク」です。

- パターン2

IPアドレス1 - 192.168.1.1 / 255.255.255.128

IPアドレス             11000000.10101000.00000001.00000001
- サブネットマスク     11111111.11111111.11111111.10000000
- ネットワークアドレス 11000000.10101000.00000001.00000000

- IPアドレス2 – 192.168.1.130 / 255.255.255.128

IPアドレス              11000000.10101000.00000001.10000010
- サブネットマスク     11111111.11111111.11111111.10000000
- ネットワークアドレス 11000000.10101000.00000001.10000000

- パターン3

IPアドレス1 - 192.168.1.1 / 255.255.255.192

IPアドレス             11000000.10101000.00000001.00000001
- サブネットマスク     11111111.11111111.11111111.11000000
- ネットワークアドレス 11000000.10101000.00000001.00000000

- IPアドレス2 – 192.168.1.130 / 255.255.255.192

IPアドレス              11000000.10101000.00000001.10000010
- サブネットマスク     11111111.11111111.11111111.11000000
- ネットワークアドレス 11000000.10101000.00000001.10000000

パターン2、パターン3はネットワークアドレスが異なるので「別ネットワーク」です。

まとめ

さて、長々と書いてしまいましたが結局のところまとめると

- IPアドレスからネットワークアドレスを生成するためにサブネットマスクがある
- IPアドレスとサブネットマスクを2進数でAND演算すればネットワークアドレスになる
- 難しいサブネットマスクがでてきたら、関数電卓で計算しよう(or そんなにパターンはないから暗記しよう)

という感じです。ネットワークが同じか、異なるかで処理ロジックは全く異なりますので、是非きちんと抑えていきましょう。