IPV6時代に恐縮だが、IPV4において、たとえば、
サブネットマスク 255.255.240.0
IPアドレスその1 192.168.12.126
IPアドレスその2 192.168.22.126
この1、2は、同一ネットワークに属しているか否か(ちなみに、答えは違うネットワーク)、そもそも、このサブネットマスクは、妥当か?ということを調べたい時がある。
Cなら、シフト演算をすればいいだけ。
ところが、シフト演算機能がない言語においては、めんどっちいことになる。
で、ビット演算を使わないサブネットマスクの妥当性、同一ネットワークチェックを思いついたので公開(ただし、今思いついただけで、これで本当に正しいかどうかは?。利用する場合は、自分で検証して、自己責任で使ってね!)
■概要
以下の3つの手順で行う
(1)そもそも、与えられた3つのIPアドレス(サブネットマスク、IPアドレス1、IPアドレス2)は、IPV4のアドレスとして、妥当か?
(2)サブネットマスクは、妥当か?
(3)同一ネットワーク??
以下順にみていく
■IPアドレスとして、妥当?
これは、2つの条件
・4つのパートが . で区切られている(つまり、.が3つある)
・各パートは、0から255までの整数
つまり、splitなりで、.で切って要素が4つになり、その要素を整数にして、その値が0から255の間なら良い。このとき、以下のチェックのため、4つのパートは配列などにいれておいたほうがいい。
■サブネットマスクは、妥当?
今回の例だと、
サブネットマスク 255.255.240.0
は妥当か?ということになる。
上記の操作(.で分けて配列に入れ、値範囲チェック)により
配列[0]=255
配列[1]=255
配列[2]=240
配列[3]=0
という値が入っているはずである。そのあと、以下のチェックを行う
●各パートの数字チェック
サブネットマスクの各パートの数字は、以下の数字しかありえない。
0、128、192、224、240、248、252、254、255
なので、各パートの数字がこれら以外だったら、まず、エラーになる。
●パート間の数字チェック
各パートの数字を、3種類に分けられる
(あ)255
(い)0より大きく、255より小さい
(う)0
上記例で言うと、
配列[0]=あ(255だから)
配列[1]=あ(255だから)
配列[2]=い(240は0より大きく255より小さい)
配列[3]=う(0だから)
となる。このとき、
自分の配列と次の配列(配列1と配列2など)において、
(いち )自分が(あ)なら、次の配列は、あ,い,う、どれでもよい
(にい )自分が(い)なら、次の配列は、う(かならず0)
(すあん)自分が(う)なら、次の配列は、う(かならず0)
上記例だと
配列0が(あ)のとき、つぎの配列1が(あ):法則(いち)
配列1が(あ)のとき、つぎの配列2が(い):法則(いち)
配列2が(い)のとき、つぎの配列3が(う):法則(にい)
で、OK
上記のチェックで、サブネットマスクのチェックはできる。
■同一ネットワーク?
上記サブネットワークのチェックで、各パートが(あ),(い),(う)どれに属するか決まった。
このとき、IPアドレス1、IPアドレス2の間の各パートに以下の関係があれば、同一IPアドレス。
・4つの各パートにおいて、
●サブネットマスクが(あ)=255のパートは、
そのパートのIPアドレスが、同じ数字でないといけない。
例
サブネットマスク 255.255.240.0
種類 あ あ い う
IPアドレスその1 192.168.12.126
IPアドレスその2 192.168.22.126
初めのパートは(あ)なので、192でないといけない
次のパートも(あ)なので、168でないといけない。ここまではOK
●サブネットマスクが(う)=0のパートは、
なんでもよい
上記の例だと、最後のパートが(う)で、例はたまたま126だが、126だろうが、なんだろうが、ここは決め手にはならない。
●サブネットマスクが(い)(0より大きく255のパート)は、
結論からいってしまうと、
256-サブネットマスクのそのパートの数=X
より、Xを求め、
IPアドレスのそのパート÷X=商・・・あまり
をもとめる。この2つの商が一致していれば、同じネットワーク
例:
サブネットマスク 255.255.240.0
種類 あ あ い う
IPアドレスその1 192.168.12.126
IPアドレスその2 192.168.22.126
(い)のパートは、12と22、
256-240=16
12÷16=0あまり12
22÷16=1あまり6
商は0と1で、違うので、違うネットワーク
※理由:
サブネットワークマスクでできるサブネットに番号を降る。
たとえば、192でできるサブネットワークは、4個(説明めんどっちいんで、少なくした)
0~63 サブネット0
64~127 サブネット1
128~191 サブネット2
192~255 サブネット3
このうち、できるサブネットをIPアドレスの小さいほうから、(上記のように)サブネット0、サブネット1・・・とサブネット番号をつけると、上記の商は、サブネット番号になる。
同じサブネット番号=同じネットワーク。
たぶん、これで、大丈夫だと思う。
上記のあまりに着目すると、ネットワークIP、ブロードキャストIPもわかる。
けど、クラスB、クラスAとの兼ね合いがあり、それまで説明すると長いので(上記のパート(あ)(い)(う)と、(い)のパートのあまりから、わかる)今回はこの辺で(必要な人は、自分でかんがえてみてね。気が向いたら、書くかも・・・)
![](https://mokano.main.jp/card/analsysimg.cgi?imgfname=gokusho.jpg&ID=bun090101)