サブネットの繰り上がりを理解してIPアドレス計算をする。

ネットワーク技術者にとってIPアドレスの計算は必須です。Ciscoの資格であるCCENTやCCNAでよく出題されます。

■例題1
IPアドレス「206.158.58.25/30」のサブネットマスク、および、このIPアドレスが属するネットワークのIPアドレスの範囲を求めなさい。

上記の例題をもとに、サブネットの繰り上がりを利用した解き方を書いてみようと思います。

まず例題のIPアドレスがクラスA、クラスB、クラスCのどのアドレスクラスに属するかを判断します。アドレスクラスを見分けるにはIPアドレスの第一オクテットを見て判断します。第一オクテットとは、IPアドレスを10進数表記してドット区切りした場合の一番先頭の数値を指します。「206.158.58.25」の第一オクテットは「206」になります。ちなみに第二オクテットが「158」、第三オクテットが「58」、第四オクテットが「25」です。

クラスA、B、C それぞれの第一オクテットの範囲は以下のようになります。

クラスA・・・1〜126
クラスB・・・128〜191
クラスC・・・192〜223

「206」は 192〜223 の範囲に入りますのでクラスCということになります。

この例題ではクラスCのアドレスを「/30」としてサブネット化しています。サブネット化とはもともとあるネットワークをもっと小さなネットワークに分割することです。クラスA、B、Cのネットマスク(ナチュラルマスクと言う)は以下のようになっています。

クラスA・・255.0.0.0 ネットワーク部は8ビット
クラスB・・255.255.0.0 ネットワーク部は16ビット
クラスC・・255.255.255.0 ネットワーク部は24ビット

サブネット化ではホスト部のビットを借用してネットワークを分割します。クラスCでは第4オクテットのホスト部(8ビット)の一部を借用することになります。「/30」とはネットワーク部が30ビットということなので、ナチュラルマスクのネットワーク部(24ビット)とホスト部から借用した6ビットで30ビットのネットワーク部とします。

ここで以下の表を覚えてください。

覚え方は、一番左端の「128」を覚えます。上段は右に行くごとに半分にしていきます。下段は上の数値と左隣の数値の和を書きます。例えば下段の「192」の場合は、上の数値「64」と左隣りの数値「128」の和となります。

この表から「/30」の場合のサブネットマスクを簡単に知ることができます。クラスCでホスト部から6ビットを借用するイメージを以下に示します。

6ビット借用したときの下段の数値は「252」ですので、IPアドレス「206.158.58.25/30」のサブネットマスクは「255.255.255.252」となります。

次に、このIPアドレスが属するネットワークのIPアドレスの範囲を考えます。先程の表の上段を見てください。6ビットを借用したときの上段の数値は「4」です。すなわち「/30」でサブネット化したときにネットワークアドレスは4づつ繰り上がることを表しています。

1番目のネットワーク・・206.158.58.0
2番目のネットワーク・・206.158.58.4
3番目のネットワーク・・206.158.58.8
:
7番目のネットワーク・・206.158.58.24
8番目のネットワーク・・206.158.58.28
:

(※)1番目のネットワークの範囲は 206.158.58.0 〜 206.158.58.3、2番目のネットワークの範囲は 206.158.58.4 〜 206.158.58.7 という具合です。

こう見てみるとIPアドレス「206.158.58.25」は7番目のネットワークに属することがわかります。これよりIPアドレスの範囲は、206.158.58.24 〜 206.158.58.27となりますが、先頭の「206.158.58.24」はネットワークアドレスであり、最後の「206.158.58.27」はブロードキャストアドレスとなるため通常のアドレッシングでは使えません。ネットワークアドレスとはホスト部のビットがすべて「0」となるアドレス、ブロードキャストアドレスとはホスト部のビットがすべて「1」となる特殊なアドレスです。

よって、ネットワークアドレスとブロードキャストアドレスを除いた 206.158.58.25 〜 206.158.58.26 がIPアドレスの範囲となります。

[広告]

■例題2
IPアドレス「49.133.176.9/15」のサブネットマスク、および、このIPアドレスが属するネットワークのIPアドレスの範囲を求めなさい。

同様に例題2を解いてみます。第一オクテットが「49」であるためこのIPアドレスはクラスAということになります。クラスAのIPアドレスを「/15」でサブネット化するには、ネットワーク部(8ビット)とホスト部から借用した7ビットで15ビットのネットワーク部を作ります。クラスAでホスト部から7ビットを借用するイメージが以下です。

表の下段の数値は「254」なのでIPアドレス「49.133.176.9/15」のサブネットマスクは「255.254.0.0」となります。次にIPアドレスの範囲ですが、表の上段の数値よりこのネットワークの繰り上がりは「2」ということがわかります。

1番目のネットワーク・・49.0.0.0
2番目のネットワーク・・49.2.0.0
3番目のネットワーク・・49.4.0.0
:
n番目のネットワーク・・49.132.0.0
m番目のネットワーク・・49.134.0.0
:

何番目かは数えていませんが「49.133.176.9」は「49.132.0.0」のネットワークに属することだけはわかります。このネットワークの範囲は 49.132.0.0 〜 49.133.255.255 です。先頭の「49.132.0.0」はネットワークアドレス、最後の「49.133.255.255」はブロードキャストアドレスとなるため、このネットワークで使用できるIPアドレスの範囲は 49.132.0.1 〜 49.133.255.254 ということになります。

■例題3
「169.40.0.0」のネットワークにおいてサブネットを最大80個作りたい。どのようなサブネットマスクにすればよいか?

例題3は内容を変えてみました。これを解いてみます。例題3のネットワーク「169.40.0.0」は、第一オクテットが「169」のためクラスBに該当します。クラスBのナチュラルマスクは「255.255.0.0」でネットワーク部が16ビット、ホスト部も16ビットです。サブネットを80個作るにはホスト部からいくつかのビットを借用する必要があります。

1ビット借用・・2の1乗=2
2ビット借用・・2の2乗=4
3ビット借用・・2の3乗=8

6ビット借用・・2の6乗=64
7ビット借用・・2の7乗=128

80個作るには7ビット借用する必要があることがわかります。クラスBでホスト部から7ビットを借用するイメージが以下です。

表の下段の数値は「254」なのでサブネットマスクは「255.255.254.0」となります。ちなみにこのネットワークではネットワーク部に ナチュラルマスク16ビット+借用した7ビット=23ビット 使用していますので、ホスト部のビットは残りの9ビットとなります。よって、2の9乗=512 からネットワークアドレスとブロードキャストアドレスを引いた 510 がこのネットワークのホスト数となります。

■まとめ
サブネットの計算は以下の手順で行います。

  1. どのアドレスクラス(クラスA or B or C)に属するかを求める。
  2. ナチュラルマスクをもとにサブネットマスクを求める。
  3. ネットワークのアドレスの範囲を求める。
  4. ネットワークアドレス、ブロードキャストアドレスを求める。
  5. アドレッシング可能なアドレス範囲がわかる。

この記事を書くにあたり、以下の書籍を参考にさせていただきました。

アプリケーションデータのネットワークへの送信順

C言語でint型の整数値「1144201745」をメモリ上に格納すると、メモリの低位アドレスから高位アドレスに向かって4バイト分の領域が確保されます。ちなみに10進数の「1144201745」は16進数で表すと「0x44332211」です。メモリへの格納を考えると10進数で話をするより16進数で話をするほうがわかりやすいので「0x44332211」で話を進めます。

確保された4バイト分の領域ですがビットになおすと32ビット分です。このデータ値を構成するビット列のうち最上位にあるビットをMSB(Most Significant Bit)、最下位にあるビットをLSB(Least Significant Bit)と言います。なにが最上位でなにが最下位か(どちらが上でどちらが下か)というと、「0x44332211」を2進数に直したときに左側の桁(31ビット目の方)が最上位で、右側の桁(0ビットの方)が最下位になります。

MSB、LSBのことをバイトでの意味合いということで、(Most Significant Byte)、(Least Significant Byte)と書くときもあるようですが、この場合の捉え方は、MSBは最上位ビットが属するバイト、LSBは最下位ビットが属するバイト、と考えるべきと思います。

MSB、LSBをバイト単位で捉えるときの説明としてよく4バイトの領域をバイト単位で分割して左側を上位のバイト(MSB)、右側を下位のバイト(LSB)とするような説明を目にするのですが、そもそも4バイトで1つのデータを意味しており、それをバイト単位で「分割」してしまったらもとのデータの意味あいと変わってしまいます。それを上とか下とか言うのには違和感があって、MSB、LSBをバイト単位で捉えるときは、最上位ビット、最下位ビットそれぞれが属するバイトと考えるほうが納得がいきます。(これはあくまでも個人的な見解です。)

データは「バイト単位」にメモリに書き込まれるのですが、CPUの特性により格納方式が異なります。低位のアドレスから高位のアドレスに向かって、MSBからメモリに格納する方式をビッグエンディアン(big-endian)、LSBからメモリに格納する方式をリトルエンディアン(little-endian)と呼んでいます。「0x44332211」の場合、ビッグエンディアン、リトルエンディアンそれぞれの格納方法は以下のようになります。

メモリ上にビッグエンディアンで格納しようがリトルエンディアンで格納しようが、int型整数は4バイト単位でのアクセスとなるため、特に問題にはなりません。ただプログラムの実装にもよりますが、int型整数をchar型にキャストしてアクセスする場合は並び順が異なるためシステム環境(CPU特性)に左右されます。Aという機種でうまく動いていたものが、Bという機種でリコンパイルして動かしてみたら想定と違う、となることもありえます。

ネットワークへの送信についても同じで、ビッグエンディアンとリトルエンディアンとでは送信順が変わります。送信する際はメモリの低位アドレスのバイトから送信していきますが、ビッグエンディアンとリトルエンディアンではバイト単位で見ると並び順が異なりますので、送る側と受け取る側で並び順を決めておく必要があります。ネットワークへの送信にはビッグエンディアンを使うことになっていて、ネットワークバイトオーダーと呼ばれています。C言語ではネットワークバイトオーダーにあわせるためにlong型用にhtonl()、short型用にhtons()関数が用意されています。

ちなみにですが、big-endian、little-endianというのは「ガリバー旅行記」に出てきたものをマイクロプロセッサの世界で使っているみたいですね。

ネットワークへの送信はバイト単位で行われるのですが、バイトを構成するビットで考えた場合、一番最初に送信されるビットは最下位ビット(LSB)からとなります。

複数バイトのデータを送信する場合、低位アドレスの1バイト分がまず送信されるのですが、そのLSBが一番先にネットワークに流れます。1バイト(8ビット)が送られると次のバイトがネットワークに流れていきます。

イーサネットのMACアドレスは6バイト(48ビット)で構成されていて、前半の24ビットはOUI(Organizationally Unique Identifier)と呼ばれる機器ベンダー固有のコート値、後半24ビットがベンダーが自由に割り当てできる製品番号となっています。このMACアドレスですが、先頭1バイト目のLSBはI/Gビット(Individual/Groupビット)と呼ばれていて、これが「0」であればユニキャスト通信、「1」であればブロードキャストもしくはマルチキャスト通信を意味します。ネットワーク機器はI/Gビットを一番先に読み込んで、宛先の判断をしています。

なお、I/Gビットの左隣のビットはU/Lビット(Universal/Localビット)と呼ばれていて、これが「0」であれば世界で一意のグローバルアドレス、「1」であればローカルアドレスを意味しています。