やっとIPアドレスだ
IPアドレスを理解しようとするたびに躓いてきましたが、段階を追って理解を進めてきました。
今回の記事は現時点での「IP(v4)アドレスまとめ」です。
主教材は『マスタリングTCP/IP』となります。
IPアドレスとは何か
IPアドレスとは
ネットワークに接続しているすべての機器の中から、通信を行う宛先を一意に識別するために使用するアドレスです。
OSI参照モデルのネットワーク層の技術です
IPアドレスがなかったら何が困る?
技術について考えるとき、それがなかったら何が困るのかを考えるのが有用だと学びました。
もしIPアドレスがなかったら、(あるいは正しく機能しなかったら)どうなるのでしょうか?
IPアドレスは 「ネットワーク上の住所」 と表現されることがあります。
現実世界に置き換えて考えた時、「住所」という概念がなかったら、手紙や宅配を届けることは非常に困難になります。これはネットワークの通信も同様です。
IPアドレスがなかったら、目的の宛先までデータを届けることができなくなってしまいます。
IPアドレスは、直接接続していないネットワーク間でのデータ転送のための識別子です。IPアドレスは 「どのネットワークに属しているか」 を示し、ルータがこの情報を使ってデータを適切な経路で転送します。
ネットワーク同士を相互に接続することで発展してきたインターネットは、IPアドレスなしには存在し得ません。
『マスタリングTCP/IP」ではインターネット層は「TCP/IPの心臓部」と表現されています。
そんな心臓部を代表するプロトコルである「IP」の仕事は「パケットを目的の宛先コンピュータまで届けること」
その識別子として使われるIPアドレスは、大切な技術です。
IPアドレスの構造
IPアドレスは、32ビット(32桁の2進数)で表記されます。
人間が扱いやすいように8ビットずつカンマで区切り、10進数に変換されます。
画像引用 https://envader.plus/article/51
(綺麗にまとまっていたため、お借りしました。)
画像が示す通り、IPアドレスはネットワーク部とホスト部に分けられます。それぞれ見ていきます。
ネットワーク部
ネットワーク部は、その機器が所属しているネットワークを表します。
ホスト部を見なくても、ネットワーク部さえ見ればどのネットワークに所属しているのかがわかります。
ネットワーク部はネットワークごとに固有でなければいけません。
ホスト部
続くホスト部は住所の詳細のようなものです。
同一ネットワーク内の各機器を識別するアドレスとして使われます。
例えば、「東京都新宿区西新宿」までがネットワーク部だとすると、「何丁目何番地」は西新宿という領域の中で固有の住所として識別されます。
アドレスの前提は、一意であること
もしIPアドレスが重複したらどうなるでしょうか?IPアドレスはいわば「ネットワーク上の住所」でした。
現実世界で考えてみます。
もし全く同じ住所が複数箇所あったら、手紙や宅配を届ける人は困ってしまいます。住所はユニークであることを条件にして、初めてその機能を果たします。
重複しない・唯一の住所であることの重要性は、コンピュータの世界であっても基本的に同様です。重複しない、ユニークであることを、一意と表現します。
「IPアドレスは一意であること」は、識別子としての大前提です。
しかし、この前提を守ることが難しくなってしまいました。
IPアドレスは全部でいくつ?
IPアドレスは、32ビット(32桁の2進数)で表記されます。
これによって表現できるパターンは、2の32乗で約43億通りです。
43億は一見すると大きな数字に感じますが、これは総人口に満たない数です。
アドレスが足らなくなってしまいました。
これはIPアドレス枯渇問題と呼ばれます。
IPアドレス枯渇問題の理由
枯渇の理由をもう少し詳しく見ていきます。
(1)一人が複数の端末を持つことが当たり前の時代
一人が複数の端末を持ち、さまざまな機器をネットワークに接続することが当たり前の時代です。個人だけでなく企業も含めると、ネットワークに接続する機器の数は想像以上になりそうです。
(2)1機器に1アドレスとは限らない
さらに、1台の機器に1アドレスとは限りません。
これは想定外でした。
IPアドレスは、厳密には「機器ごと」ではなくNICごとに割り当てらます。NICとは、ネットワークインターフェースカードの略で、ネットワークに接続するために必要なハードウェア部品です。
NICに複数のアドレスを与えることもできるし、NICを複数持つ機器もあります。
通常、ルータは2つ以上のNICを持つそうです。貴重なアドレスがどんどん使われていきます。
(3)機器に割り当てられない特殊なIPアドレスがある
ただでさえ貴重なアドレスですが、予約済みのアドレスがあります。
以下のようなアドレスです。
- 0.0.0.0(文脈によって複数の意味がある模様)
- ネットワークアドレス(ホスト部のビットが全て0)
- ブロードキャストアドレス(ホスト部のビットがすべて1)
- ループバックアドレス
- ・・・
これらの特殊アドレスについて、現時点で学んだことは後述します。
先ほど確認した通り、アドレスの前提は「一意」です。43億では枯渇してしまう理由がわかってきました。
この問題を根本解決するにはアドレスの数を増やすしかありません。 そこで、この問題を解決するためのインターネットプロトコル、IPv6(IP version 6)が標準化されました。
IPv6の標準化
vは、ヴァージョンのことです。
IPv4が4オクテット(32bit)だったのに対して、v6は16オクテット(128bit)です。
表現できるアドレスの数は、2の128乗
これは約340澗です。馴染みのない単位で表現される天文学的な数字になります。アドレスの数としては申し分ありません。
さらに、IPv6がカバーしてくれる課題はアドレスの枯渇だけではありません。IPv4の不満の多くを解決するための機能が実装されているそうです。
「IPv6の標準化のおかげで、枯渇問題はもう安心!」
というわけにはいきませんでした。
現実はIPv4をやりくりしている
なぜなら、移行が大変だからです。
インターネットに接続されている機器のすべてのIPアドレスを変更しなければなりません。 すでに運用が開始されているシステムに手を加えるのは大変なことで、現実はIPv4をやりくりしながらIPv6への対応が進められているとのことです。なので、IPv6はまた別の機会に学習します。今回の記事ではIPv4を扱います。
やりくりといっても、一体どのような工夫がされているのでしょうか。具体的には、大きく以下の2つの技術があることを学びました。
- CIDR(クラスレス)
- プライベートIPアドレス
上から順に見ていきたいのですが、1つ目の「クラスレス」を理解するためにはそもそも 「クラス」とは何かを知る必要があります。
ここからは、「IPアドレス管理の発展」と題して、貴重なIPv4アドレスのやりくりを整理していきます。
IPアドレス管理の発展
IPアドレスの分配方法の工夫は、クラスフル・クラスレス・プライベートIPアドレスの3つがあります。この3つに対して、「固定的」「柔軟」「大胆」 というキーワードを付与して整理してみようと思います。
(1)クラスフルアドレッシング
クラスフルアドレシッングとは、IPアドレスの割り当て方式です。
1990年代半ばまでの、初期のIPで採用されていました。
長いので以降はクラスと呼称します。
クラスは「固定的」なアドレス管理法
前の章で、IPアドレスの構造はネットワーク部とホスト部に分けられることを見てきました。しかし、その境目がどこにあるのか?には触れませんでした。
クラスフルアドレシッングでは、どこからどこまでがネットワーク部で、どこからがホスト部なのか、その境目を先頭ビットによって固定的に区切ります。
クラスフルアドレシッングを理解するキーワードは、「固定的」です。
クラスは、A,B,C,D,Eの全部で5クラスあります。
クラスが定義するのは、ネットワークの規模
唐突に出てきた「クラス」という単語ですが、クラスを設けることは何を意味するのでしょうか?
クラスが定義するもの
それはネットワークの規模です。
ネットワーク部 | ホスト部 | 割り当て可能なネットワーク数 | 割り当て可能なホストアドレス数 | |
---|---|---|---|---|
クラスA | 「0」で始まる先頭8ビット | 24ビット | 126個(予約数-2済) | 1,677万7,214台 |
クラスB | 「10」で始まる先頭16ビット | 16ビット | 16382個(予約数-2済) | 65,534台 |
クラスC | 「110」で始まる先頭24ビット | 8ビット | 2,097,150個(予約数-2済) | 245台 |
クラスD(マルチキャスト用) | 「1110」で始まる32ビット | なし | 0 | |
クラスE(実験用) |
このように、ネットワークの規模とホストの収容数はトレードオフの関係性があります。
主要な3つのクラスの特徴と、その問題点を見ていきます。
クラスA : 「0」で始まる先頭8ビットをネットワーク部とする
クラスAのホスト数は、2の24乗です。これは計算すると、1,677万7,216台です。
実際にはネットワークアドレスとブロードキャストアドレスを-2するため、1,677万7,214台のホストを収容できます。しかしこの数は、現実的なネットワーク構成ではないです。
クラスB :「10」で始まる先頭16ビットをネットワーク部とする
クラスBのホスト数は、2の16乗です。同様に計算すると、65,534台です。
クラスC : 「110」で始まる先頭24ビットをネットワーク部とする
クラスCを見てみると、ホスト数は、2の8乗です。同様に計算すると、一気に減って245台分のアドレスです。
現実的なネットワーク構成って何だ?
クラスAの項目で「現実的なネットワーク構成ではない」と書きました。
1つのネットワークに大量の機器を接続することは、さまざまな問題があること知りました。以下は、私が理解できた一例です。
- 1つのネットワークで障害が起きた時の被害がとても大きい(→分割されていれば被害は最小限)
- 検索に時間がかかり、多くのメモリ空間やCPUパワーが必要になる(→1クラスに30人の生徒名簿を見るのと、全校生徒がごった煮になった名簿を見るなら、前者の方が楽なのと同じ)
今後、ネットワーク構成をもっと具体的にイメージできるようになるといいなと思いますが、
ネットワークの歴史をみることで、そのイメージが少し沸きました。
ネットワークの進化
スタンドアロン
コンピュータは、最初はスタンドアロン状態から始まりました。これは、コンピュータをネットワークに接続せず、単独で使用する状態を指します。初期のコンピュータは孤立しており、データの共有やリソースの活用が限られていました。
LAN(Local Area Network)
次に、複数のコンピュータを互いに接続して効率化が図られました。これがLANです。LANは家庭や小規模なオフィス環境でよく使われる、限られた狭い範囲に構築されたネットワークのことです。
WAN(Wide Area Network
さらに規模を拡大し、複数のLANを接続することで、もっと広い地域にわたるネットワークが作り上げられました。これがWANです。地理的に離れた場所のコンピュータ同士を繋げることができます。
このように相互に接続してもっと便利に!の拡大が現在のインターネットを作っています。
ネットワークの便利さは適切に分割して享受できる
クラスとは少し脱線しましたが、どれだけインターネットが広大に、そして豊かになろうとも、1つ1つのネットワークのサイズが大きくなりすぎることはないんだ、というイメージを持っておくと良いと思いました。
取り回しのしやすい規模に分割して管理するのは、ソースコードの関数やモジュール化と同じですね。
これらを踏まえてクラス方式を見直します。
クラス方式は無駄が多い
ここまでを踏まえるとクラスAの収容数「1,677万7,214台」は、規模が大きすぎることが感覚的にわかってきました。
結論、「クラスフルアドレッシングは無駄が多い」です。
大規模な組織にはクラスAを当てがったようですが、その結果は、せっかくの貴重なIPアドレスが使われず放置される状況を生みました。
巨大ビルが空室だらけ、みたいな感じだと思います。
一方で、クラスCは245台と、ちょっと窮屈に感じる組織があることも想像ができます。
- クラスAは巨大すぎる
- クラスCは小さい
- →クラスBに需要が集中
結果として、多くの組織がクラスBを希望した結果、クラスBが不足し配布しつくしてしまう可能性が出てきました。
(2)クラスレスアドレシッング
クラス方式は無駄が多いし、扱いにくいと言うことで、固定的なクラスを取っ払うことにしました。それがクラスレスです。
クラスレスは「柔軟な」アドレス管理法
クラス方式によって生じる無駄を小さくし、IPアドレスの枯渇に対応するために導入されました。
IPアドレスのクラス部とホスト部を「柔軟」に区切る仕組みです。
クラスレスを理解するための言葉の整理
CIDR | サブネットマスク | |
---|---|---|
これは何? | クラスに縛られずにネットワークを分割する「仕組み」 | ネットワーク部をどこまで拡張したのかを表す「識別子」 |
CIDR(Classless InterDomain Routing)
- 「仕組み」のこと
- クラスレスという名前の通り、クラスに縛られずにネットワークを分割する
- クラス方式では固定されていたホスト部を、ネットワーク部に柔軟に拡張できる
サブネットマスク
- 「識別子」のこと。(別名ネットマスク、サブネットワークマスク)
クラスレス方式では、従来のIPアドレスに加えてサブネットマスクという2つ目の識別子が必要になりました。
サブネットマスクは、IPアドレスと同様に32ビットで表記されます。
サブネットマスクの表記方法
一見取っ付きにくいサブネットマスクですが、「何ビット目までがネットワーク部か」を表しています。
マスクと呼ばれる理由は、ビット演算によって取り出したビットパターンだからなのだと知りました。
サブネットマスクの「1」と「0」はビット演算という計算によって求めらます。ネットワーク部を「1」、ホスト部を「0」で表します。
クラスレスによるアドレスの表記方法は2通りあります。
IPアドレスと別にサブネットマスクをそのまま書く方法と、プレフィックス表記です。プレフィックス表記を見ていきます。
プレフィックス表記では、/の後ろにビット数を書き、ネットワーク部がどこまでかを示します。
172.20.100.52/26
なら、先頭から26ビット目までがネットワーク部です。2進法に直した先頭26ビットまでなので、区切れ目は以下の通りです。
10101100.00010100.01100100.00 | 110100
CIDRがもたらす主な利点2つある
(1)大きすぎるネットワークを小さく分割することができる
これは、クラス方式のデメリットからイメージが湧きやすいです。
(2)隣接する小さいネットワークを1つにまとめることができる
それだけでなく、連続する複数のクラスCアドレスを1つの大きなネットワークとして扱うことができるようになることが紹介されていました。これはサブネット化と区別して、経路制御表の集約(アグリゲーション)と呼ぶらしい。
追々、学びを深めていきたいです。
(3)プライベートIPアドレス
貴重なIPv4のやりくり、2つ目の技術はプライベートIPアドレスです。
プライベートIPアドレスは「大胆な」アドレス管理法
記事の冒頭にて、住所はユニークであることを条件にして、初めてその機能を果たすことを述べました。
「ネットワークに接続しているすべての機器は一意のアドレスを持たなければならない」
プライベートIPアドレスの考え方は「この前提を大胆に書き換えてしまえ!」です。
LAN内のアドレスが重複しています。
プライベートIPアドレスがもたらしたもの
プライベートIPアドレスは、同じネットワーク内で一意であることを条件に重複を許します。
これによって、必要なところにだけユニークなIPアドレス割り当てることが可能となりアドレスの節約ができるようになりました。
プライベートIPアドレスを理解するための言葉の整理
重複OKなアドレスと、NGなアドレスを区別する必要が生じました。プライベートIPアドレスに対して、従来通りの一意のIPアドレスをグローバルIPアドレスと呼びます。
プライベートIPアドレス | グローバルIPアドレス | |
---|---|---|
定義 | インターネットに接続できないアドレス。社内や家庭内など、限られたネットワークの中だけで有効 | インターネットに接続できるアドレス |
重複 | ネットワークが異なれば、重複することができる | インターネット上で一意である必要がある |
備考 | プライベートIPアドレスがインターネット接続するためにNAT,NAPTという技術が生まれた |
NAT,NAPTはまた次の機会に学びます。
プライベートIPアドレスの範囲は決まっている
重複OKだからと言って、好き勝手につけていいわけではなくルールが決まっています。
プライベートIPアドレスの範囲 | |
---|---|
クラスA | 10.0.0.0~10.255.255.255 |
クラスB | 172.16.0.0~172.31.255.255 |
クラスC | 192.168.0.0~192.168.255.255 |
アドレス空間
ここまでの知識を総動員して、各クラスのアドレス空間を整理してみます。
その際に押さえておくべき前提知識を確認しました。
アドレス空間って何?
アドレス空間とは、一定の形式の連続した識別番号によって構成される範囲。記憶装置の領域を示す番地の範囲やネットワーク上の機器を識別する番号の範囲などが該当する。
引用 : IT用語辞典(https://e-words.jp/w/アドレス空間.html)
必ずしもIPアドレスにのみ使われる言葉ではないことを知りました。
Azureの設定画面を下記サイトで初めて見たのですが、「アドレス空間」という設定項目があります。
ループバックアドレスとは
これは「localhost」のことです。
自分自身への通信用として予約されているアドレスで、一般的なネットワークでは使われないアドレスです。
「自分自身への通信用」という表現が、まだいまいちしっくりきていませんが、
このアドレスは、同じコンピュータ内部のプログラム間で通信したい場合に利用されます。これは、サーバーとクライアントが同じコンピュータ上で動作しているということを意味します。その際にネットワーク経由ではなく、ループバックアドレスを使ってデータの送受信を行います。
localhostは、この予約アドレスに紐づけられた文字列、つまりドメインです。
localhost =「127.0.0.1」と思い込んでいたのですが、 127.0.0.0~127.255.255.255が予約されているようです。こんな数が予約されているとは驚きでした。
ネットワークアドレス
ホスト部のビットがすべて0のアドレス
ネットワーク全体を表すためのアドレスです。
ブロードキャストアドレス
ホスト部のビットがすべて1のアドレス(10進法の場合255)
同一のネットワーク内のすべてのホストにパケットを送信するためのアドレスです。
0.0.0.0
0.0.0.0は特定のIPアドレスを指すものではありません。
このアドレスについては、必要性が出てきたら追って学習予定です。
IPアドレスは、特定の範囲に応じてさまざまな用途に分かれていることがわかりました。以下に、主要な3つのクラスのアドレス空間とその用途をまとめてみようと思います。
クラスAのアドレス空間
クラスA : 「0」で始まる先頭8ビットをネットワーク部とする
- 「0XXXXXXX」が、ネットワーク部
- 最小値 : 0XXXXXXX.00000000.00000000.00000000
- 最大値 : 01111111.11111111.11111111.11111111
これを10進法に直すと
- 最小値 : 0.0.0.0~
- 最大値 : 127.255.255.255
この中には、特殊なアドレスやプライベートIPアドレスを含む
範囲 | 用途 | 備考 |
---|---|---|
0.0.0.0 | 特殊アドレス | |
1.0.0.0~9.255.255.255 | グローバルIPアドレス | 公開ネットワークで使用 |
10.0.0.0~10.255.255.255 | プライベートIPアドレス | LAN(私的ネットワーク)用に予約されている |
11.0.0.0~126.255.255.255 | グローバルIPアドレス | 公開ネットワークで使用 |
127.0.0.0~127.255.255.255 | ループバックアドレス | 自分自身を指す。主に127.0.0.1(localhost)を使用 |
クラスBのアドレス空間
クラスB : 「10」で始まる先頭16ビットをネットワーク部とする
「10XXXXXX.XXXXXXXX」がネットワーク部
- 最小値 : 10000000.00000000.00000000.00000000
- 最大値 : 10111111.11111111.11111111.11111111
これを10進法に直す
- 最小値 : 128.0.0.0
- 最大値 : 191.255.255.255
範囲 | 用途 | 備考 |
---|---|---|
128.0.0~172.15.255.255 | グローバルIPアドレス | 公開ネットワークで使用 |
172.16.0.0~172.31.255.255 | プライベートIPアドレス | LAN(私的ネットワーク)用に予約されている |
172.32.0.0~191.255.255.255 | グローバルIPアドレス | 公開ネットワークで使用 |
クラスCのアドレス空間
クラスC : 「110」で始まる先頭24ビットをネットワーク部とする
「110XXXXX.XXXXXXXX.XXXXXXXX」がネットワーク部
- 最小値 : 11000000.00000000.00000000.00000000
- 最大値 : 11011111.11111111.11111111.11111111
これを10進法に直す
- 最小値 : 192.0.0.0
- 最大値 : 223.255.255.255
範囲 | 用途 | 備考 |
---|---|---|
192.0.0.0~192.167.255.255 | グローバルIPアドレス | 公開ネットワークで使用 |
192.168.0.0~192.168.255.255 | プライベートIPアドレス | LAN(私的ネットワーク)用に予約されている |
192.169.0.0~223.255.255.255 | グローバルIPアドレス | 公開ネットワークで使用 |
クラスCのプライベートIPアドレスも、主に家庭や小規模なネットワークで利用されることが多い。
発見 : 旧来のクラス式の考え方は今も生きている
💡CIDRが採用された現代においても、ネットワークの規模に対する考え方は旧来のクラス式を引き継いでいることがわかりました。
正直今回の記事を書きながら、度々自分の作業を疑いました。クラスレスが主流の昨今、旧来のクラス方式のアドレス空間を整理することにどれだけの価値があるのか?と思っていました。
しかし、この作業のおかげで疑問が1つ晴れました。
その疑問とは、
「なぜGoogleのDNSサーバーのアドレスは「8.8.8.8」で、家庭用では「192.168.」から始まるんだろう?」
です。
クラス分けの歴史を知ると、合点がいきました。8で始まるGoogleのアドレスは、クラス式でいうクラスAにあたります。大規模組織に相応しいアドレスです。一方で192から始まるクラスはクラスCです。クラスCは家庭用の小規模ネットワークに適しています。
旧来のクラス式の考え方は今も生きていることに気づきました。
おわりに
IPアドレスの基礎知識とアドレス管理の発展を見てきました。
今回の記事を通してビット計算やIPアドレスと少しだけ仲良くなることができたような気がします。
目には見えないアドレス空間の中で、たくさんのコミュニケーションが行われているこの世界のことを改めて不思議に思いました。
一歩ずつ進んでいきます。
補足 : ホストという言葉
IPアドレスを以下のように定義しました。
「IPアドレスとは、ネットワークに接続しているすべての機器の中から通信を行う宛先を識別するために使用するアドレスです。」
この時、「機器」と「ホスト」どちらの単語を使うべきか迷いました。
ホストは文脈によって異なる意味を持つことがあります。
『マスタリングTCP/IP』による「ホスト」の説明です。
IPアドレスが付けられた機器や機械、装置のこと。ただし、ホストは経路制御を行わない
この場合、経路制御を行うルータはホストに含まれないことになります。
そこで、今回の記事では「機器」を採用しました。
しかしアドレスのホスト部の「ホスト」はルータも含むので注意が必要だと思いました。
参考資料