Dev Study
← ネットワークの仕組み
レッスン 4 / 13·約 16 分·第2期 ネットワークの仕組み

IPアドレスとサブネット — なぜ住所を2段に割るのか

リクエストがアプリケーションに届くまで
  1. ブラウザURL入力
  2. DNS名前→IP
  3. ルータ経路選択今ここ
  4. ロードバランサ振り分け
  5. Nginx受け口
  6. アプリ処理
  7. DB保存

DNSで宛先のIPアドレスが分かった後、そのアドレスがどう読まれるかを扱います。次回はこの読み方を前提に、ルータが経路を選ぶ規則(最長一致)へ進みます。

まず結論

IPアドレスは32ビットの1つの数ですが、先頭何ビットかを「どのネットワークか」、残りを「その中のどの機器か」として2段に読みます。この切れ目の位置を指定するのがサブネットマスクです。

切れ目は必ずビットの境界に来ます。「200台ぴったりの範囲」は作れません。これは実装の都合ではなく、次回の最長一致が成立するための条件そのものです。

? 読む前に予測

192.168.1.0/24 のネットワークには、256個のアドレスが含まれます。このうち実際に機器へ割り当てて使えるのは何個でしょうか。

当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。

抽象原理

1つの番号を、2つの問いに答えさせる

IPアドレスは 192.168.1.50 のように4つの数で書かれますが、実体は32ビットの1つの数です。4つに区切って書くのは人間が読みやすいようにしているだけで、機械にとっては区切りのない32桁の2進数です。

ここで素朴な疑問が出てきます。32ビットあれば約43億個のアドレスが表せるのに、なぜそれを「ネットワーク部」と「ホスト部」に割るのでしょうか。 全部を機器の通し番号にしてしまえば、単純で分かりやすいはずです。

理由は、途中の装置の立場を考えると見えてきます。パケットを中継するルータが知りたいのは、「この宛先はどの方向へ流せばよいか」ということだけです。最終的にどの1台かは、その方向の先にいる装置が判断すればよいのです。

もし43億個が全部ばらばらの通し番号だったら、ルータは43億行の対応表を持つしかありません。そこでアドレスの前半を「どのネットワークか」、後半を「その中のどの機器か」と読むことにします。こうすればルータは前半だけを見て判断でき、表は「ネットワークの数」で済みます。

住所と同じ発想です。郵便を運ぶ人は、市区町村までを見て仕分けをします。番地まで見るのは、最後の配達員だけです。

具体実物

切れ目はどこか — マスクが決める

では前半と後半の切れ目はどこにあるのでしょうか。これがアドレスの中には書かれていません。だから別に指定する必要があり、それがサブネットマスクです。

192.168.1.50/24 の /24 は「先頭24ビットがネットワーク部」という意味です。同じことを 255.255.255.0 というマスクの形でも書きます。両者は同じものの別表記です。

192.168.1.50/24 を32ビットで見る表
192. 168. 1. 50
2進数 11000000 10101000 00000001 00110010
マスク 11111111 11111111 11111111 00000000 (= 255.255.255.0 = /24)
└──────── ネットワーク部 ────────┘└─ ホスト部 ─┘
24ビット 8ビット

マスクの1が並んでいる部分がネットワーク部、0の部分がホスト部です。マスクは「どこまでが住所の前半か」を示す定規だと思ってください。

ホスト部が8ビットということは、2の8乗で256通りです。ところが実際に機器へ割り当てられるのは254個です。2つ足りません。

引かれる2つは、ホスト部が全0のものと全1のものです。ここが誤解の多いところなので、理由を正確に押さえます。RFC 950 は、全1のアドレスについて次のように定めています。

the address of all ones are to be interpreted as meaning "all", as in "all hosts"

つまり全1は「すべてのホスト宛て」という意味を持つ宛先表現です。RFC 919 も、36.255.255.255 は「ネットワーク36上の全ホスト」を意味すると述べています。「全員宛て」という意味で使われる番号を、特定の1台の名前にすることはできません。 全0の方は、そのネットワーク自体を指す表記として使われます。

✓ ここまでの確認

/24 のネットワークで使えるアドレスが254個である理由として、正しいのはどれですか。

抽象原理

なぜビットの境界でしか切れないのか

ここまでで「切れ目はマスクが決める」と述べました。ではマスクは自由に決められるのでしょうか。

決められません。 マスクには左から連続した1でなければならないという制約があります。RFC 4632 はこれを「唯一残された制約はマスクが left contiguous であること」と表現し、RFC 1812 はより具体的に「上位側に連続した1、下位側に連続した0が並び、その間に別のビットが混じらないこと」と述べています。

11111111 11111111 11111111 00000000 は許されますが、11111111 11111111 11111111 00001111 のような飛び飛びのパターンは許されません。

その結果、範囲の大きさは必ず2の累乗になります。

プレフィックス長と、収容できる機器の数表
プレフィックス長 全アドレス数 割り当て可能 ホスト部のビット数
/22 1024 1022 10
/23 512 510 9
/24 256 254 8
/25 128 126 7
/26 64 62 6
/27 32 30 5

ここから、実務でよく効く事実が出てきます。「200台ぴったりの範囲」は作れません。 /25 は126個しか入らず足りない。ひとつ上の /24 は254個で、54個余ります。余るのが分かっていても /24 を使うしかありません。

なぜこんな不便な制約があるのでしょうか。効率のためではなく、経路の判断を成立させるためです。

マスクが左詰めの連続した1であれば、範囲は「先頭何ビットが一致するか」という長さ1つの数字で表せます。/24 と /25 なら、25の方が細かい範囲だと数字の大小だけで判定できます。

もし飛び飛びのビットパターンが許されたら、この比較ができません。「先頭24ビットと末尾4ビットが一致する範囲」と「先頭25ビットが一致する範囲」のどちらが細かいのか、長さという一次元の量に還元できないので、大小関係が定義できないのです。

次回学ぶ最長一致は、当てはまった複数の経路から「最も長く一致しているもの」を選ぶ規則です。その規則が成り立つには、すべての範囲が長さという共通のものさしで比較できなければなりません。ビット境界でしか切れないという制約は、最長一致が成立するための前提条件なのです。

具体実物

歴史 — かつては先頭ビットから長さを推測していた

かつては、アドレスの先頭ビットを見ればプレフィックス長が分かる方式でした。クラスAは/8、クラスBは/16、クラスCは/24、というように、アドレス自身が自分の切れ目を持っていたわけです。マスクを別に指定する必要がありませんでした。

この方式は、1993年の CIDR(RFC 1519)で置き換えられました。CIDR の現行の文書は2006年の RFC 4632(BCP 122)です。動機は3つ挙げられています。クラスBが枯渇しかけたこと、ルーティングテーブルが増えすぎたこと、そして32ビットのアドレス空間そのものが枯渇しかけたことです。

固定の3種類しか選べないと、必要な大きさに合わないという問題が起きます。300台の組織にクラスC(254個)では足りず、かといってクラスB(6万個以上)を渡すと大半が無駄になります。長さを自由に選べるようにしたのがCIDRです。

組織内部で自由に使ってよいアドレスとして、RFC 1918 が3つの範囲を定めています。

RFC 1918 の3範囲表
表記 範囲 大きさ
10.0.0.0/8 10.0.0.0 - 10.255.255.255 クラスA 1個分
172.16.0.0/12 172.16.0.0 - 172.31.255.255 クラスB 16個分
192.168.0.0/16 192.168.0.0 - 192.168.255.255 クラスC 256個分

2行目に注意してください。172.16.0.0/12 は 172.16 から 172.31 までであって、172.16 だけではありません。また 192.168.0.0/16 は、連続するクラスC 256個分に相当する広さです。「192.168 はクラスC(1個)」という理解は、ここでも範囲を取り違えさせます。

なお 100.64.0.0/10 を「RFC 1918 の4つめ」として紹介する説明がありますが、これは誤りです。 RFC 6598 が定める Shared Address Space という別の範囲で、目的も適用範囲も異なります。

✓ ここまでの確認

「200台の機器を収容したいので、200個ぴったりのサブネットを切る」ことはできますか。

⇄ 2つを見比べる
具体例 A

IPアドレス — ネットワーク部とホスト部

32ビットを先頭24ビットと残り8ビットに割ります。ルータは先頭24ビットだけを見れば「どのネットワーク宛てか」を判断でき、残り8ビットには触れません。8ビットなので範囲は2の8乗で256個に固定されます。

192.168.1.50/24 の分割表
11000000 10101000 00000001 | 00110010
└──── ネットワーク部 24ビット ──┘ └ ホスト部 8ビット ┘
 
上位24ビット = どのネットワークか(ルータが見る)
下位 8ビット = その中のどの機器か(最後の装置が見る)
下位が8ビット → 2の8乗 = 256通り
具体例 B

仮想アドレス — ページ番号とオフセット(第9週)

第9週で見たx86-64のアドレス変換では、仮想アドレスの下位12ビットをページ内の位置(オフセット)、それより上をページ番号として扱いました。変換表が扱うのはページ番号だけで、下位12ビットはそのまま素通りします。12ビットなので1ページは2の12乗で4096バイトに固定されます。

仮想アドレスの分割(第9週で見た4階層ページング)表
ビット位置 役割
47:12 ページ番号(変換表が引く鍵)
11:0 ページ内の位置(変換されず素通り)
 
上位 = どのページか(変換表が見る)
下位 = その中のどこか(変換せずそのまま使う)
下位が12ビット → 2の12乗 = 4096バイト = 1ページ

IPアドレスの「ネットワーク部とホスト部」と、仮想アドレスの「ページ番号とオフセット」。扱っている対象は全く違いますが、同じ構造をしています。共通している原理は何で、そこから同じ帰結が出てくるのはなぜでしょうか。

どちらも「上位だけを見て仕事をする装置」がいます。そして、どちらも切れ目の位置が固定されていることから、同じ性質の制限が生まれています。

抽象原理

/31 という例外 — 条件を落とすと誤りになる

最後に、例外を1つだけ正確に扱っておきます。

ここまでの原則からすると、/31 はホスト部が1ビットしかないので、2個のアドレスが両方とも予約されてしまい、使えるアドレスが0個になるはずです。

ところが RFC 3021 は、point-to-point リンクにおいては2つのアドレスを両方ともホストアドレスとして解釈しなければならない、と定めています。ルータ同士を直結する区間で、わざわざ4個(/30)を消費せずに2個で済ませるための規定です。

成立する理由が本質的です。point-to-point では相手が1つしかいないので、受信者が一意に定まります。 「全ホスト宛て」という宛先表現を区別する必要がそもそも無いのです。予約の根拠が「全1は全ホストを意味する」ことにあったのだから、区別する相手がいなければ根拠ごと消えます。

この章のまとめ

  • IPアドレスは32ビットの1つの数。先頭何ビットかをネットワーク部、残りをホスト部として2段に読む。切れ目の位置はアドレスには書かれておらず、サブネットマスクが指定する。
  • 2段に割る目的は、ルータが前半だけを見て転送を判断できるようにすること。おかげで表はアドレスの数ではなくネットワークの数で済む。
  • /24 で使えるのが254個なのは、ホスト部が全0と全1のアドレスに意味が与えられているから。「ルータが使うから」ではない——ルータのIPは254個のうちの1つを普通に消費する。
  • マスクは左から連続した1でなければならず、範囲の大きさは必ず2の累乗になる。「200個ぴったり」は作れない。これは効率の都合ではなく、範囲を長さ1つで比較できるようにするためで、次回の最長一致の前提条件。
  • 先頭ビットからプレフィックス長を推測する方式(クラス)は廃止された。長さは常に明示されるので、アドレスだけを見て長さは決まらない。
  • RFC 1918 の私的アドレスは 10.0.0.0/8・172.16.0.0/12・192.168.0.0/16 の3つ。100.64.0.0/10 はこれに含まれない別物。
  • /31 を2台で使えるのは point-to-point リンクに限る。例外は条件ごと覚える。

自分の現場で確かめる

読んだだけでは身につきません。手元の環境で実際に見てみてください。

環境:

理解度チェック

読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。

問題 1 / 4正解: 0

サブネットマスクが「左から連続した1でなければならない」と定められているのは、なぜですか。

用語集(6語)
プレフィックス長 (/24 などの数字)
アドレスの先頭から何ビットをネットワーク部として扱うか。IPv4は32ビットなので、/24 なら残り8ビットがホスト部となり256個のアドレスを含む範囲になる。
サブネットマスク
ネットワーク部とホスト部の切れ目を表す32ビットの値。255.255.255.0 のように書く。左から連続した1でなければならず、途中に0を挟むことは許されない。
ネットワーク部 / ホスト部
アドレスの前半が「どのネットワークか」、後半が「その中のどの機器か」を表す。2段に分けることで、経路の判断をネットワーク部だけで行えるようになる。
ネットワークアドレス / ブロードキャストアドレス
ホスト部が全0のものと全1のもの。全1は「そのネットワークの全ホスト」を意味する宛先表現として予約されているため、個々の機器には割り当てられない。
CIDR
アドレスの先頭ビットからクラスを判定する方式をやめ、プレフィックス長を常に明示する方式。1993年の RFC 1519 で導入され、現行の文書は2006年の RFC 4632(BCP 122)。長さが明示されるので任意の細かさで範囲を切れる。
RFC 1918 アドレス
組織内部で自由に使ってよいと定められた3つの範囲(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)。インターネット上では一意でないため、外に出るときは変換が必要になる。