IPアドレスの計算

ping-tでCCNAの問題をやってみた。

簡単ではあるが、サブネットとアドレスの計算が苦手であることがわかった。


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目までがマスク長となる。

ここまでわかったら、下記のように8等分されたマスを書き、
左からマスク長個を塗りつぶす。

■■□□|□□□□


そして、計算対象のIPアドレスの、同じオクテットの値を2進数に変換する。
今回対象となるのは 110である。

先ほどのように8等分したマスを書き、
今度はその下に一番左を128とし、
その右は左の数値を1/2した値を書いていく。
(一番右に1を書いて左に2倍した値を書いていってもよい)

|   |  |  |  | | | | |
|128|64|32|16|8|4|2|1|

マスの一番左から、変換対象値とマスの下の数値をくらべて、
対象値の方が大きいか等しければマスに1を書く。
そして、対象値からマスの下の数値を引く。

①128 : 110

|0  |  |  |  | | | | |
|128|64|32|16|8|4|2|1|

変換対象値 = 110

②64 : 110

|0  | 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|

変換対象値 = 46 - 32 = 14

④16 : 14

|0  | 1| 1| 0| | | | |
|128|64|32|16|8|4|2|1|

変換対象値 = 14 

⑤8 : 14

|0  | 1| 1| 0|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|

変換対象値 = 6 - 4 = 2

⑦2 : 2

|0  | 1| 1| 0|1|1|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|


これで110を2進数に変換した、 01101110 という値が得られた。

先ほどマスク長を求めたときに書いた、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が遠かったから。

正答は「どれも間違っていない」である。