前置き
サブネットマスクって、実務ではだいたいCIDR表記(サブネットマスクを桁数で指定。例:/27
)なんじゃないのかな?と思うんですが、
IPA系の試験だと(午前にしろ午後にしろ)CIDRじゃない方の表記(サブネットマスクをIPと同じ表記で指定。例:255.255.255.224
)で出題されることが多い気がします。
参考書の解説読んでると、だいたい、ホストアドレスを求めるにはまずサブネットマスクを2進数に変換して〜、って書いてますが、
そんなことしなくても求められます。
本題
具体例
具体的な問題でやってみます。
ネットワークに接続されているホストのIPアドレスが198.51.100.90で,サブネットマスクが255.255.255.224のとき,ホストアドレスはどれか。
情報処理安全確保支援士 平成29年秋期 午前Ⅱ 問20
IPA 独立行政法人 情報処理推進機構:問題冊子・配点割合・解答例・採点講評(2017、平成29年)
又は
平成29年秋期問20 ホストアドレスはどれか|情報処理安全確保支援士.com
この問題の解答は、「26」ですが、
256 - 224 = 32 \\
90 \bmod 32 = 26
で求められます。
CIDR表記にした時のプレフィックス長を得たい場合は、
256 - 224 = 32 = 2^5
で、この場合の $5$ が2進数表記にした時の0の数になる($224(10)=1110 0000(2)$であることがわかる)ので、
$8*3+(8-5)=27$で「/27」と求められます。
一般化
一般化すると、
「サブネットマスクが255.255.255.αの場合、IPアドレスA.B.C.xのホストアドレスは、
x \bmod (256 - α)
となる。」
ということになります。
(プレフィックス長が24以下の場合は着目するオクテットをずらしてください。)
どうしてこれが成り立つかは、後でも少し書いてみますが、
各自手元で2進数表記に直して計算してみると、わりかし腑に落ちるのではないかと思います。
modの計算は場合によっては少し面倒かもしれませんが、
10進数→2進数変換が得意な人や、サブネットマスク関連の2進数表記を暗記している人以外であれば、こちらの方が楽なのではないでしょうか。
感想
これに自力で気づいた後にググってみると、同じようなことを解説しているサイトもありますが、
地道に2進数で計算する解法を解説しているサイトの方が多いような気がしました。
し、何より参考書などをやっていてお目にかかったことがないです。
こういうテクニックこそ、参考書で教えて欲しいんですが。。。
証明
せっかくなので、
1{8-x}0{x}
の形で表せる二進数 $α$ について
$256 - α = 2^x$が成り立つこと
(=本題で書いた計算方法の前半(プレフィックス長の部分。後半部分はこれが分かれば自明。)
を証明っぽく書いてみます。(数学徒ではないので雰囲気だけ。。。)
$α$ は、$2^x$の位から$2^7$の位までが$1$である数なので、以下のように表せる。
α = \sum_{k=x}^{7}2^k (1)
また、以下は自明に成り立つ。(0xFF
を下$x$桁と上$8-x$桁に分けただけ)
\sum_{k=0}^{7}2^k = \sum_{k=0}^{x-1}2^k + \sum_{k=x}^{7}2^k (2)
$\sum_{k=0}^{7}2^k$ は当然 $255$ なので、$(1),(2)$より、
255 = \sum_{k=0}^{x-1}2^k + α (3)
ところで、以下も成り立つ。(1...に1を足すと繰り上がって10...になる)
\sum_{k=0}^{x-1}2^k + 1 = 2^x (4)
したがって、$(3),(4)$より、
255 = (2^x - 1) + α
これを変形して以下を得る。
256 - α = 2^x
正直$(4)$を自明にしていいならもっと直接的に示せる気がしますが。。。
なんちゃって証明ということで。。。
ありがとうございました。