初心者向けARP解説:仕組みをCiscoルータでわかりやすく解説

同じ LAN の中で2台の機器が通信するとき、IP パケットは送信元と宛先の MAC アドレスを持つイーサネットフレームに入れて送られます。では、送信側は宛先の MAC アドレスをどうやって知るのでしょうか。ここで使われるのが ARP(Address Resolution Protocol)です。

この記事では、Cisco ルータ2台で ping を打ち、ARP テーブルとパケットキャプチャを見ながら、ARP のしくみを確認します。IP アドレスと MAC アドレスの関係は、先に 【超わかりやすく】IPアドレスとMACアドレスの違い(OSI参照モデル 第1層〜第3層) を読んでおくと理解しやすくなります。

この記事でわかること
  1. ARP が IP アドレスから MAC アドレスを調べるしくみ(リクエストとリプライ)
  2. show ip arp での ARP テーブルの見方
  3. 最初の ping だけが失敗する理由

IPアドレスとMACアドレスの関係

IP アドレスは、OSI 参照モデルの第3層(ネットワーク層)で使う論理的なアドレスで、最終的な宛先を表します。MAC アドレスは、第2層(データリンク層)で使うアドレスで、ネットワークインタフェースごとに割り当てられています。同じネットワークの中で隣の機器にフレームを届けるときは、MAC アドレスが必要です。

送信側は、宛先の IP アドレスはわかっていても、MAC アドレスは最初は知りません。IP アドレスから MAC アドレスを調べるのが ARP の役割です。

検証の構成

R1R2192.168.12.0/24.1.2MAC アドレス0000.0000.1111MAC アドレス0000.0000.2222FastEthernet0/0.12
図1 検証構成

R1(192.168.12.1、MAC アドレス 0000.0000.1111)と R2(192.168.12.2、MAC アドレス 0000.0000.2222)が、192.168.12.0/24 でつながっています。どちらもサブインタフェース FastEthernet0/0.12 を使っています。

R1とR2のARPテーブルの確認

通信前の ARP テーブルを確認する

まず、R1 と R2 の ARP テーブルを確認します。

R1・R2

R1# show ip arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.12.1            -   0000.0000.1111  ARPA   FastEthernet0/0.12

R2# show ip arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.12.2            -   0000.0000.2222  ARPA   FastEthernet0/0.12
表示意味
AddressIP アドレス
Age (min)学習してからの経過時間(分)。- は自分のインタフェースのアドレス
Hardware AddrMAC アドレス
Type ARPAイーサネットの ARP で学習したエントリ
Interfaceそのアドレスがあるインタフェース

この時点では、R1 と R2 の ARP テーブルには自分自身のエントリ(Age が -)しかありません。R1 は R2 の MAC アドレスをまだ知りません。

R1からR2へのPing送信

R1 から R2 へ ping を送る

R1(192.168.12.1)から R2(192.168.12.2)へ ping を送ります。

R1

R1# ping 192.168.12.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.12.2, timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 8/22/40 ms

5回のうち最初の1回(.)が失敗し、残りの4回(!)は成功しています。この最初の失敗には ARP が関係しています(理由は後で説明します)。

この ping の IP パケットは、送信元 IP アドレスが 192.168.12.1、宛先 IP アドレスが 192.168.12.2 です。このパケットを送信元 MAC アドレスと宛先 MAC アドレスを持つイーサネットフレームに入れて送るには、R2 の MAC アドレスが必要です。

ping 後の ARP テーブルを確認する

R1

R1# show ip arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.12.1            -   0000.0000.1111  ARPA   FastEthernet0/0.12
Internet  192.168.12.2            0   0000.0000.2222  ARPA   FastEthernet0/0.12

R1 は 192.168.12.2 の MAC アドレスが 0000.0000.2222 であることを学習しました(Age は 0 分)。これで R1 は、送信元 MAC アドレス 0000.0000.1111、宛先 MAC アドレス 0000.0000.2222 のイーサネットフレームを作って送れます。R1 がこの MAC アドレスをどうやって知ったのかを、次に ARP の流れで確認します。

補足

学習した ARP エントリは、しばらく使われないと消えます。Cisco ルータの既定のタイムアウトは 4 時間です。

ARPのしくみ

R1R2ARP リクエスト(ブロードキャスト)宛先 MAC:ff:ff:ff:ff:ff:ff192.168.12.2 の MAC アドレスは?ARP リプライ(ユニキャスト)宛先 MAC:0000.0000.1111192.168.12.2 は 0000.0000.2222ICMP Echo request(ping)宛先 MAC:0000.0000.2222ICMP Echo reply
図2 ARP リクエスト、ARP リプライ、ping の流れ
画面イメージについて

この記事の画面は、実際の画面ではなく、検証時の画面から見るポイントを抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。

ARP リクエストを確認する

R1 は R2 の MAC アドレスを知らないので、ARP リクエストを送ります。中身は「192.168.12.2 を持っているのは誰ですか。MAC アドレスを教えてください」という問い合わせで、宛先はブロードキャスト MAC アドレス(ff:ff:ff:ff:ff:ff)です。間にスイッチがある場合、ブロードキャストのフレームは同じ VLAN のすべてのポートへフラッディングされます。

パケットキャプチャ(Wireshark) ARP リクエスト画面イメージ
1▸ Ethernet II, Src: 00:00:00_00:11:11 (00:00:00:00:11:11), Dst: Broadcast (ff:ff:ff:ff:ff:ff)▸ 802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 12▾ Address Resolution Protocol (request)    Hardware type: Ethernet (1)    Protocol type: IPv4 (0x0800)    Hardware size: 6    Protocol size: 42    Opcode: request (1)    Sender MAC address: 00:00:00_00:11:11 (00:00:00:00:11:11)    Sender IP address: 192.168.12.13    Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00)    Target IP address: 192.168.12.2
図3 ARP リクエストの中身(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Dst: Broadcast (ff:ff:ff:ff:ff:ff)宛先 MAC アドレスはブロードキャスト。同じネットワークのすべての機器が受け取る
2Opcode: request (1)ARP リクエストであることを示す
3Target MAC address: 00:00:00_00:00:00
Target IP address: 192.168.12.2
調べたい相手の IP アドレス。MAC アドレスはわからないので 0 で埋めている

Wireshark では MAC アドレスを 00:00:00:00:11:11 の形で表示します。Cisco の 0000.0000.1111 と同じ値です。802.1Q Virtual LAN ... ID: 12 は、サブインタフェース FastEthernet0/0.12 で VLAN 12 のタグが付いていることを表します。

ARP リプライを確認する

R2 は ARP リクエストを受け取り、「192.168.12.2 を持っているのは私です」と応答します。この ARP リプライは R1 の MAC アドレス宛て(ユニキャスト)に送られ、R2 の MAC アドレス(0000.0000.2222)が ARP の中身に入っています。

パケットキャプチャ(Wireshark) ARP リプライ画面イメージ
1▸ Ethernet II, Src: 00:00:00_00:22:22 (00:00:00:00:22:22), Dst: 00:00:00_00:11:11 (00:00:00:00:11:11)▸ 802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 12▾ Address Resolution Protocol (reply)    Hardware type: Ethernet (1)    Protocol type: IPv4 (0x0800)    Hardware size: 6    Protocol size: 42    Opcode: reply (2)3    Sender MAC address: 00:00:00_00:22:22 (00:00:00:00:22:22)    Sender IP address: 192.168.12.2    Target MAC address: 00:00:00_00:11:11 (00:00:00:00:11:11)    Target IP address: 192.168.12.1
図4 ARP リプライの中身(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Dst: 00:00:00_00:11:11宛先は R1 の MAC アドレス。リプライはブロードキャストではなくユニキャストで返る
2Opcode: reply (2)ARP リプライであることを示す
3Sender MAC address: 00:00:00_00:22:22
Sender IP address: 192.168.12.2
問い合わせの答え。192.168.12.2 の MAC アドレスは 00:00:00:00:22:22

R1 はこのリプライを受け取り、ARP テーブルに 192.168.12.2 と 0000.0000.2222 を登録します。なお、R2 も ARP リクエストの Sender(R1 の IP アドレスと MAC アドレス)を見て、R1 の MAC アドレスを学習します。そのため、R2 から R1 への返事(ping の応答)では、R2 が改めて ARP リクエストを送る必要はありません。

初回のPingリクエストが失敗する理由

キャプチャで通信の順番を確認する

STEP 2 の ping では、5回のうち最初の1回だけ応答がありませんでした。キャプチャの一覧を見ると、通信は次の順番で行われています。

パケットキャプチャ(Wireshark) パケット一覧画面イメージ
SourceDestinationProtocolInfo
00:00:00_00:11:11BroadcastARPWho has 192.168.12.2? Tell 192.168.12.1
00:00:00_00:22:2200:00:00_00:11:11ARP192.168.12.2 is at 00:00:00:00:22:22
192.168.12.1192.168.12.2ICMPEcho (ping) request id=0x0000, seq=1/256, …
192.168.12.2192.168.12.1ICMPEcho (ping) reply id=0x0000, seq=1/256, …
192.168.12.1192.168.12.2ICMPEcho (ping) request id=0x0000, seq=2/512, …
192.168.12.2192.168.12.1ICMPEcho (ping) reply id=0x0000, seq=2/512, …
192.168.12.1192.168.12.2ICMPEcho (ping) request id=0x0000, seq=3/768, …
192.168.12.2192.168.12.1ICMPEcho (ping) reply id=0x0000, seq=3/768, …
192.168.12.1192.168.12.2ICMPEcho (ping) request id=0x0000, seq=4/1024, …
192.168.12.2192.168.12.1ICMPEcho (ping) reply id=0x0000, seq=4/1024, …
図5 ping 実行時のパケット一覧(実際の画面ではなく、表示内容のポイントを示したイメージです)
  1. R1 が ARP リクエストを送る
  2. R2 が ARP リプライを返す
  3. R1 の ARP テーブルが更新され、R1 が R2 の MAC アドレスを学習する
  4. 2回目以降の ping(seq=1〜4)が送られ、応答が返る

一覧の ICMP は seq=1 から始まっていて、最初の Echo request(seq=0)は記録されていません。R1 は最初の ping を送ろうとした時点で R2 の MAC アドレスを知らなかったため、そのパケットは送らずに破棄し、代わりに ARP リクエストを送りました。ARP が終わったあとの ping は送れたので、結果は .!!!!(4/5)になりました。

もう一度 ping を打つと、R1 はすでに R2 の MAC アドレスを ARP テーブルに持っているので、5回とも成功します。最初の1回の失敗は異常ではありません。

うまくいかないとき

状態よくある原因確認すること
最初の1回だけ失敗するARP で MAC アドレスを調べている間の正常な動きもう一度 ping を打ち、5回とも成功すれば問題ない
すべて失敗し、相手の MAC アドレスを学習していないARP リプライが返らない(相手が停止している、VLAN やケーブルが違う、IP アドレスの設定ミスなど)show ip arp で相手のエントリがあるか、Hardware Addr が Incomplete になっていないか
ARP の動きをもう一度見たいすでに ARP テーブルに相手のエントリがあるclear arp-cache で ARP テーブルを消してから ping を打つ

まとめ

項目ARP リクエストARP リプライ
送る側MAC アドレスを知りたい機器(R1)問い合わせられた IP アドレスを持つ機器(R2)
宛先 MAC アドレスブロードキャスト(ff:ff:ff:ff:ff:ff)問い合わせた機器の MAC アドレス(ユニキャスト)
Opcoderequest (1)reply (2)
中身「192.168.12.2 の MAC アドレスは?」「192.168.12.2 は 00:00:00:00:22:22」

ARP は、IP アドレスから MAC アドレスを調べるためのプロトコルです。学習した結果は ARP テーブルに保存され、次の通信からはそのまま使われます。最初の ping だけが失敗するのは、ARP で MAC アドレスを調べている間に最初のパケットが送れないためです。

コメント