簡単ではあるが、サブネットとアドレスの計算が苦手であることがわかった。
172.16.64.64/26
172.16.64.110/26
172.16.64.70/26
このような3つのアドレスがある。同じセグメントに所属しているべきなのだが、
間違っているものはどれか、
という問題である。
サブネットを作るときには、
1. 必要なアドレス個数を決める(聞く)
2. 将来の拡張性を考える、つまりアドレスが増えそうかどうか。
3. 1,2の要件を満たすサブネットマスクを決める。
サブネットマスク長と使用できるアドレス個数は
/24=256個、/25=128個、/26=64個、/27=32個、/28=16個、/29=8個、/30=4個
(ただし、実際に使えるアドレスはマイナス2個)
/24より大きいアドレス範囲になると、
/23=512個、/22=1024個、/21=2048個、/22=4096個・・・・となる。
社員数の多い企業で利用するPCに割り当てる場合などに、/21とか/22を使用することが多い。
本来は、/24より小さいサブネットが例外というか、特別なサブネットなのであるが、
実際には/24より小さいサブネットがよく使われる。
あるネットワークに必要なノードが40個で、拡張性は考えなくてよいとすると、
適切なサブネットマスクは/26になる。
そのようなサブネットを作るなら、
172.16.0.0/26
172.16.0.64/26
172.16.0.128/26
・・・
となる。
こうして決めたサブネットから、各ノードに割り当てるアドレスを決めていく。
PC1: 172.16.0.1/26
PC2: 172.16.0.2/26
GW: 172.16.0.62/26
とか。
こういうことなら間違うことはあまりない。
が、最初にあげたように、すでに割り当てられたアドレスとマスク長から、
それが所属するサブネットはどこなのか、と判断するのはちょっと面倒だ。
/24ならいいのだが、 /26, /27, /28あたりだと。
そして、そのあたりのサブネットはよく使われる。
本題に戻る。
172.16.64.110/26 の所属するサブネットは何か。つまり、このアドレスのネットワークアドレスは何か。
パッとわかる簡単な公式は、ない(少なくとも私は知らない)。
バカ正直にやるなら、こうだ。
まず、マスク長が8, 16, 24である場合はオクテットで区切ればよい。
32はホストアドレス、ノードが一個しかないネットワークである。
それ以外である場合、つまり0~7, 9~15, 17~23, 25~31の場合は、
サブネットマスクの終端がオクテットの途中にあるから、
その場所をさがす。
マスク長が0~7の場合は第一オクテット、9~15は第二、17~23は第三、
25~31は第四オクテットの途中に終端がある。
わざわざ数式にするほどのことではないが、
あえて数式にすると、
マスク終端の存在するオクテット = マスク長 / 8 の商 + 1
マスク終端の存在するオクテット内のマスク長 = マスク長 / 8 の余り
/26なら、
26 /8 = 3 余り 2なので、
第四オクテットの2bit目までがマスク長となる。
左からマスク長個を塗りつぶす。
■■□□|□□□□
そして、計算対象のIPアドレスの、同じオクテットの値を2進数に変換する。
今回対象となるのは 110である。
先ほどのように8等分したマスを書き、
今度はその下に一番左を128とし、
その右は左の数値を1/2した値を書いていく。
(一番右に1を書いて左に2倍した値を書いていってもよい)
| | | | | | | | |
|128|64|32|16|8|4|2|1|
マスの一番左から、変換対象値とマスの下の数値をくらべて、
対象値の方が大きいか等しければマスに1を書く。
そして、対象値からマスの下の数値を引く。
①128 : 110
|128|64|32|16|8|4|2|1|
変換対象値 = 110
②64 : 110
|0 | 1| | | | | | |
|128|64|32|16|8|4|2|1|
|128|64|32|16|8|4|2|1|
変換対象値 = 110 - 64 = 46
③32 : 46
|0 | 1| 1| | | | | |
|128|64|32|16|8|4|2|1|
|128|64|32|16|8|4|2|1|
変換対象値 = 46 - 32 = 14
④16 : 14
|0 | 1| 1| 0| | | | |
|128|64|32|16|8|4|2|1|
|128|64|32|16|8|4|2|1|
変換対象値 = 14
⑤8 : 14
|0 | 1| 1| 0|1| | | |
|128|64|32|16|8|4|2|1|
|128|64|32|16|8|4|2|1|
変換対象値 = 14 - 8 = 6
⑥4 : 6
|0 | 1| 1| 0|1|1| | |
|128|64|32|16|8|4|2|1|
|128|64|32|16|8|4|2|1|
変換対象値 = 6 - 4 = 2
⑦2 : 2
|0 | 1| 1| 0|1|1|1| |
|128|64|32|16|8|4|2|1|
|128|64|32|16|8|4|2|1|
変換対象値 = 2 - 2 = 0
変換対象値が0になったら、残りのマスはすべて0になる。
⑧
|0 | 1| 1| 0|1|1|1|0|
|128|64|32|16|8|4|2|1|
|128|64|32|16|8|4|2|1|
先ほどマスク長を求めたときに書いた、8個のマスの左二つを塗りつぶしたものを、
塗りつぶした部分を1、塗りつぶしていない部分を0として2進数にする。
11000000
この2つの8桁の2進数をタテに並べる。
01101110 → アドレス
11000000 → マスク
左から1桁ずつ、上下の数値の論理積(AND)を計算して3行目に書く。
論理積とは二つの数値がともに1なら1、そうでなければ(どちらかがゼロなら)0、
となる演算である。
01101110
11000000
--------------
01000000
「論理積を取る」などとムズカシく書いたが、
アドレスの、マスクで1になっているbitがアドレス部になる、ということである。
第四オクテット(110)のアドレス部は、64であることがわかった。
172.16.64.110/26 というIPアドレスの、ネットワークアドレスは、
172.16.64.64/26
である。
同様にして、最初にあげた3つのIPアドレスの残り二つも調べると、
すべてネットワークアドレスは同じ 172.16.64.64/26 であることがわかる。
ただし、172.16.64.64/26 というアドレスはネットワークアドレス、
つまりネットワーク全体を現すアドレスなので、ノード(PCなど)に割り当てることはできない。
もし割り当てたらどうなるのか・・・
ちなみにWindows7でやってみると・・・
---------------------------
Microsoft TCP/IP
---------------------------
IP アドレスとサブネット マスクの組み合わせは有効ではありません。IP アドレスのホスト アドレス部分のビットはすべて 0 に設定されています。IP アドレスとサブネット マスクの有効な組み合わせを入力してください。
---------------------------
OK
---------------------------
というダイアログが表示されて設定できない。
(Windowsダイアログの文字列は Ctrl + Shit + C でコピーできるって知ってた?)
Ciscoルータだと
R1(config)#interface fastEthernet 0/0
R1(config-if)#ip add
R1(config-if)#ip address 172.16.64.64 255.255.255.192
Bad mask /26 for address 172.16.64.64
ちなみに、255という数字はブロードキャストアドレスとして使われるので、
/24のセグメントで 192.168.1.255/24という割り当てはできないが、
172.16.64.255/16 とかなら割り当てられる。
R1(config)#interface fastEthernet 0/0
R1(config-if)#ip address 172.16.64.255 255.255.0.0
R1(config-if)#
当たり前かも知れないけど、ちょっとハっとしたので書いておいた。
ちなみに最初にあげた問題は、
私は1番目と3番目は同じサブネットだけど2番目は違うサブネット、と答えてしまった。
なんかパっと見、64と70が近くて 110が遠かったから。
正答は「どれも間違っていない」である。