2進数に慣れ親しんでいる人ならば、マスクとは何かすぐに分かると思う。 が、そんな人がたくさんいるとは思えないので、まずそれから説明しよう。
2進数の AND 演算には面白い効果がある。 たとえば「10101010」と「11110000」の AND を計算してみよう。
10101010 AND 11110000 ------------ 10100000
答えはちょうど、「10101010」という元の数の上位4ビットだけが、ザルの目を通って出てきたように見える。 ちょうど「11110000」という数の 1 の部分が、穴をあけた窓のような役割をして、元のデータをフィルタリングしているのだ。 このような効果を狙った演算をマスキングと呼び、穴の役割をするデータをマスクパターンとか単にマスクと呼んでいる。 マスキングは、データの中から一部を取り出すときに役立つ手法で、ごく基本的なプログラミングテクニックのひとつだし、オペレーションにおいても使うことがある (umask というコマンドがあったりする)。
IP アドレスについてもおさらいしておこう。
普通、IP アドレスといえば 192.168.52.97 のような、4つの数字をピリオドで繋いだものを言う。 実は IP アドレスの実体は32ビット(4バイト)のデータで、前述のアドレスならば「11000000 10101000 00110100 01100001」となる。
IP アドレスは、各ホストごとに別のものさえ割り当ててあれば、どんな値でもよいというわけではない。 まずネットワーク部とホスト部という、2つのブロックに分かれていることを理解しなければならない。 よく Class C のアドレスが254個といった表現を耳にするが、これはネットワーク部が24ビット、ホスト部が8ビットの IP アドレスのブロックのことを指している。
<---------network--------> <-host-> 11000000 10101000 00110100 01100001
同じネットワーク部を持つということは、各ホストが同一ネットワークに所属していることを意味する。 「192.168.52.97」と「192.168.52.103」は同じネットワーク部を持つので同一ネットワーク内だが、「192.168.54.103」は別のネットワークに属しているということが分かる。
Class C では254個までのホストを区別できるが、仮にネットワーク内にホストが3台しかないと、残りの251個のアドレスは無駄になってしまう。 そういう無駄を省くため、クラスに縛られない自由な長さのネットワーク部を設定できる仕組みが考え出された。 それがサブネットだ。 たとえばサブネット部に28ビット割り当てると、次のようになる。
host <---------network-------------><--> 11000000 10101000 00110100 01100001
これだとホスト部には4ビット残ることになる。 4ビットといえば16個分のアドレスだ (しかし0と15は予約されているので、実際に使えるのは14個だけだ)。 このように定めると、「192.168.52.97」と「192.168.52.103」は同一サブネットだが、「192.168.52.93」は別のサブネットということになる。 10進数で書くと見分けられないが、2進数で書けば簡単だ。
192.168.52.93 - 11000000 10101000 00110100 01011101 192.168.52.97 - 11000000 10101000 00110100 01100001 192.168.52.103 - 11000000 10101000 00110100 01100111
Class A とか Class C のような、ネットワーク部の長さが決まっているアドレスグループについては、アドレスを見ればどこで切ればいいのかすぐわかるので問題ない。 しかしサブネットは、手がかりがないとどこで切っていいのか分からない。 その手がかりというのがネットマスクなのだ。 ネットマスクを使って IP アドレスをマスクすると、残るのがサブネットアドレスというわけである。 28ビットのネットマスクは、最初の28ビットが1、残りの4ビットが0となっている。
address 11000000 10101000 00110100 01100001 netmask 11111111 11111111 11111111 11110000 ------------------------------------------- 11000000 10101000 00110100 01100000
マスクによって得たサブネットアドレスを比較すれば、2つのアドレスが同一ネット内か否かが決定できるわけだ。
ネットマスクは、IP アドレス同様10進数で書かれることが多い。 28ビットマスクなら、それは「255.255.255.240」となる。 一方、ネットワークアドレスと共に「192.168.52.96/28」のように、ビット数を書く場合もある。 いずれにしても、10進数で書くと切目がどこなのかよく分からないのは仕方がない。
こうして内部か外部かを判断した後どうするのかについては、ルーティングの項を参照してほしい(工事中)。