IPアドレスとサブネットマスク - AWS VPCへ挑む前の下準備Part2-

# はじめに
AWSのVPCを学んでいると「そもそもネットワークの知識がないと無理ゲーじゃない？」「2進数と10進数の違いって？」「IPアドレスとサブネットマスクって？」といった非常に基礎的なところから積み上げないと、ただの暗記になってしまうと思ったため、2回に分けて整理します。

今回は第二弾で「IPアドレスとサブネットマスクとは」を扱います。
前回の第一弾はこちらから。

https://qiita.com/channnnsm/items/5e64d6b49cfe81a11037

# IPアドレスとは
IPアドレス（Internet Protocol Address）は、インターネットやローカルネットワーク上でデバイスを識別するための一意のアドレスです。IPアドレスには主に2つのバージョンがあります。
1. IPv4（Internet Protocol version 4）
    - 32ビットのアドレス空間を持ち、通常は4つの10進数で表記される
    - 各10進数は「0から255の範囲」で、ドット(`.`)で区切られる
    - 例: `172.16.0.0`、`255.255.255.255`

2. IPv6（Internet Protocol version 6）
    - 128ビットのアドレス空間を持ち、通常は8つの16進数で表記される
    - 各16進数はコロン(`:`)で区切られる
    - 例: `2001:0db8:85a3:0000:0000:8a2e:0370:7334`

IPv4のアドレス枯渇問題（約43億個）を解決するために、今ではIPv6が使われています。

## IPアドレスの書き方
基礎を理解するため、IPv4で整理します。
- **IPアドレスは4つのオクテット（0-255の範囲の数字）で構成される**
  - 32ビットを表すと、2進数で以下のようになる
  - `10101100000100000000000000000000`
  - 人間が読みやすいように、8ビットずつ4組に分け「`.`」で区切る
  - `10101100.00010000.00000000.00000000`
  - 2進数だと長くなってわかりづらいので、10進数にする
  - `172.16.0.0`
  - これで2進数で８桁で書いていたのが、10進数で最大3桁で抑えられるように！便利！

- **オクテットとは**
  - 8ビット（1バイト）で構成されるデータの単位のこと
  - 各オクテットは8ビットの2進数で表現される
  - ビットが8つ集まったものがオクテット

- **ビットとバイトとは**
  - 「ビット」とは2進数の1桁のこと、「バイト」とは2進数の8桁のこと
  - つまり、8ビット＝1バイトですね
  - 先の例は、8ビットの2進数＝1バイトの2進数、どちらでも呼べます
      - ちなみに「NINTENDO 64」の64は`64ビットCPU`が名前の由来だそう
      - 64ビットで表現できる最大の値は、`18,446,744,073,709,551,615`（約1844京）

## そもそも2進数とは
2進数（バイナリ）は、0と1の2つの数字を使って数を表現する方法です。10進数（通常の数の表し方）では、各桁が0から9までの数字を使いますが、2進数では各桁が0または1しか使いません。

| 2進数 (元の数) | + 1 | 2進数 (結果) | 10進数 (結果) |  
|----------------|-----|--------------|---------------|  
| 0              | + 1 | 1            | 1             |  
| 1              | + 1 | 10           | 2             |  
| 10             | + 1 | 11           | 3             |  
| 11             | + 1 | 100          | 4             |  
| 100            | + 1 | 101          | 5             |  
| 101            | + 1 | 110          | 6             |  
| 110            | + 1 | 111          | 7             |  
| 111            | + 1 | 1000         | 8             |  
| 1000           | + 1 | 1001         | 9             |  

ちなみに、10進数の10や100と区別するために、2進数の10を「イチ・ゼロ」と読み、100を「イチ・ゼロ・ゼロ」と読むそうです。

## 割り当てできないIPアドレス
特定の用途のために予約されており、インターネット上での通常のデバイスへの割り当てには使用されない代表例が以下です。

- プライベートIPアドレス
    - `192.168.0.0/16`: 家庭用ルーターや小規模ネットワークなど　例: `192.168.1.1`
    - `10.0.0.0/8`: 大規模な企業ネットワークなど　例: `10.0.0.1`
    - `172.16.0.0/12`: 中規模のネットワークなど　例: `172.16.0.1`
- ループバックアドレス
    - `127.0.0.1`: 自分自身を指すアドレスで、テストや開発環境など使用される
- リンクローカルアドレス
    - `169.254.0.0/16`: DHCPサーバーからIPアドレスを取得できなかった場合に自動的に割り当てられるアドレス

上記アドレスは、ネットワークの設定やトラブルシューティングの際に見る機会が多そうとのことです。

# サブネットマスク
サブネットマスクは、IPアドレスを**ネットワーク部分**と**ホスト部分**に分けるための32ビットの数値です。ネットワーク内でのIPアドレスの範囲を決定し、「どの部分がネットワークアドレスで、どの部分がホストアドレスであるか」を示します。

サブネットマスクは通常、IPアドレスと同じ形式で表記され、4つの10進数で表されます。各10進数は0から255の範囲で、ドットで区切られます。サブネットマスクのビットは、ネットワーク部分を示すために連続した1のビットが並び、その後にホスト部分を示す0のビットが続きます。

例えば、以下のようなサブネットマスクがあります：
- `255.255.255.0`: これは一般的なサブネットマスクで、最初の3つのオクテット（24ビット）がネットワーク部分を示し、最後のオクテット（8ビット）がホスト部分を示します。この場合、ネットワーク内で最大254のホストを持つことができます。
- `255.255.0.0`: ここでは、最初の2つのオクテット（16ビット）がネットワーク部分を示し、残りの2つのオクテット（16ビット）がホスト部分を示します。

サブネットマスクはネットワーク内でのデータの送受信を可能にするために必要になります。

## どうやってネットワーク部分とホスト部分を分けているの？
サブネットマスク自体は、ネットワーク部分を示す連続した1のビットと、ホスト部分を示す連続した0のビットで構成されています。サブネットマスクの1のビットがどこまで続くかによって、ネットワーク部分とホスト部分が決まります。

例として、サブネットマスク `255.255.255.0` で見てみると、
- 2進数で表すと、`255.255.255.0` は `11111111.11111111.11111111.00000000` になります。
- ここで、最初の24ビットが1であるため、IPアドレスの最初の24ビットがネットワーク部分を示します。
- 残りの8ビットが0であるため、これがホスト部分を示します。

このように、サブネットマスクの1のビットが続く部分がネットワーク部分で、0のビットが続く部分がホスト部分です。

![](https://storage.googleapis.com/zenn-user-upload/bed7893c3ea9-20250222.png)

## AWSのサブネットマスク
AWSでは、サブネットマスクはCIDR（Classless Inter-Domain Routing: サイダー）表記を使用して表現されます。CIDR表記は、IPアドレスの後に**スラッシュ（`/`）とネットワークビットの数**を付ける形式です。これにより、ネットワーク部分のビット数を直接指定できます。
※CIDR＝IPアドレスの範囲を柔軟に指定するための表記方法

例えば、以下のように表現されます：
- **/24の場合**: `192.168.1.0/24`: これは、サブネットマスク `255.255.255.0` に相当します。ネットワーク部分が`24ビット`で、ホスト部分が`8ビット`です。
- **/16の場合**: `10.0.0.0/16`: これは、サブネットマスク `255.255.0.0` に相当します。ネットワーク部分が`16ビット`で、ホスト部分が`16ビット`です。

AWSでVPC（Virtual Private Cloud）やサブネットを設定する際には、このCIDR表記を使用してIPアドレス範囲を指定するので、覚えておく必要がありますね。

ちなみに、勘違いしていたこととして、IPアドレスのドットで区切られた部分（オクテット）を見たら簡単やんと思っていたのですが、CIDRではその区切りは必ずしもネットワーク部とホスト部の境界を示すものじゃないことが判明しました。

CIDRのメリットでもあると思いますが、ネットワーク部とホスト部の境界をサブネットマスクによって柔軟に決定できるようになったためです。

たとえば、
- `192.168.1.0/26` というCIDR表記では、サブネットマスクは `255.255.255.192` となる
- `11111111.11111111.11111111.11000000`
- 最初の26ビットがネットワーク部分を示す。※24ビットじゃない
- この場合、ネットワーク部とホスト部の境界はオクテットの途中にある

なので、CIDRを使用する場合は、ドットで区切られたオクテットの境界にとらわれず、サブネットマスクのビットパターンに基づいてネットワーク部とホスト部を判断することが重要というわけですね。

そもそもサブネットマスクをなぜ設定する必要があるのかというと、同じネットワークとして扱うIPアドレスの範囲を指定することで、データの送受信を適切に行えるようにするため。この恩恵として効率的なルーティングができたり、ネットワークの分割と管理がしやすくなり、セキュリティの強化にもつながる。良いことづくし。

# おわりに
２回に分けてネットワークの基礎を整理しました。
オクテット、ビット・バイト、2進数と10進数、この辺りの概念的なことが理解できると、ただのバイナリの羅列じゃなく、意味を感じられるようになりました。

これでVPCの理解をさらに深めていきたいと思います。