今さら人に聞けない IPv6 アドレスの表記方法とアドレスタイプについて

# アドレス表記の概要

|                       | IPv4            | IPv6                                     |
| --------------------- | --------------- | ---------------------------------------- |
| アドレス長              | 32 ビット        | 128 ビット                                |
| 進数                   | 10 進数表記      | 16 進数表記                                |
| 区切り文字              | `.` (ピリオド)   | `:` (コロン)                               |
| 区切る際のビット数       | 8 ビットごと      | 16 ビットごと                              |
| 区切ったあとのセクション数 | 4 つ            | 8 つ                                      |
| 表記例                 | `192.168.10.1`  | `fe80:0000:0000:0000:0394:a9b4:014d:7993` |

## 進数について補足
もちろん、コンピュータレベルではどちらも 2 進数で解釈されるが、一般的に表記する際やネットワークを設定する際には上記の進数が用いられる。

## 区切る際のビット数
IPv4 では、10 進数表記で、かつ 8 ビットごとピリオドで区切る表記法のため、ピリオドで区切られた各数値が `0` 〜 `255` の範囲で指定される。

IPv6 では、16 進数表記で表記するため、一つの数値 (`a` 〜 `f` の文字含め) が 4 ビット分を表している (16 進数 1 文字 = 2 進数 4 ビット分) 。そのため、コロンで区切られた各セクションが 4 桁ずつの範囲で指定される (4 ビット × 4 桁 = 16 ビット) 。

## 区切ったあとのセクション数
ピリオドやコロンで区切られた一つ一つのかたまりをセクションと呼ぶことにする。

IPv4 では 1 セクションごとに 8 ビットなので、セクションの数が 4 つで合計 32 ビットになる。

IPv6 では 1 セクションごとに 16 ビットなので、セクションの数が 8 つで合計 128 ビットになる。

IPv6 の場合、後に説明する省略記法を用いた場合は、表記上のセクション数が必ずしも 8 つになるとは限らないが、あくまで省略されているだけなので、セクション数が 8 つであることに変わりはない。



# 省略記法
IPv4 では 10 進数で表記していたが、IPv6 は IPv4 と比較してアドレス長が 4 倍になったので、より短い表記で済むように 16 進数で表記する。しかし、それでも長いので、省略記法が用意されている。

ルールは 2 つある。

1. セクションごとに、0 パディングは省略可能
    * 例: `0012` → `12`
    * ただし `0000` の場合は `0` とする
2. `0000:0000:0000` のように `0000` が連続している場合は `::` で省略可能
    * ただし `::` は 1 ヶ所にのみ使用可能
        * `0000` が連続する部分が複数ある場合は最も長い部分を `::` で省略する

## 例
以下に、省略されていない IPv6 アドレスがある。

```
fe80:0000:0000:0000:0394:a9b4:014d:7993
```

上記アドレスに 1 番のルールを適用すると、以下のようになる。

```
fe80:0:0:0:394:a9b4:14d:7993
```

さらに、2 番のルールを適用すると、以下のようになる。

```
fe80::394:a9b4:14d:7993
```



# プリフィックス表記
IPv4 と同様に、IPv6 でもプリフィックス部とインターフェース ID 部を区別するためにプリフィックス表記が用いられる。

プリフィックス部とインターフェース ID 部という名称は聞き馴染みがないかもしれないが、これは IPv4 でいうところのネットワークアドレス部とホストアドレス部のことである。IPv6 では名称が変更されているが、概念としては全く同じものと考えて良い。

| IPv4 での名称 | IPv6 での名称 |
| ------------ | ----------- |
| ネットワークアドレス | プリフィックス |
| ホストアドレス | インターフェース ID |

表記方法も IPv4 のときと同じで、以下のようなルールで表記する。

1. プリフィックス長は 10 進数で表記する
2. アドレスとプリフィックス長は `/` で区切る

## 例
以下に、プリフィックス長を含んだ IPv6 アドレスがある。

```
fe80::394:a9b4:14d:7993/64
```

省略記法を用いていると説明がややこしくなるので、一旦展開して表記する。

```
fe80:0000:0000:0000:0394:a9b4:014d:7993/64
```

末尾に `/64` と記載されているので、上位 64 ビットがプリフィックス部で、下位 64 ビットがインターフェース ID 部ということになる。

つまり、以下のようになる。

| プリフィックス部 | インターフェース ID 部 |
| -------------- | -------------------- |
| `fe80:0000:0000:0000` | `0394:a9b4:014d:7993` |



# アドレスの種類 (アドレスタイプ)
IPv6 は IPv4 の上位互換ではないため、完全に対応づけることはできないが、ある程度 IPv4 と似たような種類を持っているため、可能な限り IPv4 と紐付けて表で説明する。

| IPv6 での名称 | IPv4 での名称 | 説明 |
| --- | --- | --- |
| アンスペシファイドアドレス | アンスペシファイドアドレス | アドレス未割り当てのインターフェース (ホスト) に設定されるアドレス |
| ループバックアドレス | ループバックアドレス | 自分自身を指すアドレス |
| リンクローカルユニキャストアドレス | (該当なし) | ルータを超えない範囲内でのみ一意のアドレス |
| ユニークローカルユニキャストアドレス | プライベートアドレス | LAN 内でのみ一意のアドレス |
| マルチキャストアドレス | マルチキャストアドレス + ブロードキャストアドレス | 複数のアドレスに通信を行うためのアドレス |
| グローバルユニキャストアドレス | グローバルアドレス | インターネット上で一意のアドレス |

## リンクローカルとユニークローカルの違い
リンクローカルユニキャストアドレスとユニークローカルユニキャストアドレスの違いは、影響を及ぼす範囲が、一つのルータの範囲内か LAN 内の範囲内かの違いである。

「[いまさら聞けない！IPv6再入門: わかりやすい図解解説](https://amzn.to/3ttxtq4)」にわかりやすい図があったので抜粋する。

![](https://raw.githubusercontent.com/noraworld/developers-blog-media-ja/master/ipv6-addresses-representation-and-type/Screen%20Shot%202021-09-07%20at%2023.43.17.png)

「[いまさら聞けない！IPv6再入門: わかりやすい図解解説](https://amzn.to/3ttxtq4)」より抜粋

LAN 内にルータ A とルータ B がある場合、それぞれのルータの管轄内で一意に設定されるアドレスがリンクローカルユニキャストアドレスで、LAN 全体で一意に設定されるアドレスがユニークローカルユニキャストアドレスである。

IPv4 では、ルータごとに一意に設定されるアドレスタイプは存在しなかったので、IPv6 のリンクローカルユニキャストアドレスに該当するものはないが、LAN 全体で一意に設定されるアドレスにはプライベートアドレスが該当する。

## マルチキャストアドレスについて
リンクローカルとユニークローカルの違いに対比して、IPv6 では IPv4 でいうところのブロードキャストアドレスが存在しない。

では IPv6 でブロードキャスト通信をしたい場合はどうするかというと、代わりにマルチキャストアドレスを使用する。

つまり、IPv6 ではマルチキャストアドレスが、IPv4 のマルチキャストアドレスとブロードキャストアドレスを兼用しているというわけだ。

なお、マルチキャスト通信、ブロードキャスト通信の違いについては以下のサイトにわかりやすくまとめられている。

[ユニキャスト、マルチキャスト、ブロードキャストとは](https://www.infraexpert.com/study/networking8.html)

簡単にまとめると、以下の通りとなる。

| 通信方式 | 説明 |
| --- | --- |
| マルチキャスト通信 | 特定の複数のクライアントにデータを送信する手法 |
| ブロードキャスト通信 | LAN 内の全クライアントにデータを送信する手法 |

ブロードキャスト通信は、ARP や DHCP などで利用されるため、ネットワークの構築においてはマルチキャスト通信よりも馴染み深いかもしれない。

## アドレスタイプごとのアドレス空間

| 名称 | アドレス範囲 (プリフィックス表記 & IPv6 省略記法) | アドレス範囲 (わかりやすさ重視) |
| ------------------------------ | --------- | ---------------------------------------------------------------------------------- |
| アンスペシファイドアドレス         | `::0/128`   | `0000:0000:0000:0000:0000:0000:0000:0000`                                            |
| ループバックアドレス              | `::1/128`   | `0000:0000:0000:0000:0000:0000:0000:0001`                                            |
| リンクローカルユニキャストアドレス  | `fe80::/10` | `fe80:0000:0000:0000:0000:0000:0000:0000` 〜 `febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff`  |
| ユニークローカルユニキャストアドレス | `fc00::/7`  | `fc00:0000:0000:0000:0000:0000:0000:0000` 〜 `fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff` |
| マルチキャストアドレス            | `ff00::/8`  | `ff00:0000:0000:0000:0000:0000:0000:0000` 〜 `ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff`  |
| グローバルユニキャストアドレス      | `2000::/3`  | `2000:0000:0000:0000:0000:0000:0000:0000` 〜 `3fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff` |

参考までに IPv4 におけるアドレス空間を以下に示す。

| アドレスタイプ                 | アドレス範囲 (プリフィックス表記) | アドレス範囲 (わかりやすさ重視) |
| --------------------------- | --------------- | ----------------------------- |
| アンスペシファイドアドレス      | `0.0.0.0/32`      | `0.0.0.0`                        |
| ループバックアドレス           | `127.0.0.1/32`    | `127.0.0.1`                     |
| プライベートアドレス (クラス A) | `10.0.0.0/8`      | `10.0.0.0` 〜 `10.255.255.255` [^1]    |
| プライベートアドレス (クラス B) | `172.16.0.0/12`   | `172.16.0.0` 〜 `172.31.255.255` [^1]  |
| プライベートアドレス (クラス C) | `192.168.0.0/16`  | `192.168.0.0` 〜 `192.168.255.255` [^1]|
| マルチキャストアドレス          | `169.254.0.0/16` | `169.254.0.0` 〜 `169.254.255.255` [^1]|
| ブロードキャストアドレス        | ホストアドレス部のビットがすべて 1 のアドレス | |
| グローバルアドレス             | 上記以外 | |

[^1]: ホストアドレス部のビットがすべて 1 だとブロードキャストアドレスになってしまうので、厳密には `XXX.XXX.255.255` などは含まない。



# 参考サイト
* [IPv6 address types](https://www.ibm.com/docs/en/i/7.2?topic=concepts-ipv6-address-types)
* [What is the difference between IPv4 and IPv6?](https://www.juniper.net/us/en/research-topics/what-is-ipv4-vs-ipv6.html)



# 参考図書
* [いまさら聞けない！IPv6再入門: わかりやすい図解解説](https://amzn.to/3ttxtq4)