結論から先に言ってしまうと、ARP(正確にはARPテーブル)はIPアドレスとMACアドレスの紐づけを示すものです。試しに私のPCのコマンドプロンプトでarpコマンドを実行してみた結果が図1です。インターネットアドレス(IPアドレス)、物理アドレス(MACアドレス)、種類が表示されていますね。結果だけ述べると以上なのですが、ここからはIPアドレスやMACアドレスを簡単におさらいしつつ、ARPの動きについて簡単に説明してみたいと思います。
【復習】MACアドレスって何だっけ?
ARPの動作を理解するにはMACアドレスを分かっていなければならないので簡単に復習しておきます。
MACアドレスはネットワークインターフェースカード(NIC)に割り当てられた識別IDのことです。NICはPCなどをLANにつなぐためのカード型の拡張装置のことで、最も一般的なものとしては図2のようなイーサネット(有線LAN)ようのものでしょう。ハードウェアに対して割り当てられているため、物理アドレスとも呼ばれます。PC、スイッチングハブ(の各ポート)など各通信機器ごとに異なる値を持っているため、データを通信する際の送り先を示すために使われます。
MACアドレスは48ビット(8ビット×6)で構成されており16進数で表記されます。上位3ビットはNICの製造者ごとに割り振られたコード(OUI)で、下位3ビットは製造者が出荷時に割り振る仕様(UAA)となっています。
以前は同じMACアドレスは世界に2つと存在しないものでしたが、最近ではNIC製造者がMACアドレスを流用することもあり、必ずしも一意的にはなっていないようです。先述したように、MACアドレスはデータの送り先を示す目的で使用されるので、もし同一ネットワーク内で重複が発生した場合は、製造者がMACアドレスを振り直さなければなりません。
【復習】MACアドレスとIPアドレスは何が違う?
IPアドレスはご存知の方も多いと思うので、ここではMACアドレスとの違いについて説明します。
念のために確認しておくと、IPアドレスはネットワークに接続されている端末を識別する32ビットのIDで、例えば$192.168.10.11$のように表記されます。この一文だけを見ると、先ほどのMACアドレスとの違いがよく分からないと思うので、次からその違いについて確認していきましょう。
- IPアドレスはOSに割り当てられた論理アドレスである。
IPアドレスは論理的なアドレスなので、いくらでも変更することができます。一方でMACアドレスはNICに割り振られた物理アドレスなので(NICの製造者でない限り)変更することは困難です。
- IPアドレスはデータの最終送り先を表す
MACアドレスもデータの送り先を示すために使われることに間違いはありませんが、ローカルネットワーク内で「次にどの機器にデータを渡すか」を示すために使われます。一方で、IPアドレスは端末が所属するローカルネットワークの枠を飛び越えて、「最終的にどこにデータが送られるのか」を指定するために利用されます。
もう少し細かい事を言えば、MACアドレスはデータリンク層、IPアドレスはネットワーク層で使用するという違いがありますが、ネットワークの階層モデルについては今回は立ち入らないことにしたいと思います。
どうでしょうか?MACアドレスとIPアドレスの違いが明確になったでしょうか?
ARPはどうやってMACアドレスとIPアドレスを紐づけるのか?
さて、ここまでの説明から実際にデータ通信を行なうためにはMACアドレスとIPアドレスの両方が必要だということがお分かりいただけたかと思います。従って、正しくデータを送信するためには送り先のIPアドレスとMACアドレスを矛盾なく設定する必要があります。
少し分かりづらいかもしれないので、具体的な例で置き換えてみましょう。例えば、あるPC1からPC2へデータを送りたいとします。今回は簡単のためにPC1もPC2も同じローカルネットワーク内にあるとします。この時データを送る際にはIPアドレスもMACアドレスもPC2の値を設定しなければ正しくデータは送れません。例えば、どちらか一方が別のPC3の値になっていると当然ながら問題です。すなわち、実際にデータをやりとりする際にはIPアドレスとMACアドレスの正しい紐づけを把握しておく必要があるのです。ここで活躍するのが最初に登場したARPテーブルです。ここにIPアドレスとMACアドレスの紐づけが記録されているので、これを参照することで正しいデータの送信が可能となります。ただし、ARPテーブルは始めから埋まっているわけではないので、初めてデータ通信を行なう際には、それを埋める作業が発生します。このようにIPアドレスとMACアドレスの紐づけを明らかにする作業をアドレス解決と言います。ここからはアドレス解決の流れを簡単に説明してみます。
ここでは以下のPC1からPC2にデータを送るという前提で話を進めます。データを送る際にはIPアドレスが先に設定され、その後でMACアドレスが設定されるので、今回はMACアドレスが設定されるところから話を始めます。
- PC1はPC2のIPアドレス($192.168.10.21$)に対応するMACアドレスを把握するために、自分のARPテーブルを調べます。もし、ARPテーブルを見てMACアドレスが分かれば、それを設定して終わりです。ここではMACアドレスが分からなかった前提で話を進めます。
- MACアドレスが分からなかったので、次にPC1はネットワーク内の全ての端末に向かってARPリクエストを送ります。ここでは一旦送り先のMACアドレスはff:ff:ff:ff:ff:ffにセットされます。ちなみに、このようにネットワーク内の全ての端末にデータを送ることをブロードキャストと言います。このARPリクエストは今回の対象となる端末では受信されますが、それ以外の端末では破棄されます。
- ARPリクエストを受け取ったPC2はPC1に向かってARPリプライを返します。この時、PC2からPC1へ送るデータの送信元情報としてPC2のMACアドレスが含まれるので、これをもってPC1はPC2のMACアドレスを知ることになります。ちなみに、今度はPC2からPC1へのピンポイントの通信なので、ブロードキャストに対してユニキャストと呼ばれます。
- PC1はPC2からのARPリプライに含まれるMACアドレスを自分のAPRテーブルに書き込みます。そして、送り先のMACアドレスにPC2のMACアドレスを設定して、データの送信を実行します。
以上がARPの説明です。少しでも理解が深まったということであれば幸いです!!