IPv4アドレスを理解する

# はじめに
この記事は[IPアドレスってなに？ ー 入門編 ー](https://qiita.com/manrikitada/items/0b03b1b423f3c8d1030f)の続きです。
前回はIPアドレスの基礎を知らない方向けの記事でしたが、今回はもう少し踏み込んだ内容に触れていきたいと思います。

なお、今回は基本的にIPv4に関する知識を解説していこうと思います。

## 前提知識
**1bit**：コンピュータが扱うデータの最小単位のこと。 コンピュータの世界ではすべての情報が2進数で処理されているが、その1桁のことを1ビット（bit）という。

## IPアドレスの基礎
```
192.0.2.1
```
前回、「IPv4アドレスは4桁あり、それぞれが0~255の値をとる。そしてIPv4では約43億通りの表現が可能。」と説明しました。
これに関してより細かく説明していきます。

実は0~255の値は2進数で表されており、1桁あたり8bitを取ります。
IPv4は４桁あるので 8bit×4桁=32bit あることになりますね。

ちなみにIPアドレスの例の「192」は以下のように表現されています。

<img width="600px" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551848/1095cb26-0c85-40ba-d3a1-fd5aab351fc1.png
">
※10進数→2進数の変換方法はここでは説明を省略します。各自調べていただくようお願いします。

## IPアドレスの構成
IPアドレスは以下のように**ネットワーク部**と**ホスト部**に分かれています。
ネットワーク部でそのIPアドレスが属しているネットワークを識別することができ、ホスト部でそのIPアドレスが、ネットワーク内のどのノードに割り当てられているかがわかるようになっています。
<img width="600px" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551848/32364c65-e74b-fb1c-90a0-8e2b8207bdc6.png">

これでネットワーク部とホスト部の違いや用途を理解できたと思います。

ですが、IPアドレスだけを見てどこまでがネットワーク部でどこからがホスト部なのがを判断することはできませんよね。

これを解決するのが**サブネットマスク**です。

## サブネットマスクについて
サブネットマスクはIPアドレスのネットワーク部とホスト部を識別する数値のことです。

では、サブネットマスクが「255.255.255.0」のとき、IPアドレスのネットワーク部とホスト部がどう識別されるかを以下のイメージ図で確認しましょう。

<img width="600px" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551848/7ef2fd53-9c1c-293a-39fb-c5f9ce993f54.png">

「１」のbitが立っているのがネットワーク部で、「0」のbitが立っているのがホスト部です。
つまり、「192.0.2.1」のIPアドレスのうち、「192.0.2」の部分がネットワーク部で、「1」の部分がホスト部と識別できます。

同様に「255.255.0.0」がサブネットマスクの場合は、「192.0.2.1」のIPアドレスのうち、「192.0」の部分がネットワーク部で、「2.1」の部分がホスト部と識別できますね。


また、サブネットマスクの表記方法は「255.255.255.0」のようなものだけではありません。
**CIDR表記**というものがあります。具体例を見ていきましょう。

### CIDR表記について
CIDR表記とはサブネットマスクをより簡潔に示すための表記法です。
「/〇〇」と表記することで何bitまでがネットワーク部でどこからがホスト部かを示す作りになっています。

以下具体例↓

<img width="600px" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551848/fa7302cd-4c5a-e5fc-0110-17b91042e430.png">

上の例の通り、「192.0.2.1/24」は「255.255.255.0」がサブネットマスクの場合と同じ結果になります。

サブネットマスクの表記法は10進数表記（「255.255.255.0」など）とCIDR表記（「/24」など）の2通りあるのでどちらも覚えておきましょう。

## 特別なIPv4アドレスについて
IPv4アドレスは32bitで約43億通りありますが、それらの値全てをノードに利用することはありません。いくつかのIPv4アドレスはあらかじめ特定用途向けに予約されています。
それら特別なIPv4アドレスを紹介していきます。

- ### プライベートIPアドレス（ローカルIPアドレス）

プライベートIPアドレスは、組織内でのネットワークでのみ利用可能なIPアドレスです。そのため、インターネット上のノードから下の表のIPv４アドレスに対して通信を試みても、相手を発見できません。

| IPv4アドレス | 用途 |
|:-----------:|:------------:|
| 10.0.0.0 ~ 10.255.255.255       | 大規模ネットワーク用プライベートIPアドレス       |
| 172.16.0.0 ~ 172.31.255.255     | 中規模ネットワーク用プライベートIPアドレス     |
| 192.168.0.0 ~ 192.168.255.255       | 小規模ネットワーク用プライベートIPアドレス      |

補足ですが、これらプライベートIPアドレス以外の、インターネット上のノードから直接通信可能なIPv４アドレスを俗に**グローバルIPアドレス**と呼びます。

- ### ネットワークアドレス
ネットワークアドレスはホスト部のbitが全て「0」のアドレスです。そしてこれが、ネットワーク自体を指すアドレスとして使用されます。

- ### ブロードキャストアドレス
ブロードキャストアドレスはホスト部のbitが全て「1」のアドレスです。
これは同一ネットワーク全体へデータを送信するために使用されます。

補足ですが、ブロードキャストが届く範囲を**セグメント**と呼びます。

- ### ループバックアドレス
これは各ノードが自分自身を指すためのアドレスです。
「127.0.0.1」という固定のアドレスに決まっています。

## サブネットマスクの活用
さて、サブネットマスクや特別なIPv4アドレスについてある程度理解が深まったところで、サブネットマスクの活用方法について見ていきましょう。
問題形式で説明していこうと思いますので、ぜひご自分でも答えを考えてみてください。


### 【問題】
以下のネットワークにはいくつのノードが接続できるでしょうか？
```
192.0.2.1/24
```
【解説と答え】
ネットワークに接続するためにはIPアドレスが必要となります。
なので、ネットワークに接続できるノード数を考える場合は、そのネットワークは何通りのIPアドレスを表現できるかを考えれば良いのです。
つまり、ホスト部が何通りを表現できるかを考えれば良いのです。（ネットワーク部は固定なので、ホスト部が何通りを表現できるかが実質IPアドレスのパターンとなる）

では、まずホスト部が何通りあるかを考えます。
「192.0.2.1/24」は上位24bitまでがネットワーク部でそれ以外の8bitはホスト部でしたね。
8bitは 2^8=256通りあります。

「なのでネットワークに接続できるノードは256個です！」
・・・とするのは間違いです。

「特別なIPv4アドレスについて」で紹介した以下の２つを思い出してください
- ネットワークアドレス
- ブロードキャストアドレス

先ほど求めた256通りの中には「192.0.2.0」（ネットワークアドレス）と「192.0.2.255」（ブロードキャストアドレス）が含まれています。

なので、ネットワークに接続できるノードは 256-2で、**答えは254台**となります。


### 補足
先ほどの問題で「192.0.2.1/24」には254台のノードを接続できると理解できたと思います。
では、このようなネットワークに400台のノードを接続したい時はどうすればよいのでしょうか？

答えは「**サブネットマスクを変更する**」です。
では、なぜサブネットマスクを変更するとネットワークに接続できるノードの数は増えるのでしょうか？　解説していきます。

【解説】
ネットワークに接続できるノードはホスト部が表現できるパターンに依存すると先ほどの問題で理解したと思います。
であれば、**ホスト部を拡張すればその分ネットワークに接続できるノードの数は増える**ということになりますね。

ではどうすればホスト部を拡張できるのでしょうか？
答えは簡単で、ネットマスクを変更してネットワーク部を減らせば良いのです。

例えば、「192.0.2.1/24」を「192.0.2.1/23」に変更してみます。そうするとネットワーク部は**24bit→23bit**へと減少します。それと同時にホスト部は**8bit→9bit**へと増加しましたね。
つまり、ホスト部が表現できるパターンが2^9=512通りとなりました。
ここからネットワークアドレスとブロードキャストアドレスの2通りを引き算すると
512-2=510台のノードがネットワークに接続できると求められます。

このようにネットワーク部を減らせば減らすほど接続できるノード数は増加していきます。
「192.0.2.1/16」であれば65,534台のノードが接続できるようになります。
しかし、400台のノードのみ接続できれば事足りる状態で65,534台を接続可能にしてもオーバースペックです。
今回の例であれば「192.0.2.1/23」に変更することが適切であると考えられます。