第3章 データが届くしくみ|3-2|コース全体 19回中10本目
ARP ― IPアドレスからMACアドレスを調べる
IPアドレスは分かっているのにMACアドレスが分からない。この状況を解決するARPの仕組みを、リクエスト・リプライの流れからゲートウェイ宛の挙動まで掘り下げます。
同じネットワーク内でフレームを渡すにはMACアドレスが要る。それをIPから調べるのがARP
同じネットワーク内の相手にデータを渡すとき、実際に使われる宛先はMACアドレスです。しかし普段扱っているのは IPアドレスの方で、相手のMACアドレスは分かりません。この「IPは分かるがMACが分からない」を解決するのがARP(Address Resolution Protocol、アドレス解決プロトコル)です。
なぜMACアドレスへの変換が必要か
IPアドレスとMACアドレスの役割の違いは2-1 MACアドレスとIPアドレスの違いで説明した通りです。第3層(ネットワーク層)はIPアドレスで最終的な宛先を決めますが、実際にフレームを渡すのは 第2層(データリンク層)で、そこで使われるのはMACアドレスです。
つまり「IPアドレスで宛先を決める層」と「実際に渡す層」が違うため、決めたIPアドレスを渡す直前にMACアドレスへ 変換する橋渡し役が必要になります。それがARPです。
ARPの流れ:リクエストはブロードキャスト、リプライはユニキャスト
PC(192.168.10.25)が、同じネットワーク内のゲートウェイ(192.168.10.1)のMACアドレスを調べる例で見ていきます。
- 1
ARPリクエストをブロードキャストする
「192.168.10.1 のMACアドレスを教えてください」という問い合わせを、宛先MAC FF:FF:FF:FF:FF:FF で送る。同じネットワーク内の全員に届く。
- 2
該当する機器だけが判断する
問い合わせを受け取った機器は、自分宛て(自分のIPアドレスへの質問)かどうかを確認する。違えば何もせず無視する。
- 3
該当する機器だけがARPリプライを返す
「私です。MACアドレスは AC:DE:48:AA:BB:CC です」という返信を、問い合わせ元のPCだけにユニキャストで返す。
全員に聞いて、該当者だけが答える。この非対称さ(ブロードキャストで聞いてユニキャストで返す)がARPの動き方です。
ARPテーブル(キャッシュ)
一度調べたIPアドレスとMACアドレスの対応は、機器の中にARPテーブル(ARPキャッシュ)として保持されます。 同じ相手と通信するたびにARPリクエストをやり直していては効率が悪いので、一度解決した結果を使い回すためです。
$ arp -a ? (192.168.10.1) at ac:de:48:aa:bb:cc [ether] on eth0 ? (192.168.10.30) at ac:de:48:dd:ee:ff [ether] on eth0
1行の中身を分解すると、次のようになります。
| 表示例 | 意味 |
|---|---|
| ? | ホスト名(逆引きできないと ? のまま) |
| (192.168.10.1) | IPアドレス |
| at ac:de:48:aa:bb:cc | 対応するMACアドレス |
| [ether] | アドレスの種類(Ethernet) |
| on eth0 | このエントリを学習したネットワークインタフェース |
ARPテーブルには有効期限がある
ARPテーブルのエントリは、記録したらずっと残るわけではありません。一定時間使われないと自動的に消えます(例えばCiscoルータの初期設定では4時間)。期限が切れると、次にそのIPアドレスと通信するときは、もう一度 ARPリクエストからやり直します。
ゲートウェイ宛のときは何を聞くか
別ネットワークにある相手と通信するとき、混乱しやすい点があります。ARPで尋ねるのは最終的な宛先のMACアドレスではなく、デフォルトゲートウェイのMACアドレスだということです。
理由は「なぜMACアドレスへの変換が必要か」で触れた制約の通りです。ARPは同じネットワーク内でしか使えません。 最終的な宛先が別ネットワークにいる場合、PCはそのMACアドレスを直接調べる方法を持たず、まず自分と同じ ネットワーク内にいるデフォルトゲートウェイにフレームを渡す必要があります。だからARPで尋ねる相手もゲートウェイになります。 宛先が同一ネットワークかどうかの判定自体は3-1 デフォルトゲートウェイで扱っています。
| 宛先の場所 | ARPで尋ねる相手 | 理由 |
|---|---|---|
| 同じネットワーク内 (例:192.168.10.30) | 宛先そのもの 192.168.10.30 | 直接フレームを渡せるので、宛先自身のMACが必要 |
| 別ネットワーク (例:203.0.113.50) | デフォルトゲートウェイ 192.168.10.1 | 別ネットワークには直接渡せないので、中継してくれるゲートウェイのMACが必要 |
ここで重要なのは、ARPで尋ねる相手(ゲートウェイ)と、パケットの宛先IPアドレス(サーバ)は別物だということです。 IPヘッダの宛先IPは最後まで書き換わらずサーバのままですが、Ethernetヘッダの宛先MACだけがゲートウェイのものになります。 複数のルータを経由するときに宛先MACが区間ごとに書き換わる話は2-1で扱った内容と同じしくみです。
GARP(Gratuitous ARP)
ここまでのARPは「相手のMACアドレスを尋ねる」動きでしたが、GARP(Gratuitous ARP)は自分から 自分のIPアドレスについてARPを送信する仕組みです。主に2つの用途があります。1つは、同じIPアドレスを使う 機器が既にいないかを確認する重複IPアドレスの検知(起動時に自分のIPアドレス宛てにARPを送り、 応答があれば重複と分かる)。もう1つは、MACアドレスが変わったことを周囲に知らせて、他の機器のARPテーブルを 有効期限を待たずに更新させる用途です。
練習問題(全5問)
選んでから「採点する」を押すと、解説つきで答え合わせができます。
正解:ブロードキャスト
誰のMACアドレスか分からない段階なので、宛先MACを FF:FF:FF:FF:FF:FF にして、ネットワーク内全員に届くブロードキャストで送ります。
正解:ユニキャスト
ARPリクエストには問い合わせ元のIPとMACが含まれているので、該当する機器はその相手だけにユニキャストで返信します。全員に返す必要はありません。
正解:デフォルトゲートウェイのMAC
別ネットワーク宛のフレームは、まず自分と同じネットワークにいるデフォルトゲートウェイに渡す必要があります。ARPで尋ねるのはそのゲートウェイのMACで、最終的な宛先であるサーバのMACではありません。
正解:有効期限があり、一定時間使われないと自動的に消える
ARPテーブルのエントリには有効期限があります(例えばCiscoルータの初期設定では4時間)。期限が切れると削除され、次にそのIPと通信するときはもう一度ARPリクエストからやり直します。
正解:自分のIPアドレスを宣言し、重複検知や周囲のARPテーブル更新に使う
GARPは自分のIPアドレスについてARPリクエスト(またはリプライ)を自ら送信する仕組みです。同じIPを使う機器がいないかの重複検知や、MACアドレスが変わったことを周囲に知らせてARPテーブルを更新させる用途に使われます。