検索
連載

第11回 MACアドレスを解決するARPプロトコル基礎から学ぶWindowsネットワーク(3/4 ページ)

IPパケットを送るには、相手のIPアドレスに加えMACアドレスも知る必要がある。この変換を可能にするのがARPプロトコルだ。

Share
Tweet
LINE
Hatena

 ARPは、与えられたIPアドレスからMACアドレスを求めるためのプロトコルである。動作原理は非常に単純で、ARP要求をブロードキャストすると、該当するIPアドレスを持つコンピュータがARP応答を返す、というだけである。次の図を見ていただきたい。


ARPの動作
ARPパケットをブロードキャストで送信すると、該当するIPアドレスを持つコンピュータは、ARPの応答パケットを(ユニキャスト通信で)返送する。返信パケットには返信元のコンピュータのMACアドレスが含まれている。このARPパケットのやり取りにより、お互いのMACアドレスが分かる。後でPC3がPC1に対してARP要求を送信する必要はない。

ARPの動作

 いま、PC1が、同じイーサネットのセグメント上に存在し、同じネットワーク・アドレス(と同じネットマスク)を共有しているPC3と通信したいとする。PC1は、PC3のIPアドレスは知っているが、MACアドレスは知らないものとする。コンピュータを起動してネットワークに接続した直後の状態はほぼこのようになっているだろう。

 ここでPC3に対して通信をする(イーサネットのフレームを送信する)ためには、まずPC3のMACアドレスを求める必要がある。だがPC3のMACアドレスを知っているのは、(ほとんどの場合は)PC3だけである。だからPC3のMACアドレスを求めるためには、PC3自身に問い合わせるしかないが、MACアドレスが分からないのだから、直接問い合わせることはそもそも不可能である。この矛盾を解決するのが、ブロードキャストとARPパケットを使ったMACアドレスの解決手法である。

 ネットワークの通信には、特定の1つのコンピュータだけを対象とする「ユニキャスト通信」のほかに、不特定多数のコンピュータへいっせいに同報通信する「ブロードキャスト通信」がある(このほかに「マルチキャスト通信」などもあるが、ここでは特に触れない)。イーサネットにおける通信でも、同様にブロードキャスト通信とユニキャスト通信がある。あて先MACアドレスをオール1(FF:FF:FF:FF:FF:FF)にしてフレームを送信すると、それはブロードキャスト送信となる。この場合、同じイーサネット・セグメントに接続されているすべてのコンピュータが送信されたフレームを受け取ることになる(IPレベルでブロードキャスト通信を行う場合は、このようにイーサネット・レベルでもブロードキャスト通信になる)。

 ARPの要求パケットは、このイーサネットのブロードキャストを使って送信される(図中の(1))。これならば、PC3を含めたすべてのコンピュータがARP要求を受け取ることができる。そして、MACアドレスを要求されたコンピュータのみがARPの応答パケットを返すことにより(図中の(2))、お互いのMACアドレス情報を交換することができる。

 このARPの要求とそれに対する応答は、TCP/IPをサポートしているシステムは必ず実装している。そのため、この方法ですべてのコンピュータが通信相手のMACアドレスを取得することができる。

1.ARP要求の送信
 ARP要求を送信するコンピュータは、先のARP構造体パケットのうち、「送信元MACアドレス」と「送信元IPアドレス」のフィールドに自分の情報を入れてパケットを構築する。「あて先MACアドレス」は未定なのですべて0を入れておくが、「あて先IPアドレス」フィールドには、通信したい相手のIPアドレス(この場合は、PC3のIPアドレス)を設定する。そして「動作」フィールドを「ARP要求(1)」に設定してイーサネットのブロードキャスト機能を使ってローカルのネットワーク上へブロードキャスト送信する。これにより、同じネットワーク・セグメント上に存在するすべてのコンピュータはこのARP要求を受け取ることになる。

2.ARP応答の返信
 ARP要求を受け取ったコンピュータは、そのARP要求が自分のIPアドレス宛であるかどうかを判断し、自分宛でなければARP要求パケットを破棄する。

 自分のIPアドレスと一致すれば、ARP応答を返送する。この場合、もともとの「送信元アドレス」フィールドに入っていた値と「あて先アドレス」フィールドに入っていた値は交換される(送受信の向きが入れ替わるため)。そして「送信元MACアドレス」フィールドには、ARP応答を返送するコンピュータのMACアドレスがセットされる。つまり、すべてのフィールドの値がセットされる。

 その後、「動作」フィールドには「ARP応答(1)」がセットされ、今度はユニキャスト通信で送信元へARP応答が送られる。ARPの要求はブロードキャストだが、返信はブロードキャストではない。そのため例えばスイッチング・ハブなどを経由してネットワーク上のパケットをキャプチャしていると、応答側のパケットがキャプチャできず、調査できないことがあるので注意していただきたい。

 ARP応答を返信する側では、応答を返信すると同時に、自身の持つ「ARPテーブル(後述)」にIPアドレスとMACアドレスのペアを登録する。

3.ARP応答の受信
 ARP応答を受信したコンピュータは、ARPパケットの中からMACアドレスを取り出し、ARPテーブル中に格納する。これにより、お互いのコンピュータは、相手のIPアドレスと相手のMACアドレスの情報を取得することができる。

ARPテーブル

 ARPテーブルは、ARPパケットのやりとりで得られた情報を格納しておくためのテーブルである。ARPは(ネットワーク・パケットを送受信するという)コストの高い処理であり、IPパケットを送信するたびに利用するのは現実的ではない。そこで、1度取得したARPの情報をARPテーブルに格納しておくことにより、無用なARPパケットのやりとりを抑えて、ネットワークのパフォーマンスを最大限に活用できるようにしている。

 ARPテーブルへの登録はARPの要求パケットを受信した場合と、ARPの応答パケットを受け取った場合に行われる。ただし、ARP要求パケットは、ARPのあて先IPアドレス以外のコンピュータでも受け取るが、そこではARPテーブルには登録しない(すでにARPテーブル中にエントリが存在する場合は、その情報を更新する)。あくまでもARPの対象となっている2台のコンピュータ間でのみ、それぞれの持つARPテーブルにエントリが登録される。

 ARPテーブルには、IPアドレスとMACアドレスの対応と、それらの情報をどのインターフェイスから受信したかの情報が記録されている。そしてARPテーブルに記録されるエントリには、通常は寿命があり、最後にARPパケットを受信してから一定時間が経つと、そのエントリは自動的に消滅する。例えばWindows 2000やWindows XPシステムでは、デフォルトでは最大10分(600秒)となっている。この間を過ぎてもARPデータの更新がなければ、エントリは自動的に消去される。このような仕組みにより、例えばネットワーク・インターフェイスを取り替えたよう場合でも(IPアドレスが同じでMACアドレスが変わったような場合でも)、自動的に新しいMACアドレスに更新され、正しく通信できるようになる。

 TCP/IPのプロトコル・スタック内に保持されているARPテーブルの情報を調査したり、追加/修正したりするには、arp.exeというコマンドを利用する(詳細は次ページ)。

 ARPテーブルの情報は、IPパケットの送信のたびに参照される。もし通信相手のIPアドレスがこのARPテーブル中に存在すれば、IPパケットはただちにイーサネット・フレームとして組み立てられ、送信される。

 しかしARPテーブル中に該当するIPアドレスが見つからなければ、以上のようなARP要求の送信とその応答の受信を経てARPテーブルのエントリが追加され、その後IPパケットが送信されることになる。

ARPによる自IPアドレスの重複確認

 ARPは、通信相手のMACアドレスを知るためのプロトコルとして開発されたが、現在では、IPアドレスの重複確認のためにも利用されることが多い。以前ではTCP/IPプロトコルを利用する場合、各コンピュータに割り当てるIPアドレスが重複しないようにするのはコンピュータの所有者や管理者の責任であった。もし間違えて同じIPアドレスを複数のコンピュータに付けてしまったりすると、それらの2台とも外部からはうまく通信できなくなってしまう(IPパケットを送信する側からみると、どちらのコンピュータにパケットを送ってもよいのかが判断できず、混乱するから)。このような事態を防ぐため、最近のWindowsのTCP/IPプロトコル・スタックなどでは、システムの起動時にARPパケットを使ったIPアドレスの重複確認を行っている。

 IPアドレスが重複しているかどうかを確認する方法は、意外と簡単である。あて先IPアドレスとして自分のIPアドレスをセットしたARP要求パケットを送信するのである(送信元のIPアドレスや送信元MACアドレス・フィールドには、通常通り自分自身のアドレスがセットされている)。自分自身のIPアドレスをターゲットとするARP要求パケットなので、誰も応答するはずがない。だがもし、そのARP要求に応答するようなコンピュータがあるとすると、すでにそのIPアドレスは使用されているということが分かる。この場合は、IPアドレスが重複していることを表示して、TCP/IPのプロトコル・スタックを有効にせず、無効のままとする。なおこのIPアドレスの確認は、手動で固定的にIPアドレスを割り当てた場合だけでなく、DHCPサーバでIPアドレスを割り当てているような場合でも行われる。そのため、現在のWindowsシステムでは、以前のようなIPアドレスの重複事故を見ることは非常に少なくなった。

 ARPを使ったIPアドレスの重複確認のことを、Windowsでは「Gratuitous ARP」と呼んでいる(Gratuitousとは無償とかフリーな、という意味)。もともとはほかのコンピュータ自身が持つARPテーブルの内容を強制的に更新させるために使われていたものであり(すでにARPテーブル中に該当するエントリを持つコンピュータは、ARP要求を受けると、エントリを更新しなければならないと定義されている)、通信中にIPが変わってしまうようなモバイル・ノード向けのTCP/IP実装向けの機能であった(RFC3220「IP Mobility Support for IPv4」参照)。現在では、このようにシステム起動時のIPアドレスの重複チェックに使われることが多い。

Copyright© Digital Advantage Corp. All Rights Reserved.

ページトップに戻る