🌶️

ARPの仕組みについて(リクエスト,リプライ,キャッシュ)

2022/08/12に公開

この記事ではARPの仕組みについてまとめます。そもそもARPとはIPアドレスとMACアドレスを紐付けるための技術です。これらは異なる機器/プロトコル/レイヤ層において動作するアドレスです。

そこでARPが2つの橋渡しとなって、IPプロトコルへMACアドレスを教える役割を担っています。(詳しくはこちらの記事をご参照下さい。)この記事ではARPの実際の動作や仕組みを中心にまとめていきます。

病院の待合室方式

ARPがMACアドレスを調べる仕組みは非常にシンプルです。一言でいえば『病院の待合室方式』です。「〇〇さんはいませんかー?」と全員へ呼びかけて、「私でーす!」という返答を待つだけです。

これがARPの場合、「190.168.1.10のIPアドレスに紐付くMACアドレスは何ですか?」と呼びかけます。該当の端末が「私でーす!」と返答し、それ以外は無視します。

具体的には3つのステップから成り立っています。一旦は全員へ呼びかけている点に注意して下さい。

  1. 全員に呼びかけて
  2. 応答を聞いて
  3. 結果を記録する

最後に記録した結果を元に宛先MACアドレスをイーサネット(L2:データリンク層)へ伝えます。上記の3ステップを難しい言葉で言えば次のようになります。

  1. 全員に呼びかけて(=ARPリクエスト)
  2. 応答を聞いて(=ARPリプライ)
  3. 結果を記録する(=ARPキャッシュ)

ARPリクエストはARP要求、ARPリプライはARP応答 ともいいます。どちらでも構いませんがパケットを投げているイメージに近い(と個人的には感じている)ので、ARPリクエスト/リプライという名前を使っていきます。

ARPパケットによる呼びかけ

呼びかけ/応答の仕組みを具体的に学んでいきます。ARPリクエストとARPリプライは「ARPパケット」というデータをやり取りすることによって行われます。例えば192.168.1.10のMACアドレスを知りたいとします。その場合、ARPリクエストとして「〇〇さんはいませんかー?」と全ての端末へ呼びかけます。具体的にはARPパケットを全ての端末へ投げかけ、該当する端末だけが返事をします。(自分でなければ無視します。)

返事の際にも同じようにARPパケットを返却します。「私でーす!」とMACアドレスを記載して送り返します。(これをARPリプライと呼びました。)

これら2つのパケットだけでARPはIPアドレスとMACアドレスを紐付けています。

ARPパケットへのカプセル化

ARPの仕事はあくまでARPパケットを作るところまでです。実際にARPパケットを運び、LAN上の世界へ送り出すのはイーサネットの役割です。

まずはAPRがARPパケットを作り、そこに対してインターネットヘッダ/トレーラが付与されます。なぜならARPパケットはイーサネットによって送られるからです。イーサネットで送られるならば、イーサネットの規格(プロトコル)に従う必要があります。

イーサネットヘッダが上記のような中身であったことを思い出して下さい。「イーサネットペイロード」とありますが、ARPパケットではこの部分が「ARPパケット」となるだけです。上記のフレームフォーマットで注目したいのが以下の2つです。

宛先MACアドレス

ARPリクエストはブロードキャストで全端末へ送られます。つまり宛先MACアドレスにはブロードキャストアドレスであるff:ff:ff:ff:ff:ffが入ります。

タイプコード

0x0806と定義され、これによってデータ部分がARPメッセージであることを表します。

ARPのフレームフォーマット

ARPのフレームフォーマットの詳しい中身を見ていきます。

ハードウェアタイプ

使用しているL2プロトコルを表す情報です。2バイト(16ビット)のフィールドとなっています。様々なL2プロトコルが定義されており、イーサネットの場合は0x0001が入ります。

プロトコルタイプ

使用しているL3プロトコルを表す情報です。2バイト(16ビット)のフィールドとなっています。様々なL2プロトコルが定義されており、IPv4の場合は0x0800が入ります。

ハードウェアアドレスサイズ

MACアドレスのサイズをバイト単位で表します。MACアドレスは48ビット=6バイトなので6が入ります。

プロトコルアドレスサイズ

IPアドレスのサイズをバイト単位で表します。IPアドレス(ここではv4)の長さは32ビット=4バイトなので4が入ります。

オペレーションコード

ARPフレームの種類を表す情報です。ほとんどの場合、ARPリクエストを表す1もしくはARPリプライを表す2が入ります。

送信元MACアドレス/送信元IPアドレス

ARPを送信する端末のMACアドレスとIPアドレスです。送り主のアドレスがそのまま入ります。

目標MACアドレス/目標IPアドレス

ARPで解決したいMACアドレスとIPアドレスです。IPアドレスは分かっていますが、MACアドレスはもちろん分かりません(それを知るのが今回の目的なので)。そこで最初はダミーのMACアドレスとして00:00:00:00:00:00が入ります。

ARPのキャッシュ機能

「全員に対して呼びかける」というARPの特徴・仕組みを学んできました。しかしARPには1つ欠点があります。ブロードキャストでARPリクエストを送るので、毎回送っているとトラフィックが膨大になってしまう点です。1番最初の時点ではMACアドレスを知らないので仕方ないですが、その後何度も全端末へ送っていては非効率です。

そこでARPではリクエストの結果明らかになったMACアドレスとそれに紐付くIPアドレスを記録しています。これをAPRキャッシュと呼びます。(そもそもキャッシュとは一時的にデータを保存しておく機能のことです。)保存された情報がデータベースの表形式になっていることから、ARPキャッシュはARPテーブルとも呼びます。

ARPによってMACアドレスを調べた場合、ARPテーブルのエントリ(データ)として追加します。エントリを保持している間はARPを送信しません。一定の時間(タイムアウト時間)が経過したら、情報を更新するためにもエントリは削除されます。そしてまたARPリクエストが送られる..といった流れとなっています。

Discussion