IPアドレスとか、サブネットについて

## はじめに
最近、docker networkを使用して通信テストをしているタコ（🐙）です。
今回は、ネットワーク基礎知識についての記事になります。
インフラ関係に興味はあるけど、手が出せない、意味がわかりずらい人たち向けに書いていこうと思います。
注意 : IPアドレスは、IPv4(32bit)で説明しています。

## 目次
1. IPアドレスについて
1. クラスについて
1. サブネットについて 

## 1. IPアドレスについて
#### 皆さんは、IPアドレスについて説明できますか？
恐らく、雰囲気でインフラを触っている人たちは、「```住所```」と回答する人が多いといます。住所と説明されて理解できたことがある人は、天才だと思います。なぜなら、後に説明するIPアドレスはサブネットと切っても切れない関係を持っているにも関わらず、理解できていることになるからです。抽象的な、「```住所```」と言う言葉の解像度を上げていこうと思います。

#### 住所の正体
IPアドレスの構造は、所属する<font color="red">```ネットワークの番号```＋```ホストの番号```</font>になっています。
つまり、IPアドレスが表して入いるものは、<font color="red">「```何処の```」+「```誰```」</font>になります。
ネットワークの番号は、<font color="red">``` 接続されている全てのネットワークでユニーク ```</font>でなければいけません。
一方、ホストの番号は<font color="red">``` 所属するネットワーク内でユニーク ```</font>でなければいけません。

違うネットワークに同じホスト番号を持つものがいても、ネットワーク番号が違う場合は、必ずユニークになります。

例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625910/465e6db5-f60c-d9f4-bbd9-6c8dba017350.png)


1. 同じホスト番号（100）
両方のネットワークで「ホスト番号100」が使われていますが、それぞれのネットワーク番号（192.168.1 と 192.168.2）が異なります。

2. ユニークな組み合わせ
ネットワーク番号とホスト番号を組み合わせたIPアドレスは以下のようになります。
```:ネットワーク番号とホスト番号を組み合わせたIPアドレス
    - ネットワークA: 192.168.1.100
    - ネットワークB: 192.168.2.100
    - ネットワークC: 192.168.3.100
```

上記のように、ネットワーク番号が異なるため、それぞれのIPアドレスがユニークになります。

#### IPアドレス

IPアドレスは、10進数で表記されることがほとんどですが、元はビットであることをわすれてはいけません。
例：元のIPアドレス
``` 10101100000001010010001000001011 ```

見やすくすると、以下になります。
``` 10101100  00000101  00100010  00001011 ```

ただし、人間は2進数を咄嗟に判断できないので<font color="red">``` バイトごとに10進数にして表記します ```</font>。
```
  10101100  00000101  00100010  00001011
     172        5        34        11    
```

そして<font color="red">``` 各バイトの間にはドットを入れる```</font>。例えば、上の例ならば、<font color="red">``` 172.5.34.11 ```</font>と表記することになります。
```
    172   .     5     .    34    .    11    
```

上記の1バイトごとの区切りをオクテットといいます。今回であれば、4オクテットになります。今までの情報をまとめてIPアドレスを表すと以下になります。

- <font color="red">``` 4オクテット(32ビット) ```</font>
- <font color="red">``` ネットワーク番号(何処の) ```</font>
- <font color="red">``` ホスト番号(誰) ```</font>

```:IPアドレスを表す
 ネットワーク番号(何処の) : ホスト番号(誰) 
 10101100 00000101 : 00100010 00001011
    172  .    5    .    34   . 11 
```

上記の内容から、先頭から16ビットがネットワーク番号で、残り16ビットがホスト番号になると予想するかもしれませんが、実は適当な例になります。実際は、<font color="red">``` ネットワーク番号とホスト番号のビットは、クラスによって決定されます ```</font>。

## 2. クラスについて
#### クラスフルアドレッシング
クラスとは、IPアドレスで使用する<font color="red">``` 32ビットのうち何ビットがネットワーク番号なのかを決められる ```</font>ものになります。

理解すべきクラスは、3つになります。
```:クラス
クラス |	第１オクテット  | 第２オクテット |	第３オクテット | 第４オクテット |
 Ａ	  | ネットワーク番号 |                  ホスト番号                  | 
 Ｂ	  |           ネットワーク番号       |         ホスト番号           | 
 Ｃ	  |                  ネットワーク番号                |  ホスト番号  |
```

<font color="red">``` クラスを判断するには、先頭が何ビットかで判断します ```</font>。

```:判断基準
クラス | 第１オクテット | 10進数で表記した場合   |
Ａ	   |   0 x x x    | 0.x.x.x ～127.x.x.x   |
Ｂ	   |   1 0 x x    | 128.x.x.x ～191.x.x.x |
Ｃ	   |   1 1 0 x    | 192.x.x.x ～223.x.x.x |
```

上記の内容から、ネットワーク番号の部分のビットが少ないと、ホスト番号の部分のビット数が多くなります。つまり、<font color="red">``` 多くのホストを所有するネットワーク ```</font>になります。

```: ネットワークの規模とクラスのイメージ
クラス  |         規模	      |    ネットワークの数	 | 保有できるホストの数
Ａ	   | 政府・国家機関・大企業 |	 7ビット=128個	     | 24ビット=16,777,216個
Ｂ	   |       中規模企業	  |  14ビット=16,384個	 | 16ビット=65,536個
Ｃ	   | 小規模企業・プロバイダ |	 21ビット=2,097,152個 | 8ビット=256個
```

上記の規模によって、クラスに分けてIPアドレスを割り振る方式を<font color="red">``` クラスフルアドレッシング ```</font>と言います。

クラスフルアドレッシングを取り入れて、各ホストにIPアドレスを割り振ると以下になります。
例：クラスC
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625910/67091cc9-306a-c8ac-2e44-cbf084edb7f7.png)

補足ですが、<font color="red">``` IPアドレスには使ってはいけないアドレスが存在します。 ```</font>

#### 予約済みアドレス
予約済みアドレスとは、特別な意味を持つため実際のホストに割り振ってはいけないアドレスになります。<font color="red">``` ホスト番号のビットがすべて０ ```</font>になるアドレスと、<font color="red">``` ホスト番号のビットがすべて１ ```</font>のアドレスになります。

クラスＣ192.168.10.xのネットワーク番号の場合、以下の２つになります。
それぞれ<font color="red">``` ネットワークアドレス ```</font>、<font color="red">``` ブロードキャストアドレス ```</font>と言います。

```:予約済みアドレス
	                   |      ネットワーク番号	   | ホスト番号
-------------------------------------------------------------------
ネットワークアドレス	   | 110000001010100000001010  | 00000000
                       |---------------------------|----------------
                       |       192.168.10.x	       |     0
--------------------------------------------------------------------
ブロードキャストアドレス |  110000001010100000001010 | 11111111
                       |---------------------------|----------------
                       |       192.168.10.x	       |    255
```

ネットワークアドレスは、<font color="red">```　そのネットワーク自体 ```</font>を示しています。そのネットワークへの経路選択の際に使用します。
例えば、192.168.10.1へ運ぶ時は、192.168.10.0への経路を考えるということになります。他のネットワークからのパケット転送の際、いちいち192.168.10番ネットワークの１番宛など考えるのは手間がかかります。まず、192.168.10番へ届けます。それから先はその192.168.10番ネットワーク内部で考えます。

もうひとつの、ブロードキャストアドレスは、<font color="red">```　そのネットワークすべてのホストを表します ```</font>。
簡単にいえば、ネットワーク内全員が受け取るためのアドレスになります。
例えば宛先IPアドレス192.168.10.255とすれば、192.168.10番ネットワークに存在するすべてのホストがそのパケットを受け取ります。

## 3. サブネットについて
#### 小さなネットワーク
ネットワークは幾つかの小さなネットワークに分割し、管理しやすくすることができます。
この小さなネットワークのことを<font color="red">``` サブネットワーク ```</font>と言います。

#### サブネットワーク
IPアドレスは、<font color="red">``` ネットワーク番号 ```</font>と<font color="red">``` ホスト番号 ```</font>から成り立っています。

上記をサブネットワークに分割するため、以下のように変更する必要があります。
```: サブネットワーク
サブネット化前 : ネットワーク番号 |         ホスト番号         |
サブネット化後 : ネットワーク番号 | サブネット番号 | ホスト番号 |
```

<font color="red">```ホスト番号のビットを、サブネット番号とホスト番号にします ```</font>。
つまり、<font color="red">```ホスト番号の部分を削って、サブネット番号の部分を作りだす ```</font>ことになります。

#### サブネットマスク
サブネットを使用する場合はサブネットマスクをIPアドレスと同時に表記する必要があります。サブネットマスクとは、どこまでがサブネット番号かを示すものになります。
なぜ、サブネットマスクがあるのか？
IPアドレスを10進数表記（例: 192.168.1.0）だけでは、直感的にどのビットがネットワーク部分で、どのビットがホスト部分なのか判別できません。一度、2進数に変換してネットワーク部のビット数を数える必要があります。

この煩雑な作業を簡略化してくれるのが サブネットマスク になります。特に、CIDR表記（例: /24）は、ネットワーク部分のビット数を直接示すため、非常に便利です。

CIDR表記とサブネットサイズの関係
サブネットの分割数（サブネットサイズ）は、サブネットマスクの ホスト部分のビット数 によって決まります。
```
CIDR表記	10進数マスク  	ネットワーク数	ホスト数（1サブネットあたり）
/24	        255.255.255.0	   1	                 256
/25	        255.255.255.128	   2	                 128
/26	        255.255.255.192    4	                  64
/27	        255.255.255.224	   8                      32
```
/24 はホスト部分が8ビット → 2^8 = 256ホスト
/25 はホスト部分が7ビット → 2^7 = 128ホスト
/26 はホスト部分が6ビット → 2^6 = 64ホスト

IPアドレスとは、ネットワーク部(何処の)＋ホスト部(誰) or ネットワーク部(何処の)＋サブネット部（サブネットの）＋ホスト部(誰)と言う解釈になります。以上のことからIPアドレスの住所と言う言葉を理解するために、サブネットの知識が必要になります。とても、「住所」だけで片付けられるものではないと思います。

## まとめ
今回はIPアドレスの基本から、クラスの違い、そしてサブネット化について学びました。

IPアドレスは「ネットワーク番号」と「ホスト番号」の組み合わせ。
クラスによってネットワークの規模が異なる。
サブネット化により管理が効率的になる

## 終わりに
いかがだったでしょうか？ネットワークのIPアドレスを理解するためには、付属する多くの知識が必要になります。今回の記事でも説明しきれてない部分があります。もっと詳しく学びたい方は、3分間ネットワークキングで検索してみてください。

参考文献
https://www5e.biglobe.ne.jp/aji/3min/