
開発者向けIPv4ハンドブック:仕組みの徹底解説
インターネットプロトコルバージョン4(IPv4)は、インターネットおよびその他のパケット交換ネットワークにおける標準ベースのインターネットワーク方法のコアプロトコルの1つです。IPv4は現在でも最も広く展開されているインターネットプロトコルです。
GoogleのIPv6統計によると、2025年4月24日時点でGoogleサービスへのトラフィックの44.29%がIPv6経由であり、残りの55.71%がIPv4経由であることを示しています。この記事では、IPアドレスの理解からパケットヘッダーとフラグメンテーションの調査まで、IPv4のあらゆる側面を網羅的に解説します。
本記事で得られる知識
- IPアドレスの仕組みと異なるフォーマット
- 固定長からCIDRまでのネットワークアドレス指定方式
- 特別なIPv4アドレスとその用途
- IPv4ヘッダーのすべてのフィールドの構造と目的
- IPv4が異なるネットワーク間でパケットのフラグメンテーションをどのように処理するか
対象読者
ネットワークエンジニア、ソフトウェア開発者、ITプロフェッショナルなど、現代のコンピュータネットワークを扱うすべての人にとって、IPv4の理解は不可欠です。
記事構成
本記事では以下の内容について解説します。
- 背景
- IPアドレスの理解
- ネットワークIDとホストID
- ネットワーク部分とホスト部分の決定方法
- 固定長アプローチ
- クラスフルアドレス指定
- IPアドレスの割り当て
- CIDR: クラスレスInterdomainルーティング
- サブネットマスク
- 特別なIPv4アドレス
- IPv4ヘッダー
- IPv4フラグメンテーション
背景
IPとは「インターネットプロトコル」の略であり、IPv4はインターネットプロトコルバージョン4のことです。これはIETFによってRFC 791で記述され、1981年9月に公開され、1982年にSATNET (Atlantic PacketSatellite Network)で初めて実用化されました。SATNETは初期の衛星ネットワークであり、インターネットの初期セグメントを形成しました。
IPv4はコネクションレスであり、ベストエフォート型の配信モデルで動作します。これは、配信、パケットの正しい順序、またはデータの有効性を保証しないことを意味します。高速かつ柔軟であるように設計されています。
IPアドレスの理解
IPアドレスは、今日のほとんどのインターネット接続を動かす階層的な論理アドレスです。それぞれ4バイト、つまり32ビットで構成されています。通常、ドット付き10進表記で記述されます。例:
192.168.1.1
練習問題: 次のアドレスは有効なIPアドレスを表していますか?
172.31.255.392
答え: いいえ。ドットは異なるバイトを区切るため、各値は0から255の間でなければなりません。392は255よりも大きいため、単一のバイトで表現することはできません。
ネットワークIDとホストID
IPアドレスには2つの部分があります。ネットワーク内のすべてのホストに属するネットワーク識別子(またはネットワークID)と、このネットワーク内の特定のホストを識別するホスト識別子(またはホストID)です。
ネットワーク識別子はネットワーク内のすべてのホストで同じであり、「プレフィックス」とも呼ばれます。たとえば、201.22.3のネットワーク識別子を考えてみてください。これがネットワークプレフィックスであるとすると、次のアドレスは同じネットワークの一部です。
- 201.22.3.15
- 201.22.3.91
最初のアドレスはこのネットワーク内のホスト番号15に属し、2番目はホスト番号91に属します。
このアドレスは異なるプレフィックス、つまり異なるネットワーク識別子を持っているため、異なるネットワークに属します。
- 201.22.14.50
上記の例では、3バイトまたは24ビットで構成されるネットワーク識別子と、1バイトまたは8ビットで構成されるホスト識別子があります。
ネットワーク部分とホスト部分の決定方法
質問が生じます: どのビットがネットワークIDの一部であり、どのビットがホストIDの一部であるかをどうやって知るのですか?この課題に対処するために、いくつかの方法が進化してきました。
固定長アプローチ
すべてのIPアドレスについて、最初、つまり最上位のバイトがネットワークIDを表し、残りの3つの最下位バイトがホストIDを表すことを考えてみましょう。これでIPアドレスを非常に簡単に読み取ることができます。たとえば、このアドレスの場合:
20.12.1.92
ネットワーク20と、そのネットワーク内のホスト12.1.92を表していることがわかります。22.1.2.3のように20で始まらないIPアドレスは異なるネットワークに存在し、20.1.2.3のように20で始まるIPアドレスは同じネットワーク内に存在します。
短所: ネットワークIDを表すために1バイト (8 ビット) しか使用しない場合、2^8、つまり256個の異なるネットワークしか持つことができません。もちろん、現実の世界にはそれよりもはるかに多くのネットワークがあります。インターネットの初期の頃でさえ、大学や大企業はそれぞれ独自のネットワーク識別子を必要としていました。
一般に、ネットワークIDに固定長を使用し、ホストIDに固定長を使用するのは十分な柔軟性ではありません。2つの最上位バイトがネットワークIDを表し、2つの最下位バイトがホストIDを表すと判断した場合、最大2^16、つまり65,536個のネットワークを表すことができますが、これも十分ではありません。さらに、大企業のネットワークなど、一部のネットワークでは65,536個を超えるホストIDが必要になる場合があります。
クラスフルアドレス指定
解決策は、ある程度の柔軟性を提供することにあります。「クラスフルアドレス指定」と呼ばれる別のアプローチを考えてみましょう。このアプローチでは、ネットワークIDに割り当てられたビット数がアドレスごとに異なり、アドレスの最初、つまり最上位のバイトを見ることでネットワークIDを知ることができます。
- 1〜127の間の数値で始まるアドレスは「クラスA」に属し、そのネットワークIDは1バイトで構成され、ホストIDに3バイトを残します。
- 128〜191の間の数値で始まるアドレスは「クラスB」に属し、そのネットワークIDは2バイトの長さで、ホストIDも2バイトの長さです。
- 192〜223の間の数値で始まるアドレスは「クラスC」に属するため、ネットワークIDが3バイト、ホストIDが1バイトになります。
このアプローチの完全な表現を以下の表に示します。
クラス | 最初のバイトの範囲 | ネットワークIDサイズ | ホストIDサイズ |
---|---|---|---|
A | 1 - 127 | 1 バイト | 3 バイト |
B | 128 - 191 | 2 バイト | 2 バイト |
C | 192 - 223 | 3 バイト | 1 バイト |
D | 224 - 239 | (マルチキャスト) | |
E | 240 - 255 | (予約済み) |
例: 次のアドレスはどのクラスに属しますか?
(1) 130.12.204.5
130で始まり、130は128〜191の間にあるため、「クラスB」に属します。これは、そのネットワークIDが130.12で、そのホストIDが204.5であることを意味します。「アドレス番号1」としてマークしましょう。
このアドレスと次のアドレス (2) は同じネットワークに属しますか?
(2) 130.90.2.40
いいえ、ネットワーク識別子が異なるため、同じネットワーク内にはありません。
次のアドレスはどのクラスに属しますか?
(3) 200.1.1.9
最初のバイトの値200が192〜223の間にあるため、これはクラスCに属します。これは、そのネットワーク識別子が200.1.1であり、このプレフィックスで始まるアドレスはすべて同じネットワーク内に存在することを意味します。この特定のアドレスは、このネットワーク内のホスト9を表します。
全体像を完成させるために、224〜239の値で始まるアドレスは「クラスD」に属します。これはマルチキャストアドレス、つまり複数のデバイスに属するアドレスです。240〜255の値で始まるアドレスは将来の使用のために予約されていました。0で始まるアドレスは特殊なアドレスです。
IPアドレスの割り当て
初期のインターネットでは、IPv4アドレスはInternet Assigned Numbers Authority(IANA)によって組織に割り当てられていました。インターネットの成長に伴い、この責任は、さまざまな地理的地域のアドレス割り当てを処理する5つの地域インターネットレジストリ(RIR)に分散されました。大規模な組織は、そのニーズに基づいてアドレスのブロックを受け取り、アドレスクラスがこれらのブロックのサイズを決定しました。
クラスフルアドレス指定の短所: クラスフルアドレス指定は固定長アプローチよりも柔軟性がありますが、このアプローチでさえ十分な柔軟性はありません。
このシナリオを考えてみましょう: たった2人の創業者しかいない小さなスタートアップ企業がネットワーク識別子を必要としています。どのクラスが必要でしょうか?
クラスAまたはクラスBを取得するのは過度になるため、クラスCを取得する可能性があります。これにより、256個のアドレスが可能になります。これは現在必要な量よりも多いですが、ある程度の拡張が可能です。スタートアップが256人を超える従業員 (およびデバイス) に成長した場合はどうなるでしょうか?
この時点で、クラスBアドレスを取得する必要があり、必要なのは256個を少し超えるアドレスだけなのに、65,536個以上のアドレスが提供されます。つまり、60,000個以上のアドレスが無駄になります。
これは1990年代初頭にインターネットが急速に成長するにつれて現実的な問題になりました。より多くのIPアドレスの必要性が明らかになり、IPv4アドレス空間の枯渇が差し迫っていました。60,000個のアドレスが無駄になるようなケースはもはや許容できませんでした。
CIDR: クラスレスInterdomainルーティング
アドレスのこの不足を処理するための対策の1つは、1993年にクラスフルアドレス指定を放棄し、CIDR (Classless Interdomain Routing) と呼ばれる別ののアプローチに切り替えることでした。このアプローチは現在も使用されています。
CIDRを使用すると、ネットワークIDとホストIDを選択する際に柔軟性が得られます。ネットワーク管理者は、クラスA、B、またはCに限定されるのではなく、正確なサイズのサブネットを作成できます。
簡単な例から始めましょう。CIDR表記では、ネットワーク部分に使用されるビット数を示すサフィックスを追加します。
200.8.3.1/16
このスラッシュ表記は、ネットワークIDを記述するビット数を指定します。上記の例 (4) では、最初の16ビット (または2バイト) がネットワークIDに使用されます。したがって、この場合、200.8がネットワーク識別子であり、3.1がホスト識別子です。200.8がネットワークIDであるという事実は、200.8.0.0から200.8.255.255までのすべてのアドレスがこのネットワーク内にあることを意味します。
これらの追加のアドレスを検討してください。
- 200.2.13.5
- 200.8.21.6
このアドレスプレフィックス16ビット (または2バイト) が与えられた場合、これらのアドレスのどちらが例 (4) (200.8.3.1/16) と同じネットワークに属しますか?
最初のアドレス (5) (200.2.13.5) は、その最初の16ビットである200.2が例のアドレスの最初の16ビットと異なるため、このネットワークに属していません。
2番目のアドレス (6) (200.8.21.6) は、例のアドレスと同じネットワークに属します。
サブネットマスク
ネットワークプレフィックスを表す別の方法は、次のようにサブネットマスクを使用することです。
255.255.0.0
10進数の255をバイナリに変換すると、バイナリで8つの1に等しくなります。つまり、すべてのビットがオンになっています。したがって、このマスクをバイナリに変換すると、次のようになります。
11111111 11111111 00000000 00000000
言い換えれば、16ビットがオンになっています。つまり、ネットワークプレフィックスは16ビットです。両方の規則 (CIDR表記とサブネットマスク) が非常に頻繁に使用されます。
CIDRを使用すると、アドレスは異なるネットワークプレフィックスまたはサブネットマスクが与えられた場合、異なるネットワークに存在できます。異なるプレフィックスを持つ同じ例のアドレスを検討する場合 (たとえば、8ビット) — 両方の追加のアドレスは同じネットワークに属し、Network Address Translationはすべて最初の8ビット (200) を共有します。
ネットワークプレフィックスの8ビットをサブネットマスクとしてどのように表現しますか?最初の8ビットをオンにする必要があるので、10進数で255を表し、残りのビットはオフです。結果は次のサブネットマスクになります。
255.0.0.0
24ビットのネットワークプレフィックスを使用する場合はどうなるでしょうか?まず、サブネットマスクとしてどのように表現しますか?24ビットをオンにする必要があるので、これは8ビットを3回オンにすることです。結果は次のようになります。
255.255.255.0
これで、追加のアドレスはいずれも例のアドレスと同じネットワーク内に存在しなくなります。例のアドレスのネットワークIDである200.8.3を共有していないためです。
ネットワークプレフィックスは、完全なバイトを表す必要はありません。たとえば、12ビット、11ビット、または22ビットのネットワークプレフィックスを使用できます。プレフィックス長が8の倍数でない場合、サブネットマスクはその位置の1つに0または255以外の値を持つことになります。
これにより、スタートアップ企業に関する問題が解決されます。スタートアップに300人の従業員がいる場合、23ビットのネットワークIDを取得する必要があります。これにより、ネットワーク内のホストに9ビットが残されます。これは2^9、つまり512個のアドレスを意味します。これは十分であるはずです。
IPv4アドレス — まとめ
このセクションでは、IPv4アドレスについて学習しました。IPアドレスは、4バイトで構成される階層的な論理アドレスです。IPアドレスには2つの部分があります。ネットワーク内のすべてのホストに属するネットワーク識別子と、ネットワーク内の特定のホストを識別するホスト識別子です。
ネットワーク識別子とホスト識別子を決定するためのさまざまなオプションを検討しました。
- 固定長アプローチ — 硬直的で制限されています
- クラスフルアドレス指定アプローチ — より良いが、それでも無駄です
- CIDR (Classless Interdomain Routing) — 柔軟で効率的です
CIDRは、より多くの柔軟性を提供し、IPv4アドレスの不足という重大な問題を克服するのに役立ちます。ただし、CIDRはIPv4アドレスの不足に対処するための手段の一部にすぎず、NAT (Network Address Translation) や最終的にはIPv6などのソリューションも含まれます。
次のセクションでは、特殊なIPv4アドレスを調べ、次にIPv4パケットのヘッダーを調べます。
理解度テスト
これまで学んだ概念を練習し、十分に理解できたことを確認してください。 answersを確認する前に、次の質問に答えてみてください。
プレフィックス表記とサブネットマスクの間で変換する
これらのアドレスは、このネットワークプレフィックスが指定されている場合、同じネットワークに属しますか?
42.31.93.5 /16
42.31.1.2 /16
42.31.93.6 /16
42.32.1.2 /16
サブネットマスクで逆方向へ
次のようなサブネットマスクがあります。
255.255.255.0
ネットワークプレフィックスを使用してどのように表現しますか?