3.5. ARP

ARP はアドレス解決プロトコル (Address Resolution Protocol) の意味で、 RFC 826 に記述されています。ARP はネットワークにあるマシンが、 同じローカルネットワークにある他のマシンのハードウェア位置 (アドレス) を解決するために用います。インターネットにあるマシンは、 一般に名前で知られており、この名前が IP アドレスへと解決されます。 これが、foo.com ネットワークにあるマシンが bar.net ネットワークにある他のマシンと通信できる理由です。 しかし IP アドレスは、マシンの物理的な位置を伝えてはくれません。 そこで ARP が登場するわけです。

非常に簡単な例を取り上げましょう。いくつかのマシンからなるネットワークを 想像してください。いま私のネットワークにある 2 台のマシンが、 IP アドレス 10.0.0.1 の foo と IP アドレス 10.0.0.2 の bar であるとします。 いま foo が、bar が生きているかどうか ping で確かめたいと思いました。 しかし残念なことに、foo は どこに bar がいるかがわかりません。 よって foo は bar に ping するまえに、ARP 要求を送る必要があります。 この ARP 要求は、「bar (10.0.0.2)! どこにいるんだ?」と foo が叫ぶようなものです。この結果ネットワークのすべてのマシンは foo が叫んでいるのを聞きますが、bar (10.0.0.2) のみがこれに応えます。 bar はこのとき ARP 返信を直接 foo に返します。これは 「foo (10.0.0.1)、私はここ 00:60:94:E9:08:12 にいるよ」 と bar が言うのに似ています。この簡単な、 友達がネットワークのどこにいるかを知るためのやり取りの後に、 foo は bar と通信できるようになります。 これは foo (foo の arp キャッシュ) が bar の場所を忘れるまで (通常 Unix では 15 分) 有効です。

では、実際にどのように動作するかを見てみましょう。 あなたのマシンの現在の arp/近隣 キャッシュ/テーブル は、次のようにしてみることができます。

[root@espa041 /home/src/iputils]# ip neigh show
9.3.76.42 dev eth0 lladdr 00:60:08:3f:e9:f9 nud reachable
9.3.76.1 dev eth0 lladdr 00:06:29:21:73:c8 nud reachable

みてわかるとおり私のマシン espa041 (9.3.76.41) は、 espa042 (9.3.76.42) および espagate (9.3.76.1) の位置を知っています。ここで別のマシンを arp キャッシュに追加してみましょう。

[root@espa041 /home/paulsch/.gnome-desktop]# ping -c 1 espa043
PING espa043.austin.ibm.com (9.3.76.43) from 9.3.76.41 : 56(84) bytes of data.
64 bytes from 9.3.76.43: icmp_seq=0 ttl=255 time=0.9 ms

--- espa043.austin.ibm.com ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.9/0.9/0.9 ms

[root@espa041 /home/src/iputils]# ip neigh show
9.3.76.43 dev eth0 lladdr 00:06:29:21:80:20 nud reachable
9.3.76.42 dev eth0 lladdr 00:60:08:3f:e9:f9 nud reachable
9.3.76.1 dev eth0 lladdr 00:06:29:21:73:c8 nud reachable

espa041 が espa043 に接続を試みた結果、 espa043 のハードウェアアドレス/位置が arp/近隣 キャッシュに追加されました。 よって espa043 のエントリが (その間 2 台の間に通信がなく) 時間切れになるまで、 espa041 は espa043 の場所を知っており、ARP 要求を送る必要はありません。

では espa043 を arp キャッシュから削除してみましょう。

[root@espa041 /home/src/iputils]# ip neigh delete 9.3.76.43 dev eth0
[root@espa041 /home/src/iputils]# ip neigh show
9.3.76.43 dev eth0  nud failed
9.3.76.42 dev eth0 lladdr 00:60:08:3f:e9:f9 nud reachable
9.3.76.1 dev eth0 lladdr 00:06:29:21:73:c8 nud stale

これで espa041 は再び espa043 がどこにあるかを忘れてしまったので、 次に espa043 と通信しようと思ったときには再度 ARP 要求を送る必要があります。 上記の出力には、espagate (9.3.76.1) が "stale" 状態に変わったことも示されています。これが意味するのは、 位置情報はまだ有効であるものの、 そのマシンと最初にやり取りをする際には確認が必要である、ということです。