同じ LAN の中で2台の機器が通信するとき、IP パケットは送信元と宛先の MAC アドレスを持つイーサネットフレームに入れて送られます。では、送信側は宛先の MAC アドレスをどうやって知るのでしょうか。ここで使われるのが ARP(Address Resolution Protocol)です。
この記事では、Cisco ルータ2台で ping を打ち、ARP テーブルとパケットキャプチャを見ながら、ARP のしくみを確認します。IP アドレスと MAC アドレスの関係は、先に 【超わかりやすく】IPアドレスとMACアドレスの違い(OSI参照モデル 第1層〜第3層) を読んでおくと理解しやすくなります。
- ARP が IP アドレスから MAC アドレスを調べるしくみ(リクエストとリプライ)
show ip arpでの ARP テーブルの見方- 最初の ping だけが失敗する理由
IPアドレスとMACアドレスの関係
IP アドレスは、OSI 参照モデルの第3層(ネットワーク層)で使う論理的なアドレスで、最終的な宛先を表します。MAC アドレスは、第2層(データリンク層)で使うアドレスで、ネットワークインタフェースごとに割り当てられています。同じネットワークの中で隣の機器にフレームを届けるときは、MAC アドレスが必要です。
送信側は、宛先の IP アドレスはわかっていても、MAC アドレスは最初は知りません。IP アドレスから MAC アドレスを調べるのが ARP の役割です。
検証の構成
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
| 表示 | 意味 |
|---|---|
| Address | IP アドレス |
| Age (min) | 学習してからの経過時間(分)。- は自分のインタフェースのアドレス |
| Hardware Addr | MAC アドレス |
| 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のしくみ
この記事の画面は、実際の画面ではなく、検証時の画面から見るポイントを抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。
ARP リクエストを確認する
R1 は R2 の MAC アドレスを知らないので、ARP リクエストを送ります。中身は「192.168.12.2 を持っているのは誰ですか。MAC アドレスを教えてください」という問い合わせで、宛先はブロードキャスト MAC アドレス(ff:ff:ff:ff:ff:ff)です。間にスイッチがある場合、ブロードキャストのフレームは同じ VLAN のすべてのポートへフラッディングされます。
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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Dst: Broadcast (ff:ff:ff:ff:ff:ff) | 宛先 MAC アドレスはブロードキャスト。同じネットワークのすべての機器が受け取る |
| 2 | Opcode: request (1) | ARP リクエストであることを示す |
| 3 | Target MAC address: 00:00:00_00:00:00Target 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 の中身に入っています。
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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Dst: 00:00:00_00:11:11 | 宛先は R1 の MAC アドレス。リプライはブロードキャストではなくユニキャストで返る |
| 2 | Opcode: reply (2) | ARP リプライであることを示す |
| 3 | Sender MAC address: 00:00:00_00:22:22Sender 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回だけ応答がありませんでした。キャプチャの一覧を見ると、通信は次の順番で行われています。
| Source | Destination | Protocol | Info |
|---|---|---|---|
| 00:00:00_00:11:11 | Broadcast | ARP | Who has 192.168.12.2? Tell 192.168.12.1 |
| 00:00:00_00:22:22 | 00:00:00_00:11:11 | ARP | 192.168.12.2 is at 00:00:00:00:22:22 |
| 192.168.12.1 | 192.168.12.2 | ICMP | Echo (ping) request id=0x0000, seq=1/256, … |
| 192.168.12.2 | 192.168.12.1 | ICMP | Echo (ping) reply id=0x0000, seq=1/256, … |
| 192.168.12.1 | 192.168.12.2 | ICMP | Echo (ping) request id=0x0000, seq=2/512, … |
| 192.168.12.2 | 192.168.12.1 | ICMP | Echo (ping) reply id=0x0000, seq=2/512, … |
| 192.168.12.1 | 192.168.12.2 | ICMP | Echo (ping) request id=0x0000, seq=3/768, … |
| 192.168.12.2 | 192.168.12.1 | ICMP | Echo (ping) reply id=0x0000, seq=3/768, … |
| 192.168.12.1 | 192.168.12.2 | ICMP | Echo (ping) request id=0x0000, seq=4/1024, … |
| 192.168.12.2 | 192.168.12.1 | ICMP | Echo (ping) reply id=0x0000, seq=4/1024, … |
- R1 が ARP リクエストを送る
- R2 が ARP リプライを返す
- R1 の ARP テーブルが更新され、R1 が R2 の MAC アドレスを学習する
- 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 アドレス(ユニキャスト) |
| Opcode | request (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 アドレスを調べている間に最初のパケットが送れないためです。
コメント