はじめに
皆さんこんにちは、新卒1年目新米エンジニアのkananpaです。
今回は、ネットワークにおいて重要な概念であるサブネットについて、実際の業務で学ぶ機会があったため、まとめてみました。
私自身、名前は聞いたことがあったものの今回はじめて詳しく調べました。
初学者の方にも理解してもらいやすいようにまとめたため、最後まで読んでいただけるとありがたいです。
サブネットとは
サブネットとは、あるネットワーク内の小さなネットワークのことを指し、
この小さなネットワークに分割することをサブネット化するといいます。
このサブネット化には以下のような役割があります。
IPアドレスの効率的な管理
例えば、IPアドレスを割り当てる際にクラスアドレッシングによりクラスBで割り当てるとき、最大65536個のデバイスに割り当てることができます。
しかし、そんなに多くのデバイスがない場合、多くのIPアドレスが未使用となり無駄になります。
サブネット化を行うと、格納するデバイスの台数に合ったネットワークを構築できるため、無駄になるIPアドレスを減らすことができます。
このことにより、IPアドレスの枯渇問題の解消にもつながります。ネットワークルーティングのパフォーマンス向上
サブネット化されていない状態で数百万台ものデバイスが存在するネットワークの中で一つのデバイスと通信したい場合、一つ一つに通信し該当のデバイスを探します。
しかし、サブネット化し小さなネットワークに分割することで、最初から該当のデバイスの存在する小さなネットワークに通信できるため、無駄な通信を格段に減らすことができます。組織の要件に合わせた柔軟なネットワーク設計とセキュリテイの強化
「あるデータにおいてデバイスAにのみアクセスを許可したい」など同じネットワーク内のデバイスでもアクセス制限を設けたいといった場合があります。
そのような場合に、サブネットマスクでネットワークを分けることで上記のような設計が容易になります。
IPアドレスとは
IPアドレスとは、インターネットに接続するデバイスすべてに割り当てられた住所のようなもので、0~255の数字4組で表現されたものです。 このIPアドレスの表記はネットワーク部とホスト部に分かれており、このネットワーク部とホスト部を識別するための数値の事をサブネットマスクといいます。
サブネットマスクとは
サブネットマスクとは前述の通り、ネットワーク部とホスト部を識別するための数値の事で、この数値によりサブネット化されたネットワークの範囲を指定することができます。 サブネットマスクの表記には、IPアドレス同様0~255の数字4組で表現されたものと、IPアドレスの後に「/」をつけてビット数を指定するものがあります。 以下の図のように「123.45.67.89」というIPアドレスに「255.255.255.0」というサブネットマスクが指定されている場合を考えます。 このサブネットマスクを2進数に直すと「1」の数が24個になります。この左から3組までがネットワーク部となり、3組の数値が一致するものが同じネットワークとなります。
ネットワークアドレスの計算方法
サブネット化されたネットワークに通信する場合、ルータはIPアドレスからサブネットマスク値を用いてネットワークアドレスを算出して、割り当てます。
それではこの算出方法を紹介します。
①IPアドレスとサブネットマスク値を2進数に変換する
②論理積(AND演算)を求める
これより算出された値がネットワークアドレスとなります。
論理積では 以下表のように2つの入力値が共に真(1)の場合にのみ真(1)を出力し、それ以外の場合には偽(0)を出力します。
入力値1 | 入力値2 | 出力値 |
---|---|---|
偽(0) | 偽(0) | 偽(0) |
偽(0) | 真(1) | 偽(0) |
真(1) | 偽(0) | 偽(0) |
真(1) | 真(1) | 真(1) |
IPアドレスからネットワークアドレスを算出することで、そのIPアドレスがそのサブネットマスク内に含まれているかを判別することができます。
PHPによる実装方法
以下は上記ネットワークアドレスの算出をPHPで実装したものです。
IPアドレスは通常4組の数字で書き込まれるため、まずlong形に変換します。
そして、コンピューターはIPアドレスを2進法のコード (1と0の連数) として読み取るため、ビット演算子(論理積)を用いて計算していきます。
<? php $ipAddress = "123.45.67.89"; //指定IPアドレス $subnetMask = 24; //CIDR形式のサブネットマスク指定 // 指定されたIPアドレスをlong型に変換 $ipAddressLong = ip2long($ipAddress); // サブネットマスクを数値に変換. $subnetMaskNumeric = -1 << (32 - $subnetMask); //CIDR形式でない場合はそのままip2long("255.255.255.0")を使えばよい // リクエストIPをサブネットマスクでビット演算. $networkAddress = $ipAddressLong & $subnetMaskNumeric;
まとめ
今回はサブネットについて基本的な概念から計算方法までを紹介させていただきました。
私のようにネットワークについて触れる機会は少ないという方でも、IPアドレスやサブネットといった名前を耳にする機会が多々あると思うので、
基本的な仕組みを理解したいという方に参考になればうれしいです。