IPv4のクラスフルアドレッシングを学ぶと、次のような疑問が出てきます。
- そもそも「アドレッシング」とは何か
- 「クラスフル」とは何を意味するのか
- クラスA・B・Cは何が違うのか
- なぜクラスAは「大規模ネットワーク向け」なのか
-
0、10、110、1110は何を表しているのか - なぜクラスDは
224.0.0.0~239.255.255.255なのか - クラスDにも「ホスト部」はあるのか
- プライベートIPアドレスとクラスは同じ分類なのか
- 現在でもクラスA/B/Cでネットワークを設計するのか
この記事では、これらを個別に暗記するのではなく、 IPv4の32bitを先頭からどう解釈するか という一本の流れで整理します。
この記事で扱うクラスフルアドレッシングは歴史的なIPv4の方式です。現在のネットワーク設計では、基本的にCIDRによるクラスレスな表現を使います。クラスA〜Eは、IPv4アドレス設計の歴史や現在のCIDRを理解するための前提知識として扱います。
そもそもアドレッシングとは何か
addressing は、直訳すると「アドレスを付けること」「アドレスを扱うこと」です。
IPネットワークの文脈では、単にIPアドレスの数字そのものを指すのではなく、
- IPアドレスをどのような構造で解釈するか
- どの部分をネットワークの識別に使うか
- どの部分をネットワーク内のホストの識別に使うか
- どの範囲のアドレスを、どの用途に割り当てるか
といった、 IPアドレスの構成・割当て・解釈の方法 を含む言葉として考えると分かりやすくなります。
例えばIPv4アドレスが、
192.168.1.10
だったとしても、この数字だけでは、
どこまでがネットワークを表す部分なのか
どこからがホストを表す部分なのか
は決まりません。
そこで、アドレスをどのように区切って解釈するかというルールが必要になります。
クラスフルアドレッシングとは何か
classful addressing は、文字どおり クラスを使うアドレッシング方式 です。
IPv4アドレスをClass A、B、Cなどに分類し、クラスごとにネットワーク部とホスト部の長さをあらかじめ固定します。
Class A
[ネットワーク側 8bit][ホスト部 24bit]
Class B
[ネットワーク側 16bit][ホスト部 16bit]
Class C
[ネットワーク側 24bit][ホスト部 8bit]
つまり、クラスフルアドレッシングでは、
IPv4アドレス
↓
先頭ビットからクラスを判定
↓
クラスによって区切り位置が決まる
↓
ネットワーク部とホスト部を解釈する
という流れになります。
ここで classful の -ful は「〜を持つ」という意味なので、
classful
= class を持つ
= クラスに基づいて扱う
と考えると名前の意味も理解しやすくなります。
これに対して現在広く使われているCIDRは Classless Inter-Domain Routing です。
classless は「クラスを使わない」という意味で、Class Aなら /8、Class Bなら /16 のような固定的な区切りに縛られず、 /20 や /27 のように必要な長さを指定できます。
この違いを最初に押さえておくと、その後に出てくるClass A〜EやCIDRの説明がつながりやすくなります。
先に結論
まず全体を表にすると、次のようになります。
| クラス | 先頭ビット | 第1オクテットの範囲 | A〜Cでのホスト部 | 主な意味 |
|---|---|---|---|---|
| A | 0 |
0〜127 | 24bit | 大規模ネットワーク |
| B | 10 |
128〜191 | 16bit | 中規模ネットワーク |
| C | 110 |
192〜223 | 8bit | 小規模ネットワーク |
| D | 1110 |
224〜239 | なし | IPv4マルチキャスト |
| E | 1111 |
240〜255 | なし | 予約領域 |
まず全体像をつかむなら、次の対応を押さえておくと理解しやすいです。
A = 0 → ホスト部24bit → 大規模
B = 10 → ホスト部16bit → 約65,000台
C = 110 → ホスト部 8bit → 254台
D = 1110 → マルチキャスト
E = 1111 → 予約領域
ただし、この表だけを暗記すると「なぜ?」が残ります。ここから順番に仕組みを見ていきます。
IPv4アドレスは32bit
IPv4アドレスは 32bit の値です。
人間が読みやすいように、8bitずつ4つに区切って10進数で表記します。
192.168.1.10
192 168 1 10
↓ ↓ ↓ ↓
8bit 8bit 8bit 8bit
8bit × 4 = 32bit
この8bit単位のまとまりを オクテット と呼びます。
例えば 172.16.1.10 の第1オクテットである 172 を2進数にすると、次のようになります。
172 = 10101100
したがってIPv4アドレス全体は、
172.16.1.10
10101100.00010000.00000001.00001010
と表せます。
10進数を8bitの2進数へ直す
ここでは、いきなり
128 64 32 16 8 4 2 1
を暗記するのではなく、 なぜこの数字が並ぶのか から考えます。
まず10進数の「桁の重み」を考える
例えば 172 という10進数は、
172
= 1 × 100
+ 7 × 10
+ 2 × 1
と分解できます。
10進数では、右から順番に、
1
10
100
1000
...
と桁の重みが10倍ずつ増えていきます。
指数で書くと、
10⁰ = 1
10¹ = 10
10² = 100
10³ = 1000
です。
つまり、10進数の各桁にはそれぞれ、
100 10 1
という「その桁が持つ価値」があります。
2進数では桁の重みが2倍ずつ増える
2進数では、使える数字は 0 と 1 だけです。
そして各桁の重みは、右から順番に2倍ずつ増えます。
1 2 4 8 16 32 64 128
8bitとして左から並べると、
128 64 32 16 8 4 2 1
になります。
これはすべて2の累乗です。
128 = 2⁷
64 = 2⁶
32 = 2⁵
16 = 2⁴
8 = 2³
4 = 2²
2 = 2¹
1 = 2⁰
つまり、
128 64 32 16 8 4 2 1
という数字が突然決められているわけではありません。
2進数の8桁それぞれが持つ重み を並べたものです。
2進数の0と1は「その重みを使うかどうか」
2進数では、
-
1= その桁の重みを使う -
0= その桁の重みを使わない
と考えると分かりやすくなります。
例えば、
00000101
なら、
128 64 32 16 8 4 2 1
0 0 0 0 0 1 0 1
なので、
4 + 1 = 5
です。
したがって、
00000101₂ = 5₁₀
となります。
172を2進数に変換する
では、10進数の 172 を8bitの2進数に変換します。
使える重みは、
128 64 32 16 8 4 2 1
です。
左から順番に、172を作るためにその重みを使えるか確認していきます。
128は使える
172 - 128 = 44
なので、128の桁は 1 です。
128 64 32 16 8 4 2 1
1
残りは 44 です。
64は使えない
残りは44なので、64は大きすぎます。
そのため64の桁は 0 です。
128 64 32 16 8 4 2 1
1 0
32は使える
44 - 32 = 12
なので、32の桁は 1 です。
128 64 32 16 8 4 2 1
1 0 1
残りは 12 です。
16は使えない
残りは12なので、16は使えません。
128 64 32 16 8 4 2 1
1 0 1 0
8は使える
12 - 8 = 4
なので、8の桁は 1 です。
128 64 32 16 8 4 2 1
1 0 1 0 1
残りは 4 です。
4は使える
4 - 4 = 0
なので、4の桁は 1 です。
残りが0になったので、2と1の桁はどちらも 0 になります。
128 64 32 16 8 4 2 1
1 0 1 0 1 1 0 0
したがって、
172 = 10101100₂
です。
逆に確認する
10101100 のうち、1 が立っている桁だけを足します。
128 64 32 16 8 4 2 1
1 0 1 0 1 1 0 0
なので、
128 + 32 + 8 + 4 = 172
となり、元の10進数と一致します。
なぜ1オクテットは0〜255なのか
8bitをすべて 0 にすると、
00000000
なので値は 0 です。
逆に、すべて 1 にすると、
11111111
となります。
各桁の重みをすべて足すと、
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1
= 255
です。
したがって、8bitで表せる範囲は、
00000000₂ = 0
~
11111111₂ = 255
となります。
これが、IPv4アドレスの各オクテットが 0 ~ 255 の範囲になる理由です。
変換の考え方をまとめる
10進数から2進数へ変換するときは、
128 64 32 16 8 4 2 1
を左から見て、
その重みを使える
↓
1
その重みは大きすぎる
↓
0
と判断していけば変換できます。
例えば 172 なら、
172
↓
128を使う → 1
64は使わない → 0
32を使う → 1
16は使わない → 0
8を使う → 1
4を使う → 1
2は使わない → 0
1は使わない → 0
なので、
10101100
です。
クラスは先頭ビットで決まる
クラスフル方式では、IPv4アドレスの先頭ビットを見てクラスを判定します。
つまり、識別パターンは次のようになります。
Class A = 0
Class B = 10
Class C = 110
Class D = 1110
Class E = 1111
1 が少しずつ増えていくので、比較的覚えやすい並びです。
「先頭ビットが0」はネットワーク部なのか
ここは混乱しやすいところです。
結論から言うと、
0、10、110は、まず どのクラスなのかを識別するためのビット です。ただし、クラスA〜Cではその識別ビットもネットワーク側の領域に含まれます。
RFC 791で示された構造を、簡略化すると次のようになります。
Class A
[0][ネットワーク番号 7bit][ホスト 24bit]
Class B
[10][ネットワーク番号 14bit][ホスト 16bit]
Class C
[110][ネットワーク番号 21bit][ホスト 8bit]
つまり、クラスAの先頭 0 は「ネットワーク番号そのもの」ではありません。
0 の役割は、
このアドレスはClass Aです
と知らせることです。
その 0 を含めた先頭8bitが、クラスフル方式ではネットワーク側として扱われます。
クラスA・B・Cのネットワーク部とホスト部
A〜Cを並べると、規模の違いが見えてきます。
重要なのは、 ホスト部が広いほど、1つのネットワークに多くのホストを収容できる ことです。
なぜクラスAは大規模ネットワーク向けなのか
クラスAではホスト部が24bitあります。
[ネットワーク側 8bit][ホスト部 24bit]
24bitで表せる組合せは、
2²⁴ = 16,777,216
です。
古典的なクラスフルネットワークでは、ホスト部がすべて0のアドレスと、すべて1のアドレスを通常のホストに割り当てないため、
2²⁴ - 2 = 16,777,214
となります。
同様に、
Class B
2¹⁶ - 2 = 65,534
Class C
2⁸ - 2 = 254
です。
したがって、
Class A
ホスト部 24bit
↓
約1,677万ホスト
↓
大規模
Class B
ホスト部 16bit
↓
約6.5万ホスト
↓
中規模
Class C
ホスト部 8bit
↓
254ホスト
↓
小規模
となります。
つまり、 クラスAが大規模と言われるのは、ネットワーク部が大きいからではなく、ホスト部を広く取れるから です。
クラスDは何が違うのか
クラスDは、クラスA〜Cと目的が違います。
クラスA〜Cは、基本的にネットワークとホストを識別するためのアドレスでした。
一方、クラスDは IPv4マルチキャストのグループを識別するためのアドレス です。
RFC 1112では、先頭4bitが 1110 のアドレスをClass Dのホストグループアドレスと定義しています。
Class D
[1110][残り28bit]
↑
クラス識別
残り28bitはマルチキャストグループの識別に使う
したがって、クラスDについて、
第2〜第4オクテットがホスト部
とは考えません。
A〜Cのような「ネットワーク部 + ホスト部」という通常の分割とは用途が異なるからです。
なぜクラスDは224〜239なのか
クラスDでは、第1オクテットの先頭4bitが 1110 に固定されています。
最小値を作るなら、残り4bitを全部0にします。
1110 0000
各bitの重みを見ると、
128 64 32 16 8 4 2 1
1 1 1 0 0 0 0 0
なので、
128 + 64 + 32 = 224
です。
最大値を作るなら、残り4bitを全部1にします。
1110 1111
したがって、
128 + 64 + 32 + 8 + 4 + 2 + 1 = 239
となります。
つまり第1オクテットは、
224 ~ 239
です。
さらに、クラスDで固定されるのは32bit全体の先頭4bitだけなので、範囲の最大値を考えると残りのbitをすべて1にできます。
11101111.11111111.11111111.11111111
10進数へ直すと、
239.255.255.255
です。
したがってClass Dの範囲は、
224.0.0.0 ~ 239.255.255.255
となります。
なぜ第2〜第4オクテットは255まで行けるのか
1オクテットは8bitです。
8bitをすべて1にすると、
11111111
です。
これは、
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1
= 255
です。
そのため、IPv4の各オクテットは10進数では基本的に 0 ~ 255 の範囲になります。
クラスDでは、
1110xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
の先頭4bitだけが固定されています。
そのため範囲上の最大値は、
11101111.11111111.11111111.11111111
すなわち、
239.255.255.255
になるわけです。
マルチキャストとは何か
マルチキャストは、 特定のグループに参加している複数の受信者へ同じデータを届ける通信 です。
ユニキャスト、ブロードキャストと比較すると分かりやすくなります。
これはユニキャストです。
これはブロードキャストのイメージです。
これはマルチキャストのイメージです。
Class Dのアドレスは、この「どのマルチキャストグループ宛てか」を表すために使われます。
クラスEとは
クラスEは先頭4bitが 1111 の領域です。
1111xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
第1オクテットは、
240 ~ 255
になります。
歴史的には、将来の利用などのために予約された領域として扱われてきました。
基本的な整理として、
Class E = 予約領域
くらいの理解でまず十分です。
プライベートIPアドレスは「別の分類」
よくある誤解が、
Class D = プライベートIP
というものです。
これは違います。
クラスA〜Eは、IPv4アドレスを先頭ビットなどで分類する歴史的な方式です。
一方、プライベートIPアドレスは、 インターネット上でグローバルに経路制御する用途ではなく、プライベートネットワーク内で使うために予約されたアドレス範囲 です。
RFC 1918で定められている代表的な範囲は次の3つです。
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
関係を分けて考えると理解しやすくなります。
つまり「Class D」と「プライベートIP」は、そもそも分類している観点が違います。
現在はCIDRを使う
ここまで説明したClass A・B・Cの考え方は、現在のネットワーク設計では基本的に使われません。
理由の一つは、クラスフル方式ではネットワークの大きさが粗すぎることです。
例えば、
Class C
最大254ホスト
では足りないネットワークが300台必要だったとします。
しかしClass Bへ移ると、
最大65,534ホスト
になり、大量のアドレスが余ってしまいます。
そこで登場したのが CIDR(Classless Inter-Domain Routing) です。
CIDRでは、ネットワーク部の長さを / の後ろに明示します。
192.168.1.0/24
なら、
先頭24bit = ネットワーク部
残り 8bit = ホスト側
です。
10.0.0.0/16
なら、
先頭16bit = ネットワーク部
残り16bit = ホスト側
です。
つまり現在は、
10.x.x.xだからClass Aなので必ず/8
とは考えません。
10.0.0.0/16 のように、クラスに縛られずネットワーク部の長さを指定できます。
JPNICも、現在はクラスレス方式によってIPv4アドレスが分配されていると説明しています。
クラスフルとCIDRの関係
クラスA〜Eは歴史的な分類であり、現在の実務ではCIDRの理解の方が重要です。
数字からクラスを見分ける
クラス問題では、次の対応をすぐ思い出せるようにしておくと解きやすくなります。
約250台
2⁸ - 2 = 254
なので、
Class C
です。
約65,000台
2¹⁶ - 2 = 65,534
なので、
Class B
です。
大規模ネットワーク
ホスト部24bit
↓
Class A
です。
マルチキャスト
1110
↓
224 ~ 239
↓
Class D
です。
よくある勘違い
「先頭の0はネットワーク番号?」
完全にはそうではありません。
0 はClass Aを示す クラス識別ビット です。
Class Aでは、
[0][ネットワーク番号 7bit][ホスト 24bit]
という構造になります。
「Class Dの第2〜第4オクテットはホスト部?」
違います。
Class Dはマルチキャストグループの識別用なので、A〜Cと同じ「ネットワーク部 + ホスト部」という分け方をしません。
「プライベートIPはClass D?」
違います。
プライベートIPはRFC 1918で定められた別の分類です。
「Class Aなら現在も必ず/8?」
違います。
クラスフル方式の歴史的なClass Aでは /8 相当でしたが、現在はCIDRを使います。
例えば、
10.0.0.0/16
のような設計も普通に行えます。
まとめ
IPv4のクラス分けは、個別の数字を丸暗記するより、先頭ビットから理解すると整理しやすくなります。
A = 0
B = 10
C = 110
D = 1110
E = 1111
A〜Cは、
ネットワーク側 | ホスト部
という構造を持ち、ホスト部の大きさによって1ネットワークあたりの規模が変わります。
A → Host 24bit → 大規模
B → Host 16bit → 約65,000
C → Host 8bit → 254
一方Class Dは、
1110 + マルチキャストグループ識別部分
であり、通常のホストアドレスではありません。
先頭 1110 から、
224.0.0.0 ~ 239.255.255.255
という範囲も自分で導けます。
そして現在の実務では、A/B/Cという固定的なクラスではなく、
192.168.1.0/24
10.0.0.0/16
のようなCIDRを使います。
クラスフルの仕組みを理解した上でCIDRへつなげると、単なる暗記ではなく、IPv4アドレス設計の変遷として理解できます。
参考資料
- JPNIC - インターネット10分講座 IPv4アドレス
- JPNIC - IPアドレス・AS番号関連 用語集
- LPI-Japan - IPアドレスのクラスについて
- RFC 791 - Internet Protocol
- RFC 1112 - Host Extensions for IP Multicasting
- RFC 1918 - Address Allocation for Private Internets
- RFC 4632 - Classless Inter-domain Routing
- IANA - IPv4 Multicast Address Space
- IANA - Private-use IP addresses