それでは実際のARPパケットの例を見てみよう。これは「192.168.0.103」というコンピュータから、「192.168.0.11」というコンピュータに対して、pingコマンドを1パケット送信した場合の例である。Windows Serverのネットワーク・モニタでキャプチャ・解析している。pingを1パケットだけ送信するので、ICMPのechoパケット(次回解説予定)が1往復するだけであるが、その前に、ARPによるアドレス解決のパケットが1往復している。
ブロードキャストで送信されるARP要求パケットには、送信元のIPアドレスやMACアドレス、あて先のIPアドレスがセットされている。だがあて先MACアドレス・フィールドにはすべて0が埋められていることが分かるだろう。この部分の情報は、ARPの応答によって始めて得られる。
このARP要求パケットに対する応答の内容を次に示す。あて先と送信元のフィールドの内容がすべて入れ替わり、さらに送信元MACアドレス・フィールドにも値がセットされていることが分かるだろう。
ARPテーブルの内容を表示させたり、変更したりするために、WindowsシステムにはARP.EXEというコマンドが用意されている。引数を何も付けずに実行すると使い方が表示される。
■ARPテーブルの表示
現在のARPテーブルの内容を表示させるには、「-a」オプションを付けて実行する。
C:\>arp -a
Interface: 192.168.0.103 --- 0x2 …インターフェイス
Internet Address Physical Address Type
192.168.0.51 00-a0-c9-b4-08-22 dynamic
192.168.0.54 00-d0-b7-5c-5e-0c dynamic
192.168.0.55 00-02-b3-8a-a5-03 dynamic
192.168.0.112 00-da-ba-da-ba-da dynamic
この例では、全部で5つのエントリが表示されている。ARPキャッシュ・エントリの寿命はデフォルトでは10分なので、(最近まで)これらの5台と通信していた、ということが推測される。Type欄にある「dynamic」というのは動的なエントリを表しており、通常はすべてこのタイプになっている。動的とは、登録が自動的に行われ、さらに時間が経つと自動的に消滅するという意味である。だが以下のように手動でエントリを追加すると「static(静的)」となる。
なおARPテーブルのエントリは、インターフェイスごとに管理されているので、システムに複数のインターフェイスがある場合は「Interface:」の項が複数表示される。
■ARPテーブルの追加
ARPテーブルに手動でエントリを追加するには、「-s」オプションを付けて、IPアドレスとMACアドレスを指定する。
C:\>arp -a …元のARPテーブル
Interface: 192.168.0.103 --- 0x2
Internet Address Physical Address Type
192.168.0.51 00-a0-c9-b4-08-22 dynamic
192.168.0.54 00-d0-b7-5c-5e-0c dynamic
192.168.0.55 00-02-b3-8a-a5-03 dynamic
C:\>arp -s 192.168.0.21 00-aa-00-62-c6-09 …静的エントリの追加
C:\>arp -a …新しいARPテーブル
Interface: 192.168.0.103 --- 0x2
Internet Address Physical Address Type
192.168.0.21 00-aa-00-62-c6-09 static …静的エントリ
192.168.0.51 00-a0-c9-b4-08-22 dynamic
192.168.0.54 00-d0-b7-5c-5e-0c dynamic
192.168.0.55 00-02-b3-8a-a5-03 dynamic
通常はこのオプションを使うことはないだろうが、(現在では)一部のプリント・サーバ(プリンタのパラレル・ポートに取り付けて、ネットワーク対応プリンタに変換するための装置)やルータなどで使われていることがある。それらの機器では、外部からIPパケットを送ると、自分自身のIPアドレスをそのIPパケットに合うように書き換える機能を持っている。これにより、簡単にIPアドレスを設定できるようにしている。例えば、そのネットワーク機器(のMACアドレス)に向けて「192.168.0.21」というあて先IPを持つパケットを送信すると、その機器のIPアドレスが自動的に「192.168.0.21」となるのである。そのようなパケットを特定のMACアドレスに向けて送信するには、あらかじめARPテーブルのエントリを用意しておけばよい。このために「-s」オプションが利用できる。こうすると、「192.168.0.21」に向けてパケットを送信しようとすると、自動的に指定したMACアドレスへ向けてイーサネット・フレームが送信される。
■ARPエントリの削除
ARPエントリを強制的に削除するには、「-d」オプションを使う。ネットワーク機器を入れ換えたりした場合に、強制的にARPテーブルをフラッシュ(消去)したいような場合に利用する。本来ならば自動更新エントリは、通信が途絶えて(デフォルトでは)10分もすると削除されるはずだが、ネットワークの構成が複雑な場合(例:クラスタ構成などを使っているので、同じIPアドレスでも複数のMACアドレスがある、というような場合など)には、手動でARPエントリを削除したいことがある。「-d」オプションはこのような場合に利用する。「-d」オプションだけを指定すると、すべてのエントリが消去されるが、IPアドレスを指定して特定のエントリだけを削除することもできる。
C:\>arp -a …現在の状態
Interface: 192.168.0.103 --- 0x2
Internet Address Physical Address Type
192.168.0.51 00-a0-c9-b4-08-22 dynamic
192.168.0.54 00-d0-b7-5c-5e-0c dynamic
192.168.0.55 00-02-b3-8a-a5-03 dynamic
C:\>arp -d …エントリを全部削除する
C:\>arp -a
No ARP Entries Found …すべて削除された
ARPと似たプロトコルとして、「RARP(Reverse ARP)」というプロトコルもある。ARPパケットの構造のところで解説したように、RARPはARPと同じ構造のパケットを使っている。違いは、動作コードが異なるだけである(ARP要求/応答に対して、RARP要求/応答の2つがある)。ただしすべてのTCP/IPノードがARPをサポートしているのに対し、RARPはオプション規格であり、実装していないことも多い。特にRARPの要求にこたえる側(RARPサーバ)の機能は、特別なシステムでない限り持っていないことが多い。だが構造も機能も似ているので、ここで紹介しておこう。RARPはRFC903「A Reverse Address Resolution Protocol」で定義されている。
RARPは名前のとおり、ARPとは逆の動作をするためのプロトコルである。ARPが「IPアドレスからMACアドレスを求める」プロトコルであるのに対し、RARPは「MACアドレスからIPアドレスを求める」ために使われる。現在ではこのような目的に使われるプロトコルとして、BOOTPやDHCPが広く一般的に使われているが、10年ほど前まではこのRARPを使って起動するようなシステム(特にディスクレスのUNIXワークステーションなど)も多かった。
RARPのクライアントは、システムの起動時に自分自身のMACアドレスをRARPサーバに対してブロードキャストする。するとRARPのサーバはそのMACアドレスに対するIPアドレスをRARPの応答パケットに入れて返送する。これによってRARPのクライアントは自分自身のIPアドレスを取得することができ、その後のシステムのブート作業を続行することができるのである(RARPの送受信部分は、専用の小さなブート・コードとしてあらかじめシステムのROMの中に用意しておく)。
RARPは、機能や原理は単純であるが、ARPと同じパケット構造を使っているので、IPアドレスしか渡せず、ドメイン名やゲートウェイ、サブネット情報などを渡すことができない。またブロードキャストでしか利用できないので(ルータを越えることができない)、現在ではBOOTPやDHCPにとって代わられている。
Copyright© Digital Advantage Corp. All Rights Reserved.