4.1.2 サブネット

クラスA や クラスBのような巨大なクラスをそのままブロードキャスト ドメイン(一つの物理セグメント)として使うのには無理があります。 そこで、昔からこうした大きなセグメントを区切って使う手法が開発 されました。これをサブネットと言います。但し、サブネットはあくまでも ドメインの内部の管理の問題で、インターネット全体で使える技術という 訳ではありません。実際、必要な事は、割り当てられた大きなIPセグメント を分割して使うことだからです。

サブネットの考え方自体はそれほど難しいものではありません。クラス によって固定されているセグメントを、分割すれば良いだけです。但し、 どこで分割するかは、クラスからは分からない訳ですから、何ビットを ネットワークを表すのに使うかは決めて、内部の管理者は共通に憶えて おく必要があります。実際には、クラスで決められたホスト部を 分割して、そのうちの前の何ビットかをサブネットワークを表す ために用います。そこで、この部分をサブネット部と言います。残った 部分が本当のホスト部です。

     (ネットワーク部).{ (サブネット部) . (ホスト部) }

例えば、172.16.0.0 はクラスBですが、これを分割することを考えます。 一番簡単な分割方法は、クラスBだが、クラスCのように考えて、ネットワーク 部が24bitだと考える方法です。これならば、ホスト部が最後の8bitになる ので、表記からも分かりやすいでしょう。この場合、サブネット部は 8bit になりますが、表記ではネットワーク部とサブネット部の区別はなく、 24bit でネットワークを表すと表記します。これは、簡単に次のように 表せます。

     172.16.0.0/24

つまり、IPアドレスの後ろにネットワーク部の長さ(サブネット部を含む) を示す訳です。但し、ここで示されているネットワークは、172.16.0 を 示しているだけです。クラスBとしてみた 172.16.0.0 のネットワークが どのように分割されているかは、これだけでは分かりません。これは、 後で新しい手法のところで詳しく学びますが、同じ大きさに分けるだけ ではなく、制約はありますが、異なる大きさに分けることも可能だからです。

ここでは単純に同じ大きさに分けるとすると、256 個の同じ大きさの サブネットができます(一方、ひとつのサブネットでは 256 個のホスト部が あります)。

     172.16.0.0/24
     172.16.1.0/24
     172.16.2.0/24
     ......
     172.16.254.0/24
     172.16.255.0/24

このように、大きなネットを8bitを区切りにして分ける場合には単純です が、より細かく分けようとすると大変です。

次の例は、192.168.0.0/24 を更に8等分することを考えます。つまり、 8bitのホスト部を、サブネットが8個持てるように分割する訳です。 この時、8 は $2^3$ なので、3bit をサブネット部に、残りの5bitが ホスト部に使えます(つまり、ホスト部の大きさは 32です)。 従って、できるネットワークは以下のように なります。

     192.168.0.0/27
     192.168.0.32/27
     192.168.0.64/27
     192.168.0.96/27
     192.168.0.128/27
     192.168.0.160/27
     192.168.0.192/27
     192.168.0.224/27

ここで注意するのが、4byte目の表記です。これを理解するためには、 2進法で書かないといけません。まず、4byte目の上位 3bit だけを 考えると、

    (000), (001), (010), (011), (100), (101), (110), (111)

となることが分かります( 丸括弧で括ると2進数表記ということに します)。これに残りの5bit を付け加えると、 以下のようになるからです。

    (000) + (0 0000) = (0000 0000) =   0
    (001) + (0 0000) = (0010 0000) =  32
    (010) + (0 0000) = (0100 0000) =  64
    (011) + (0 0000) = (0110 0000) =  96
    (100) + (0 0000) = (1000 0000) = 128
    (101) + (0 0000) = (1010 0000) = 160
    (110) + (0 0000) = (1100 0000) = 192
    (111) + (0 0000) = (1110 0000) = 224

少し2進数の計算になれていないと大変ですが、2進数では一番下の桁 が1の位で、その次の位が$2^1$の位、下から3番目は $2^2$ のように、 下から n 番目の桁は $2^{n-1}$ となるので、 一番最後の (1110 0000) は、


\begin{displaymath}
2^{7} + 2^{6} + 2^{5} = 128 + 64 + 32 = 224
\end{displaymath}

となる訳です。このように、IPv4 では十進表記でアドレスを表示する ために、2進数から十進数への変換をしなければならない時があります。

さて、ここまでネットワークの長さを表すのに 192.168.0.0/27 のように /27 という書き方をしてきましたが、実はこの分かりやすい 書き方は最近の書き方で、古くはネットマスクと呼ばれる書き方をして いました。そして、多くのUnixや、ルータでは設定の際に、この古い 書き方を知っていなければならない場合がありますので、次に古い書き方 でのネットワークの表し方を示します。

以下は、最初に掲げたクラスBを256に分割した場合を古い書き方で 書いたもので、netmask 255.255.255.0 が /24 に対応して います(netmask という書き方自体はルータやOSによって違います)。

     172.16.0.0    netmask 255.255.255.0
     172.16.1.0    netmask 255.255.255.0
     ......
     172.16.255.0  netmask 255.255.255.0

ここでネットマスク(netmask)という考え方について説明しましょう。 今ここで問題になっているのは、あるIPがあったときに( 172.16.4.18とします)、そのIPからネットワーク部分を取り出す ことです(つまりは 172.16.4.0 を取り出す)。最初に説明した /24の考え方ですと、頭から24bitを取り出すことになりますが、 IPは色々なところで解釈されなければならず、そのために処理速度が 遅かった時代でも十分高速に処理できるようにしなければなりませんで した。そこで、ビット単位での演算を利用する方法が考えられました。 ここではビット演算の&演算を用います。&演算は 以下の規則を満足します。

    1 & 1 = 1,  1 & 0 = 0, 0 & 1 = 0, 0 & 0 = 0

つまり、1と1の間の演算以外は全て0 になるような演算です。これを 用いると、頭から数ビットを取り出すような演算が高速に行えます。 例えば、(1010) という4ビットデータから、頭の2ビットを取り出す ためには、以下のようにします。


\begin{displaymath}
(1010)\,\,\, \& \,\,\, (1100) = (1000)
\end{displaymath}

IPと良く似た2byteの形式を考えた場合、例えば 4.18 というアドレスから上位 8bitを取り出すことを考えます(要するに4.0を取り出します)。


\begin{displaymath}
4.18 \,\,\, \& \,\,\, (1111\,\,1111).(0000\,\,0000) = 4.0
\end{displaymath}

ここで、(1111 1111) は全てのビットが立っている8bitなので、255 に対応します。従って、十進数的に書けば、次のようになります。


\begin{displaymath}
4.18\,\,\, \&\,\,\, 255.0 = 4.0
\end{displaymath}

最終的に、実際のIPで、172.16.4.18 から上位3byte(24bit)を取り出すには 以下のようになります。


\begin{displaymath}
172.16.4.18\,\,\, \&\,\,\, 255.255.255.0 = 172.16.4.0
\end{displaymath}

少し面倒でしたが、8bit の倍数であるような場合はあまり難しくはありません。 しかし、最初の例の /27 の場合は少し面倒です。まず、頭から 27bit ということは、24 + 3 bit なので、最初の 24bit については、255.255.255 とかけることは学習しました。残りの 3bit は、2進数表記で書くと以下のように なります。

          ( 1110 0000 )

従って、これを十進表記すれば良い訳です。 これは先に計算をしました(224になりました)。 つまり、192.168.0.48 から先頭 27bit を取り出すには以下のように します。


\begin{displaymath}
192.168.0.48\,\,\, \&\,\,\, 255.255.255.224 = 192.168.0.32
\end{displaymath}

長くかかりましたが、以上のような訳で、新しい記述方法では、

        192.168.0.32/27

としてネットワークを表すのに対して、 古い記述方法では、

        192.168.0.32 netmask 255.255.255.224

と表されるという訳です(netmask という表記は、 OSやルータによって少しづつ異なっています)。 そこで、最後に、最初に出てきた 192.168.0.0 のネットワークを 8個のサブネットに分けると、以下のように記述されることになります。

     192.168.0.0   netmask 255.255.255.224
     192.168.0.32  netmask 255.255.255.224
     ......
     192.168.0.192 netmask 255.255.255.224
     192.168.0.224 netmask 255.255.255.224



Noriyo Kanayama