IPアドレスについて
最初にIPアドレスの表記法を説明します。IPアドレスは32ビットもあるのでそのまま表現すると、非常に桁数が大きい数値となり、取り扱うのが大変です。そこでIPアドレスは8ビットごとに.(ドット)記号で区切って192.168.0.12のように表現します。またIPアドレスはただの数値の羅列ではなく意味や構造を持っています。
IPアドレスはネットワーク部とホスト部の2つで構成されています。ネットワーク部はネットワークを識別するための番号で、インターネット上で同じ番号のネットワークが存在してはなりません。ホスト部はネットワーク内の機器(端末など)を識別するための番号で、同じ番号のホストが存在してはなりません。
問題は32ビットのIPアドレスを、ネットワーク部とホスト部に対して何ビットずつ割り振るかです。現在もっとも良く使われているIPバージョン4ではクラスという概念で、ネットワーク部とホスト部の割り振るビット数を定めています。
クラス名 | 説明 |
クラスA | ネットワーク部8ビット、ホスト部24ビット。先頭のビットが0から始まります。 |
クラスB | ネットワーク部16ビット、ホスト部16ビット。先頭のビットが10から始まります。 |
クラスC | ネットワーク部24ビット、ホスト部8ビット。先頭のビットが110から始まります。 |
クラスD | マルチキャストアドレスと呼ばれるアドレスです。先頭のビットが1110から始まります。このアドレスは、同時に複数の相手と通信するマルチキャストで使用されます。 |
クラスE | 特別に予約されているアドレスです。先頭のビットが1111から始まります。 |
なお、ホスト部が全て0または全て1となるアドレスはホストに割り当てられませんので注意してください。
文章ばかりでは面白くありませんので、このクラス形式のアドレスを目で確認するためにClassAddressTestサンプルプロジェクトを用意しました(記事添付のサンプルファイルの「InternetTest」ディレクトリ参照)。このプロジェクトを実行して見て下さい。どのようにしてアドレスを指定して通信するのかと言うイメージが掴めると思います。
//クラスAのネットワーク string aStr = "15.158.48.2"; MacAddress macA = new MacAddress ( 10, 1 ); //MACアドレスを設定 ClassAddress aAddress = new ClassAddress ( AddressClass.A ); //ルーターのIPアドレスを決定 aAddress.Address = ClassAddress.Parse ( aStr ); Router aRouter = new Router ( macA, aAddress, AddressFormat.ClassAddress, new Lan ( ), net ); aRouter.LanName = "クラスAのネットワーク"; //----------途中省略---------- //クラスAのネットワークからクラスBのネットワークへデータ送信 ClassAddress destination = new ClassAddress ( AddressClass.B, ClassAddress.Parse ( bStr ) ); //宛て先のアドレスを指定 MacFrame data = new MacFrame ( ); //MACフレームを作る data.TypeOrLength = ( ushort ) EtherType.IP; IPv4 userData = new IPv4 ( ); userData.DestinationAddress = destination; data.UsertData = userData; //IPパケットのデータをMACフレームに格納 aRouter.Send ( destination, data ); //AからBへ送信
'クラスAのネットワーク Dim aStr As String = "15.158.48.2" Dim macA As MacAddress = New MacAddress(10, 1) 'MACアドレスを設定 Dim aAddress As ClassAddress = New ClassAddress(AddressClass.A) 'ルーターのIPアドレスを決定 aAddress.Address = ClassAddress.Parse(aStr) Dim aRouter As Router = New Router(macA, aAddress, AddressFormat.ClassAddress, New Lan(), net) aRouter.LanName = "クラスAのネットワーク" '----------途中省略---------- 'クラスAのネットワークからクラスBのネットワークへデータ送信 Dim destination As ClassAddress = New ClassAddress(AddressClass.B, ClassAddress.Parse(bStr)) '宛て先のアドレスを指定 Dim data As MacFrame = New MacFrame() 'MACフレームを作る data.TypeOrLength = CUShort(EtherType.IP) Dim userData As IPv4 = New IPv4() userData.DestinationAddress = destination data.UsertData = userData 'IPパケットのデータをMACフレームに格納 aRouter.Send(destination, data) 'AからBへ送信
このアドレス形式でも通信時の不都合はありません。しかし、この方法は8ビット単位の大雑把なものなので無駄が多く、IPアドレスの有効利用ができないという問題があります。例として、300台のネットワークを構築する場合を考えてみます。
クラスCは8ビットなのでホストを254台接続できます。256台でないことに注意してください。全て0のアドレスと全て1のアドレスは使えないので2を引いた254台となっています。一つ上のクラスBのIPアドレスを取得することになります。しかし、クラスBは16ビットなので65534台もホストを繋げます。つまり、この例では65234個のIPアドレスが使われないままになってしまいます。
IPアドレスの枯渇問題を耳にしたことがある人も多いと思います。IPアドレスの枯渇問題とは、簡潔に言うと必要な数のIPアドレスがないことです。その原因の一つが、このようにクラスという大雑把な単位で割り振ったことだといわれています。
それを防ぐために色々な方法が考え出されました。そして、クラスの概念はあまり使用されなくなり、IPバージョン6ではクラスの概念がなくなっています。次節では一番有名なIPアドレスの有効利用法であるサブネットマスクにつてい解説します。