IPv4 addr bitmask calculation

IPv4アドレスのビットマスク計算を覚えよう…より正確には、覚え方を覚えましょう、という話。

おまえ何年ネットワークエンジニアやってるんだって話なんですが、いまだにネットマスク計算とかワイルドカードマスク計算がねえ…覚えられなくてねえ。使う値は決まってるんだから覚えるだけなんだけど、すぐ忘れる。であれば、単純な足し算引き算だけでそれらを出せるように覚え方を覚えましょう、という話。まあ新人さん向けにというのもあるので改めて復習。

…というか自分の場合、暗算が苦手というのがね…(2桁の加減算ですらつらい)

ビットマスク計算の覚え方

基本的にこの 1オクテット(8ビット) のマスクテーブルが暗記できる人は特に何もすることはありません。覚えられるんなら覚えちゃいましょう。それが一番早いので。

n Mask(dec) Mask(bin) Wildcard Mask(dec) Wildcard Mask(bin)
8 256(0) 0000 0000 255 1111 1111
7 128 1000 0000 127 0111 1111
6 192 1100 0000 63 0011 1111
5 224 1110 0000 31 0001 1111
4 240 1111 0000 15 0000 1111
3 248 1111 1000 7 0000 0111
2 252 1111 1100 3 0000 0011
1 254 1111 1110 1 0000 0001
0 255 1111 1111 0 0000 0000

もうちょっと解説。

IPv4 は 32ビットなのですが、表記上 8ビット(1オクテット)単位になってるので、1オクテット分の計算がわかれば後は +8, +16, +24 とかのオフセットを加えるだけなわけです。ということで1オクテットの計算だけ見ます。

まずは、2^n (n=0...8) がいくつになるかを覚えてください。せめてこれがないとどうにもならない。

  • これは、8ビット2進数の n ビット目(bit-n)だけが "1" になっている数になります。
  • 8bit なので 256 で桁があふれます。
n bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 2^n
8 0 0 0 0 0 0 0 0 256
7 1 0 0 0 0 0 0 0 128
6 0 1 0 0 0 0 0 0 64
5 0 0 1 0 0 0 0 0 32
4 0 0 0 1 0 0 0 0 16
3 0 0 0 0 1 0 0 0 8
2 0 0 0 0 0 1 0 0 4
1 0 0 0 0 0 0 1 0 2
0 0 0 0 0 0 0 0 1 1

ワイルドカードマスクは 2^n-1 になっていることがわかります。

  • これは、bit0〜bit-n までの各ビットが "1" になっている数になります。bit-nへ桁上がりするひとつ前の数です。
n bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 2^n-1
8 1 1 1 1 1 1 1 1 255
7 0 1 1 1 1 1 1 1 127
6 0 0 1 1 1 1 1 1 63
5 0 0 0 1 1 1 1 1 31
4 0 0 0 0 1 1 1 1 15
3 0 0 0 0 0 1 1 1 7
2 0 0 0 0 0 0 1 1 3
1 0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0 0 0

ネットマスクはこれをビット反転させた数になります。

  • これは 255-(2^n-1) = 255-[Wildcard Mask] で計算できます。
n bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 255-(2^n-1)
8 0 0 0 0 0 0 0 0 0(256)
7 1 0 0 0 0 0 0 0 128
6 1 1 0 0 0 0 0 0 192
5 1 1 1 0 0 0 0 0 224
4 1 1 1 1 0 0 0 0 240
3 1 1 1 1 1 0 0 0 248
2 1 1 1 1 1 1 0 0 252
1 1 1 1 1 1 1 1 0 254
0 1 1 1 1 1 1 1 1 255

2^n は(ネットワークに限らず)いろいろなところでよく使うので覚えてるはず。
Wildcard mask は -1 するだけなので、いったんそこを経由してから netmask を計算した方がわかりやすいとおもいますよ、というだけです。これ、(255-(2^n-1)) = 255-2^n+1 = 256-2^n でもいいんだけどね。Wildcard mask も合わせてつかえるようになっておきましょうというアレンジを入れてます。ビット反転…つまり補数計算 = 固定長二進数の減算ですね。

n 2^n 256-2^n(netmask) 2^n-1(wildcard mask)
8 256 0(256) 255
7 128 128 127
6 64 192 63
5 32 224 31
4 16 240 15
3 8 248 7
2 4 252 3
1 2 254 1
0 1 255 0

IPアドレスの階層性

あと、IPアドレスの階層性…サブネット分割の話について。サブネット分割はともかく、階層化(階層性)というところがちゃんとつかめてない人をみたことがあるので。

1桁ずつ(1ビットずつ)マスクをかけていく作業は、アドレスブロックを半分ずつ割っていく作業に当たります。図に書いたように、二分木として構造化(=階層構造に)できる…大きなサブネットは小さなサブネットを含む…というのを利用してネットワークの経路制御が行われています。小さな経路は大きなサブネット表現で束ねる(集約する)ことで経路制御に必要な情報を減らしています。

で、見たことがあるのが、サブネット分割が 2^n のところで行われるというのはわかっているけど、集約(階層化)がよくわかっていなくて、たとえば 192.168.0.16/28 と 192.168.0.32/28 を /27 で束ねられるものと考えてしまうというケース。

これは、

  • 192.168.0.16/28 → 192.168.0.0/27 の後半
  • 192.168.0.32/28 → 192.168.0.32/27 の前半

なので、ひとつの /27 に集約することはできません。二分木で表現したときに、/27-/28 の段でひとつの枝に接続しない。上記の ふたつの /28 をひとつの情報で束ねようとすると /26 のところまであがって、192.168.0.0/26 にする必要があります。そうすると 192.168.0.0/28, 192.168.0.16/28, 192.168.0.32/28, 192.168.0.48/28 の4つの /28 が含まれるので。まあこんなのは計算すればすぐわかるんだけど、台帳上、Excel とかで単純に表操作してるだけだと間違えたりします。

この辺の考え方は、経路制御/経路集約とか考える上でもそうなんだけど、ACL で複数のセグメントに対するポリシ書こう…みたいなときにも必要なので覚えておきましょう。