IPアドレスの基礎知識


主に自分用。IPアドレス関連の知識でなにかわからなくなったり、忘れてしまった際に真っ先に帰ってこれる場所として書いた。
サブネットマスクの理解が曖昧だったので書籍やWebで調べてまとめていたら、いつの間にかIPアドレスの全体的なまとめになっていてここに至る。

主に参考にしたソースは以下。

- 『マスタリングTCP/IP 入門編』第4章
- 『ネットワーク超入門講座』CHAPTER2
- 『おうちで学べるネットワークのきほん』Chapter2
- [3 Minutes Networking No.21](http://www5e.biglobe.ne.jp/%257eaji/3min/21.html)
- [3 Minutes Networking No.22](http://www5e.biglobe.ne.jp/%257eaji/3min/22.html)
- [3 Minutes Networking No.23](http://www5e.biglobe.ne.jp/%257eaji/3min/23.html)

## 1. IPアドレスの基礎
### 1-1. IPアドレスとは何か
PCやサーバなど、TCP/IPで通信する機器を識別するためのアドレスのこと。
現実世界で郵便物を配達する際に住所が必要なのと同じように、ネットワークの世界でもデータを特定の機器に届けるためにIPアドレスが必要になる。

### 1-2. IPアドレスの長さと表記方法
現在の主流であるIPv4において、IPアドレスは **32ビットの正整数値** で表される。
そのため、以下のようになる。

```
10101100000001010010001000001011
```

しかし、このままでは人間にはわかりづらいので、 **8ビットずつ4組に分けて、その境目にドットを入れて10進数で表記する。**
この表記方法を「ドット・デシマル・ノーテーション」と呼ぶ。

```
# 本来の形
10101100000001010010001000001011

↓

# ドットで8ビットずつに分ける
10101100.00000101.00100010.00001011

↓

# 10進数表記にする
172.20.1.1
```

### 1-3. IPアドレスはNICに設定される
**IPアドレスは「ホスト」に対してではなく、NIC（ネットワークインターフェースカード）ごとに割り当てられる。**
通常は1NIC-1IPアドレスになるが、1つのNICに複数のIPアドレスを割り当てることが可能だったり、複数のNICを備える機器（ルータなど）が存在する。

（図）IPアドレスはNICに割り当てられる
![ipaddress.001.jpg](https://qiita-image-store.s3.amazonaws.com/0/2813/f3d28f0c-7e0b-7d33-c631-15ec09ebe814.jpeg "IPアドレスはNICに割り当てられる")

### 1-4. 割り当てできないIPアドレス
IPアドレスの中にはホストに割り振ることができないアドレスが存在する。
それぞれ特別な意味をもつため、実際のホストに割り振ることができなくなっている。

#### 1-4-1. ネットワークアドレス
ネットワーク自体を表すアドレスのこと。
ネットワークアドレスは、ホスト部のビットが全て0になる。
例えば、以下のIPアドレスは全てネットワークアドレスである。

- 10.0.0.0（クラスA）
- 172.16.0.0（クラスB）
- 192.168.1.0（クラスC）

#### 1-4-2. ブロードキャストアドレス
そのネットワーク内の全てのホストにデータを送信するために使われるアドレスのこと。
ブロードキャストアドレスは、ホスト部のビットが全て1になる。
実際には、通信相手を特定できない場面で使われることが多いようで、そういう場面は結構あるらしい。

以下のIPアドレスは全てブロードキャストアドレスである。

- 10.255.255.255（クラスA）
- 172.16.255.255（クラスB）
- 192.168.1.255（クラスC）

#### 1-4-3. ループバックアドレス
自分自身を示すIPアドレスのこと。
アドレスの始まりが127のものは、ループバックアドレス用として予約されている。
IPv4では127.0.0.1が使われている（ホスト名はlocalhost）。

## 2. IPアドレスの構成
IPアドレスは32ビットでひとかたまりというわけではなく、 **ネットワーク部とホスト部に分けられている。**
IPアドレスは、対象となる **ホスト** がどの **ネットワーク** に所属しているのかという情報を表現しているため、このように構成されている。

（図）IPアドレスはネットワーク部とホスト部から構成される
![ipaddress.002.jpg](https://qiita-image-store.s3.amazonaws.com/0/2813/e64d4fe9-8f5a-c3b9-0a88-cfa431976385.jpeg "IPアドレスはネットワーク部とホスト部から構成される")


住所に喩えると、ネットワーク部は「東京都」のような地域エリアを表し、ホスト部は個々の家を表す。
前半のネットワーク部でネットワークを識別し、後半のホストアドレスで該当するネットワーク内のどのホストかを識別してデータを送受信している。

### 2-1. ネットワーク部とホスト部の識別方法
上述のとおり、IPアドレスはネットワーク部とホスト部とから構成されている。
**しかし、32ビットの内どこからどこまでネットワーク部でどこからどこまでがホスト部なのかは固定されておらず、IPアドレスによって異なる。この点がIPアドレスのややこしいところでもある。**

これには、歴史的に以下の2種類の区別方法が存在している。
1. クラスによる分類（クラスフルアドレス）
2. サブネットマスクによる分類（クラスレスアドレス）

クラスによる分類は初期のIPでの区別方法であり、現在はサブネットマスクによる分類方法が主流になっている。 **そのため、基本的にはサブネットマスクによる区別方法で考えれば良い。**

## 3. クラスフルアドレス
クラスフルアドレスでは、IPアドレスはA〜Eの5種類のクラスに分類されている。
IPアドレスの先頭1~4ビットまでのビット列の組み合わせによって、どのクラスに属するかを判別することができる。
5つのクラスのうち、ユーザに割り当てられるクラスはA~Cの3つだけ。


| クラス | 先頭ビット列 | アドレス範囲（10進数） | ネットワークアドレス長 | ホストアドレス長 | 割り当て可能なホスト数 | 補足 |
|:-----------|:------------|:------------|:------------|:------------|:------------|:------------|
| クラスA | 0 | 0.0.0.0 ~ 127.255.255.255 | 8ビット | 24ビット | 16777214個 | - |
| クラスB | 10 | 128.0.0.0 ~ 191.255.255.255 | 16ビット | 16ビット | 65534個 | - |
| クラスC | 110 | 192.0.0.0 ~ 223.255.255.255 | 24ビット | 8ビット | 254個 | - |
| クラスD | 1110 | 224.0.0.0 ~ 239.255.255.255 | - |  - | - | IPマルチキャスト用途 |
| クラスE | 1111 | 240.0.0.0 ~ 255.255.255.255 | - |  - | - | 研究用途 |

（図）IPアドレスのクラス
![ipaddress.003.jpg](https://qiita-image-store.s3.amazonaws.com/0/2813/9fbb17e3-0f7c-5dfd-9e31-e22d26b052fd.jpeg "IPアドレスのクラス")


先頭ビット列をみるか、10進数のアドレス範囲を見れば対象のIPアドレスがどのクラスかわかる。そして、クラスがわかればネットワーク部とホスト部が必然的にわかるようになっている。 **クラスフルアドレスはわかりやすい。**

### 3-1. クラスフルアドレスの問題点
**クラスフルアドレスの問題点は大雑把すぎて無駄が多くなってしまうところにある。**
ネットワーク部が同じコンピュータは全て同一のリンクに接続する必要があるので、クラスAの場合だと1ネットワークに約1600万台(2の24乗)のホスト、クラスBだと約65000台(2の16乗)のホストを接続することが可能になる。しかし、どちらも1ネットワークに接続するホスト数としては多すぎる。
インターネットが大きくなるにつれてネットワークアドレスが不足し、クラスフルアドレスをそのまま使うことは許されなくなり、無駄を小さくする仕組み「サブネットマスク」が導入された。

## 4. サブネットマスク
先にも述べたが、 **クラスレスアドレスの現在、IPアドレスはネットワーク部とホスト部の切れ目が定まっていない。**
サブネットマスクはIPアドレスとセットで使われるもので、IPアドレスの32ビットのうち「どこからどこまでがネットワーク部でどこからどこまでがホスト部であるか」を示すもの（クラスレスアドレスの場合、サブネットマスクの指定は必須）。

サブネットマスクを用いることで、ネットワーク部とホスト部の切れ目を自由に決めることができるようになる。クラスフルアドレスでは8ビット（クラスA）、16ビット（クラスB）、24ビット（クラスC）のいずれかでしかネットワーク部とホスト部の切れ目を設定できなかったが、この縛りがなくなるわけである。

### 4-1. サブネットマスクの構成
サブネットマスクは、IPアドレス同様に32ビットの正整数値になる。
**IPアドレスのネットワーク部を表すビット部分が1になり、ホスト部を表すビット部分が0になる。**
そのため、最初にネットワーク部を示す「1」が連続し、その後にホスト部を示す「0」が連続する形になる。

例えば、クラスCのように先頭24ビットがネットワーク部で残り8ビットをホスト部にしたい場合、サブネットマスクは以下。

```
11111111.11111111.11111111.00000000
```

これを10進数にすると`255.255.255.0`になる。

先頭26ビットをネットワーク部にしたい場合は以下。

```
11111111.11111111.11111111.11000000
```

これを10進数にすると`255.255.255.192`だ。

※ 余談
 IPアドレスは8ビットごと4つにドットで分けて10進数で書いていると思うが、サブネットマスクを使う場合ドットで分かれた部分がネットワーク部とホスト部の区切りと関係なくなるので、ややこしい。ドットで区切られているとその区切りに何か意味があると思い込んでしまうが、それはクラスフルアドレスの時にしか有効じゃなかったのでした。

### 4-2. サブネットマスクの表記方法
現在、サブネットを表すには2つの表記方法が存在する。
例として、172.20.100.52の上位26ビットがネットワークアドレスの場合の例を示す。

１. IPアドレスと別にサブネットマスクをそのまま記述する

```
IPアドレス: 172.20.100.52
サブネットマスク: 255.255.255.192
```

２. CIDR表記
IPアドレスの後ろにスラッシュ記号を書き、その後ろにネットワーク部のビット数を記述する

```
172.20.100.52 /26 
```

### 4-3. ネットワークアドレスの求め方
クラスフルアドレスの場合はクラスがわかればネットワークアドレスが簡単に特定できたが、サブネットマスクを用いるクラスレスアドレスの場合はそうはいかなくなる。

クラスレスアドレスのネットワークアドレスは、IPアドレスとサブネットマスクを2進数に変換し、[AND演算](http://www.sophia-it.com/content/AND%E6%BC%94%E7%AE%97) をすると導き出される。

例えば、以下のIPアドレスとサブネットマスクを設定された端末があったとして、この端末が所属するネットワークアドレスを求めたいとしよう。

```
IPアドレス：199.32.10.85
サブネットマスク：255.255.255.192
```

この場合、以下のような計算をして求める。
まずそれぞれを2進数に変換する。

```
IPアドレス：11000111 00100000 00001010 01010101
サブネットマスク：11111111 11111111 11111111 11000000
```

そしてこれらをAND演算する。

```
11000111 00100000 00001010 01010101
11111111 11111111 11111111 11000000
↓
11000111 00100000 00001010 01000000
```

これを10進数に変換する。

```
11000111.00100000.00001010.01000000
↓
199.32.10.64
```

上のような計算を経て、この端末が所属するネットワークアドレスは`192.32.10.64/26`ということが求められた。

ちなみに、クラスフルアドレスの場合は計算不要で簡単に求めることができる。
例えば、`192.168.33.10`というIPアドレスがあったとする。
192から始まるので、クラスCのIPアドレスということがわかり、ネットワーク部が24ビット分ということもわかる。ネットワークアドレスはホスト部のビットが全て0になるアドレスなので、`192.168.33.0`がネットワークアドレスになる。

### 4-4. 例：サブネットマスクでどの程度アドレスの無駄を省けるか
例として、500台のホストが接続できるネットワークを構築したいとする。
この際に、クラスフルアドレスでネットワーク構築をした場合とサブネットマスクを用いてネットワーク構築をした際に、どの程度アドレスの無駄に差が出るか計算してみる。

#### 4-4-1. クラスフルアドレスの場合
まず、クラスCは1ネットワークにホストが254台しか繋ぐことができないので、クラスBを使うことになる。クラスBは1ネットワークに65534台のホストを繋ぐことができるので要件を満たせる。
この場合、使われないホスト数は65534-500で **65034** になる。

#### 4-4-2. サブネットマスクを使う場合
サブネットマスクを使う場合、ネットワーク部とホスト部の区切りを自由に決めることができる。
クラスCのように8ビット分をホスト部として使った場合は254台なので、9ビットにしてみる。9ビットにすると510台（2の9乗 - 2）のホストを繋ぐことができるので要件を満たすことができる。
この場合、使われないホスト数は510-500で **10** になる。

少し極端な例だが、サブネットマスクを使った場合、クラスフルアドレスと比較して65034-10で **65024** ものホストアドレスの無駄を省くことができている。


### 4-5. サブネットマスクの効果を体感する

:exclamation: :exclamation: **20160207追記：この章（4-5）は誤りを含んでいる可能性があります。確認中...。** :exclamation: :exclamation: 

ぱっと見（クラスフルアドレス的には）、同一ネットワークに属しているように見えるIPアドレスも実際は別ネットワークに属しているということがある。`ping`コマンドなどを実行すればわかるが、別ネットワークに属している場合は通信ができない。
※ 個人的な感想だが、この辺りの動きを体感できた時にサブネットマスクの理解が進んだように感じた。


#### 4-5-1. 例: サブネットマスクの値が異なる
端末1と端末2があったとして、それぞれ以下のIPアドレスを持っていたとする。

```
端末1: 192.168.1.100/25
端末2: 192.168.1.200/24
```

結論から言うと、端末2➔端末1への通信は可能だが、端末1➔端末2の通信はできない状態にある。
それぞれのネットワークアドレスを2進数で表記すると以下のような違いが見て取れる。

```txt:それぞれのネットワークアドレス（２進数）
端末1: 11000000 10101000 00000001 0
端末2: 11000000 10101000 00000001
```

ホストに割り当てられるIPアドレスの範囲は、ネットワークアドレスとして使われていないビット部分になるので以下のようになる。

```txt:割り当て可能なIPアドレス
端末1が所属するネットワーク: 192.168.1.1 ~ 192.168.1.126
端末2が所属するネットワーク: 192.168.1.1 ~ 192.168.1.254
```

端末1が所属するネットワークで割り当て可能なIPアドレスは192.168.1.1 ~ 192.168.1.126なので、端末2の192.168.1.200というIPアドレスは端末1にとっては別のネットワークのIPアドレスに見えている。そのため、通信ができなくなっていた。

#### 4-5-2. 例: サブネットマスクの値が同じ
端末1と端末2があったとして、それぞれ以下のIPアドレスを持っていたとする。

```
端末1: 192.168.1.5/28
端末2: 192.168.1.21/28
```

例1同様、この端末たちも別ネットワークに属しているので通信ができない状態にある。
2進数にしてみる。

```txt:それぞれのネットワークアドレス（２進数）
端末1: 11000000 10101000 00000001 0000
端末2: 11000000 10101000 00000001 0001
```

右端の数値が異なることがわかると思う。
例1同様、ホストに割り当てられるIPアドレスの範囲も計算してみる

```txt:割り当て可能なIPアドレス
端末1が所属するネットワーク: 192.168.1.1 ~ 192.168.1.14
端末2が所属するネットワーク: 192.168.1.17 ~ 192.168.1.30
```

端末1にとって、端末2のIPアドレスが別のネットワークのものである。同様に、端末2にとっても端末1のIPアドレスは別ネットワークのものになっている。そのため、双方からの通信ができなくなっていた。

#### 4-5-3. つまり..
クラスフルアドレスのように、同一ネットワークにあるのかを見た目ですぐに判断できないことが多いので、2進数に変換して上のような計算を行う必要がある。
[サブネットマスク計算(IPv4)／サブネット一覧（早見表）](http://note.cman.jp/network/subnetmask.cgi)のような便利なWebツールもある。マジ便利。

## 5. グローバルアドレスとプライベートアドレス
IPアドレスにはグローバルアドレスとプライベートアドレスという区分けが存在する。
グローバルアドレスはインターネットに接続された機器に一意に割り当てられるIPアドレスのこと。
一方プライベートアドレスはインターネットに接続しない独立したネットワークにおいて、接続された機器に一意に割り当てられるIPアドレスのこと。
接続しているネットワークがインターネットなのか、ローカルネットワークなのかという点が異なる。

### 5-1. プライベートアドレスの範囲
プライベートアドレスは以下のように範囲が定められている。
**以下の範囲に含まれるIPアドレスは全てプライベートアドレスで、この範囲外のIPアドレスはグローバルアドレスになる。**

| クラス | 範囲 | ネットワーク数 |
|:--|:--|:--|
| クラスA | 10.0.0.0 ~ 10.255.255.255 (10.0.0.0/8) | 1 | 
| クラスB | 172.16.0.0 ~ 172.31.255.255 (172.16.0.0/12) | 16 | 
| クラスC | 192.168.0.0 ~ 192.168.255.255 (192.168.0.0/16) | 256 |

  
■ 参考

- 『マスタリングTCP/IP 入門編』第4章
- 『ネットワーク超入門講座』CHAPTER2
- 『おうちで学べるネットワークのきほん』Chapter2
- [3 Minutes Networking No.21](http://www5e.biglobe.ne.jp/%257eaji/3min/21.html)
- [3 Minutes Networking No.22](http://www5e.biglobe.ne.jp/%257eaji/3min/22.html)
- [3 Minutes Networking No.23](http://www5e.biglobe.ne.jp/%257eaji/3min/23.html)
- [ネットワークの基礎を学習する CCNA対策講座（8）：サブネットマスクの計算をマスターする (2/2) - ＠IT](http://www.atmarkit.co.jp/ait/articles/0805/15/news134_2.html)
- [第10回　論理演算で考えるネットマスクの仕組み：教科書には載っていない ネットワークエンジニアの実践技術｜gihyo.jp … 技術評論社](http://gihyo.jp/admin/serial/01/net_prac_tech/0010)
- [IP アドレス](http://www14.plala.or.jp/campus-note/network_security/network_basic/ip_address.html)