IPアドレスのまとめ

[network] : IPアドレスのまとめ

大事なこと

IPv4では32ビットの整数値。2進数の8ビットずつを4つの組みに分ける。分かりやすいように10進数で表現されることが多い。
IPv6では128ビット長になる。
IPアドレスはネットワーク部とホスト部から成り立つ。
IPアドレスの分類はクラスAからクラスEの5つに分類可能。クラスEは使われていない。※詳細は以下を参照
・ブロードキャストアドレスとはホスト部のビットを全部1としたもの。種類は2つあって自分が所属するローカルブロードキャストアドレスと異なるIPネットワークのダイレクトブロードキャストアドレスがある。
・クラスAやクラスBをそのまま使うのは非効率なので、サブネットマスクの導入により小さく分割する方法がある。
・例えばクラスBのサブネットマスクを255.255.255.192とすると上位26ビットをネットワークアドレスとして利用出来る。
・CIDRとはクラスA,クラスB,クラスCの8ビット単位のクラス分けをなくしたアドレス付けのこと。
・CIDRを利用して、クラスCの連続するネットワークアドレスを1つのアドレスとして利用する事ができる。
・私的なネットワーク内部で利用できるプライベートIPアドレスというものがあり、自由に利用することができる。※詳細は以下を参照

クラスA

・クラスAは先頭の1ビットが0で始まり、ネットワークアドレス部は戦闘から8ビットとなる。(0.0.0.0-127.255.255.255)
・残りの24ビットがホスト部となる。2の24乗−2(全て0や1は予約IP)なので割り当て可能数は16777214個となる。

クラスB

・クラスBは先頭の2ビットが10で始まり、ネットワークアドレス部は先頭から16ビットとなる。(128.0.0.0-191.255.255.255)
・残りの16ビットがホスト部となる。2の16乗-2(全て0や1は予約IP)なので割り当て可能数は65534個となる。

クラスC

・クラスCは先頭の3ビットが110で始まり、ネットワークアドレス部は先頭から24ビットとなる。(192.0.0.0-223.255.255.255)
・残りの8ビットがホスト部となる。2の8乗-2(全て0や1は予約IP)なので割り当て可能数は254個となる。

サブネットマスク

クラス サブネットマスク
A 255.0.0.0
B 255.255.0.0
C 255.255.255.0

プライベートIPアドレス

クラス プライベートアドレス
A 10.0.0.0 - 10.255.255.255
B 172.16.0.0 - 172.16.255.255
C 192.168.0.0 - 192.168.255.255

IPアドレス/サブネットマスク対応表

■クラスA

記述 サブネットマスク 個数
/8 255.0.0.0 16777216
/9 255.128.0.0 8388608
/10 255.192.0.0 4194304
/11 255.224.0.0 2097152
/12 255.240.0.0 1048576
/13 255.248.0.0 524288
/14 255.252.0.0 262144
/15 255.254.0.0 131072

■クラスB

記述 サブネットマスク 個数
/16 255.255.0.0 65536
/17 255.255.128.0 32768
/18 255.255.192.0 16384
/19 255.255.224.0 8192
/20 255.255.240.0 4096
/21 255.255.248.0 2048
/22 255.255.252.0 1024
/23 255.255.254.0 512

■クラスC

記述 サブネットマスク 個数
/24 255.255.255.0 256
/25 255.255.255.128 128
/26 255.255.255.192 64
/27 255.255.255.224 32
/28 255.255.255.240 16
/29 255.255.255.248 8
/30 255.255.255.252 4
/31 255.255.255.254 2
/32 255.255.255.255 1

TemplateMethod パターン

概要

親クラスに共通処理の流れを記述し、子クラスで各処理の具体的な実装を行うパターンです。
メリットとしては共通処理を一箇所にまとめることができるのと、子クラスで具体的な実装が組めるのでやりたい処理をクラスごとに変更することができます。
処理の方が決まっているクラス、例えばAPIクラス(パラメータ取得して、DBに接続して、結果を返してなど)などの定義では必ずと言っていいほど
使われているような気がします。

ハリウッドの原則

これはちょっと面白い話です。TemplateMethodパターンは通常とは"逆"のメソッド呼び出しをします。というのも抽象クラスから子クラスが
呼び出されるためです。この状態を示す英文として[ Don't call us. We'll call you ] 我々を呼び出すな、必要なときは我々が君を呼び出す という言葉があるようです。
ここでの我々は抽象クラス、君は子クラスという意味になりますね。誰が考えたのかわかりませんが、ユーモアを感じますね。

抽象クラス



abstract class APIModel {

protected $_params = array();
protected $_method = null;

protected function __construct() {}
protected function __destruct() {}

protected function prepare() {
//DBの初期化処理を記述 ※別クラス化
}

protected function getParams() {
$this->_params = $_REQUEST;
}

public function fetch() {
$this->getParams();
$this->validate();
$this->prepare();
$this->execute();
$result = $this->parse();
$this->tearDown();
return $result;
}

protected function tearDown() {
//DBの開放処理などを記述
}


}

共通処理の流れをfetchに書きました。これにより処理の流れを定義できます。その他のprotected関数については子クラスで詳細定義を行ないます。

継承クラス


class TestAPI extends APIModel {
   
public function __construct() {}
public function __destruct() {}

protected function prepare() {
//初期化処理を行ないます。
parent::prepare();
}

protected function validate() {
//パラメータのvalidateを行ないます。
$ret = true;
if( $ret === false ) {
    throw new Exception();
}
}

protected function execute() {
//DBに接続するなど実行を行ないます。
$this->_data = array( 'Test' );
}

protected function parse() {
//結果の整形
array_push( $this->_data, 'API');
return $this->_data;
}

protected function tearDown() {
//後処理を行ないます。※DBの開放など
}

}

class SampleAPI extends APIModel {

public function __construct() {}
public function __destruct() {}

protected function prepare() {
//初期化処理を行ないます。
parent::prepare();

}

protected function validate() {
//パラメータのvalidateを行ないます。
echo "aaaa \n"; 
}

protected function execute() {
//DBに接続するなど実行を行ないます。
$this->_data = array( 'Sample' );
}

protected function parse() {
//結果の整形
array_push( $this->_data, 'API');
return $this->_data;
}

protected function tearDown() {
//後処理を行ないます。※DBの開放など
}

}

親クラスで抽象化されていたメソッドの詳細定義を行っています。クライアントから利用される時は親クラスのfetchを呼び出します。

client



//client 
try {
  $test = new TestAPI();
  $data = $test->fetch();
  print_r( $data );

  $sample = new SampleAPI();
  $data = $sample->fetch();
  print_r( $data );
} catch( Exception $e ) {
exit;
}

インスタンス化するクラスを切り替えて実行します。それぞれのクラスで詳細定義したメソッドを抽象クラスが呼び出しているので、処理の流れが共通ですが
結果が異なります。

実行結果

Array
(
[0] => Test
[1] => API
)
aaaa 
Array
(
[0] => Sample
[1] => API
)