
開発者向け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フラグメンテーション
- まとめ – IPv4
背景
IPは「インターネットプロトコル」の略なので、IPv4はインターネットプロトコルバージョン4です。 IPv4はコネクションレスであり、ベストエフォート型の配信モデルで動作します。 これは、配信、パケットの正しい順序、またはデータの有効性を保証しないことを意味します。 高速かつ柔軟になるように設計されています。
IPアドレスの理解
IPアドレスは、今日ほとんどのインターネット接続を支える階層的な論理アドレスです。 それぞれ4バイト、つまり32ビットで構成されています。 通常、ドット付き10進表記で記述されます。例:
192.168.1.1
ネットワークIDとホストID
IPアドレスには、ネットワーク内のすべてのホストに属するネットワーク識別子(またはネットワークID)と、このネットワーク内の特定のホストを識別するホスト識別子(またはホストID)の2つの部分があります。 ネットワーク識別子は、ネットワーク内のすべてのホストで同じになり、「プレフィックス」とも呼ばれます。
例として、201.22.3のネットワーク識別子の場合、ネットワークプレフィックスが与えられた以下のIPアドレスは、同じネットワークの一部です。
- 201.22.3.15
- 201.22.3.91
最初のアドレスは、このネットワークのホスト番号15に属し、2番目のアドレスはホスト番号91に属します。
このアドレスは異なるプレフィックス、つまり異なるネットワーク識別子を持つため、異なるネットワークに属します:
- 201.22.14.50
上記の例では、3バイト、つまり24ビットからなるネットワーク識別子と、1バイト、つまり8ビットからなるホスト識別子があります。
ネットワーク部とホスト部の判別方法
ネットワークIDのどのビットがネットワークIDの一部で、どのビットがホストIDの一部であるかをどうやって知ることができるのか、という疑問が生じます。 この課題に対処するために、いくつかの方法が時間とともに進化してきました。 IPv4アドレスを理解するには、これらの方法を知ることが重要です。
固定長のアプローチ
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 | (multicast) | |
E | 240 - 255 | (reserved) |
たとえば、次のアドレスはどのクラスに属しますか?
(1) 130.12.204.5
130で始まる(128から191の間)ため、「クラスB」に属します。 これは、ネットワークIDが130.12で、ホストIDが204.5であることを意味します。
このアドレス(1)と次のアドレス(2)は同じネットワークに属していますか?
(2) 130.90.2.40
ネットワーク識別子が異なるため、同じネットワーク内にありません。
次のアドレスはどのクラスに属しますか?
(3) 200.1.1.9
これはクラスCに属します。これは、最初のバイトの値、200が192から223の間であるためです。 これは、ネットワーク識別子が200.1.1であることを意味し、このプレフィックスで始まるアドレスはすべて同じネットワーク内に存在します。 この特定のアドレスは、このネットワーク内のホスト9を表しています。
全体像として、224から239までの値で始まるアドレスは「クラスD」に属します。つまり、マルチキャストアドレス、複数のデバイスに属するアドレスです。 240から255までの値で始まるアドレスは、将来の使用のために予約されています。 0で始まるアドレスは特別なアドレスです。
IPアドレスの割り当て
初期のインターネットでは、IPv4アドレスはInternet Assigned Numbers Authority(IANA)によって組織に割り当てられていました。 インターネットが成長するにつれて、この責任は、さまざまな地理的地域のアドレス割り当てを処理する5つの地域インターネットレジストリ(RIR)に分散されました。 大規模な組織は、ニーズに基づいてアドレスのブロックを受け取り、アドレスクラスによってこれらのブロックのサイズが決定されます。
クラスフルアドレス指定の課題
クラスフルアドレス指定は、固定長のアプローチよりも柔軟性がありますが、このアプローチでも十分な柔軟性はありません。
次のシナリオを検討してください。2人の創業者しかいない小規模なスタートアップ企業が、ネットワーク識別子を必要としています。 どのクラスが必要になりますか?
クラスAまたはクラスBを取得することは過剰になる可能性があるため、256個のアドレスを許可するクラスCを取得する可能性があります。 これは現在は必要以上ですが、ある程度の拡張を可能にします。 スタートアップが256人以上の従業員(およびデバイス)に成長するとどうなりますか?
この時点で、65,536個のアドレスを与えるクラスBアドレスを取得する必要がありますが、必要なのは256個を超えるアドレスだけです。 つまり、60,000個を超えるアドレスが無駄になります。
これは、1990年代初頭にインターネットの成長が速くなるにつれて、現実的な問題になりました。 より多くのIPアドレスの必要性が明らかになり、IPv4アドレス空間の枯渇が迫っていました。 60,000個のアドレスが無駄になるケースはもはや容認できませんでした。
CIDR:クラスレスInterdomainルーティング
アドレスのこの不足を処理するための対策の1つは、1993年にクラスフルアドレス指定を廃止し、CIDR - クラスレスInterdomainルーティングと呼ばれる別のアプローチに切り替えることでした。 このアプローチは今でも使用されています。
CIDRは、ネットワークIDとホストIDを選択する際に柔軟性があります。 ネットワーク管理者は、クラスA、B、またはCに限定されるのではなく、適切なサイズのサブネットを作成できます。
簡単な例から始めましょう。 CIDR表記では、ネットワーク部分に使用されるビット数を示すサフィックスを追加します:
(4) 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までのすべてのアドレスがこのネットワークにあることを意味します。
その他のアドレスを考えてみましょう:
(5) 200.2.13.5 (6) 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)は、例のアドレスと同じネットワークに属しています。
サブネットマスク
IPアドレスのネットワークプレフィックスを表現するもう1つの方法は、次のようにサブネットマスクを使用することです。
255.255.0.0
10進数の255をバイナリに変換すると、バイナリでは8つの1になります。すべてがオンです。したがって、このマスクをバイナリに変換すると、次のようになります。
11111111 11111111 00000000 00000000
言い換えれば、16ビットがオンになり、16ビットのネットワークプレフィックスを意味します。 どちらの規則(CIDR表記とサブネットマスク)も非常に頻繁に使用されます。
CIDRを使用すると、アドレスはネットワークプレフィックスまたはサブネットマスクが異なる場合、別のネットワークに存在できます。 同じ例のアドレスに別のプレフィックス、つまり8ビットのプレフィックスを使用すると、追加されたアドレスはすべて同じネットワークに属します。すべてが最初の8ビット200を共有しているためです。
8ビットのネットワークプレフィックスをサブネットマスクとしてどのように表現しますか? 最初の8ビットをオンにする必要があるため、10進数の255を意味し、残りのビットはオフにします。これにより、次のサブネットマスクになります。
255.0.0.0
CIDRの現実世界の例
実際には、ISPはRIRから104.16.0.0/12のような大きなブロックを受信する可能性があります。 これにより、ISPは104.16.0.0から104.31.255.255までのすべてのアドレスを制御できます。 次に、ISPは、小規模ビジネスに256のアドレスを持つ/24サブネットを与えるか、大規模企業に4,096のアドレスを持つ/20サブネットを与えるなど、より小さなサブネットを顧客に割り当てることができます。 [alt]
サブネットマスク
ネットワークプレフィックスを表現するもう1つの方法は、次のようにサブネットマスクを使用することです:
255.255.0.0
バイナリに変換すると、10進数の255は、バイナリで8つの1に相当します。 つまり、すべてのビットがオンになっています。 したがって、このマスクをバイナリに変換すると、次のようになります:
11111111 11111111 00000000 00000000
換言すれば、16ビットがオンになっており、これは16ビットのネットワークプレフィックスであることを意味します。 どちらの規則(CIDR表記とサブネットマスク)も非常に頻繁に使用されます。
CIDRを使用すると、異なるネットワークプレフィックスまたはサブネットマスクを指定すると、アドレスは異なるネットワークに存在できます。 同じ例のアドレスに別のプレフィックス(たとえば8ビット)を指定すると、追加のアドレスはすべて同じネットワークに属することになります。これらはすべて、最初の8ビットである200を共有しているためです。
8ビットのネットワークプレフィックスをサブネットマスクとしてどのように表現しますか? 最初の8ビットをオンにする必要があるため、これは10進数で255を意味し、残りのビットはオフにします。サブネットマスクは次のようになります:
255.0.0.0
24ビットのネットワークプレフィックスを使用するとどうなりますか? まず、サブネットマスクとしてどのように表現しますか? 24ビットをオンにする必要があるので、3 x 8ビットをオンにする必要があります。その結果は次のようになります:
255.255.255.0
この場合、追加のアドレスのいずれも、例のアドレスと同じネットワーク内に存在しません。これらは200.8.3というネットワークIDを共有していないためです。
ネットワークプレフィックスは、完全なバイトを表している必要はありません。 たとえば、12ビット、11ビット、または22ビットのネットワークプレフィックスを使用できます。 プレフィックス長が8の倍数でない場合、サブネットマスクは、その位置の1つに0または255以外の値を持ちます。
この記事では、スタートアップ企業の問題に取り組みました。 スタートアップ企業に300人の従業員がいる場合、従業員は23ビットのネットワークIDを取得する必要があります。これにより、ネットワーク内のホストに9ビットが残されます。 これは2^9、つまり512のアドレスを意味し、これで十分です。
特別なIPv4アドレス
特定のIPv4アドレスには、特別な目的のために予約されているものがあります。 これらのアドレスは、ネットワークの設定およびトラブルシューティングにおいて重要な役割を果たします。 特殊なIPv4アドレスとその用途を以下に示します。
- 「このホスト」アドレス:0.0.0.0
- 「このネットワーク」アドレス
- ブロードキャストアドレス
- ループバックアドレス:127.0.0.0/8
IPv4ヘッダー
すべてのIPv4パケットには、パケットのルーティングと配信に必要な情報を格納するヘッダーが含まれています。 IPv4ヘッダーは通常20バイトで、オプションフィールドがある場合は最大60バイトまで拡張できます。 IPv4パケットヘッダーには以下のフィールドが含まれています:
- バージョン
- IHL(IPヘッダー長)
- DSCP(DiffServコードポイント)
- ECN(明示的な輻輳通知)
- 合計長
- 識別
- フラグ
- フラグメント・オフセット
- TTL(Time to Live)
- プロトコル
- ヘッダー・チェックサム
- ソースアドレス
- 宛先アドレス
- オプション(省略可)
IPv4ヘッダーの構造
IPv4フラグメンテーション
IPv4フラグメンテーションは、パケットが送信先ネットワークの最大伝送ユニット(MTU)よりも大きい場合に、IPv4パケットを小さなフラグメントに分割するプロセスです。 これは異なるMTUを持つネットワーク間で大きなパケットを転送するために必要です。
- フラグメンテーションが必要な理由
- IPでのフラグメンテーションの仕組み
- 識別フィールド
- フラグメントオフセット
- 断片化と断片化禁止フラグ
まとめ – IPv4
この記事では、IPv4アドレスに関する知識を深めることができました。 IPアドレスは、4バイトで構成される階層的な論理アドレスです。 IPアドレスには、ネットワーク内のすべてのホストに属するネットワーク識別子と、ネットワーク内の特定のホストを識別するホスト識別子の2つの部分があります。
この記事では、ネットワーク識別子とホスト識別子を決定するためのさまざまなオプションを検討しました。
- 固定長アプローチ – 柔軟性が低く、制限されています
- クラスフルアドレス指定アプローチ – 改善されましたが、依然として無駄が生じます
- CIDR(クラスレスInterdomainルーティング)– 柔軟で効率的
CIDRは、柔軟性を大幅に向上させ、IPv4アドレスの不足という重大な問題の克服に役立ちます。 しかし、CIDRはIPv4アドレスの不足に対処するための1つの方法にすぎず、他にもNAT(ネットワークアドレス変換)、最終的にはIPv6といったソリューションがあります。 [alt][]