Address Resolution Protocol

**Address Resolution Protocol** (アドレス解決プロトコル、略称：**ARP**、アープ)は、与えられたインターネット層アドレス（一般的にはIPv4アドレス）に対応するリンク層アドレス（MACアドレスなど）を発見するために使用される通信プロトコルである。この対応付けは、インターネット・プロトコル・スイートにおける重要な機能である。ARPは、1982年に  （インターネット標準 STD 37）で定義され、その後 ,  により内容のエンハンスが行われている。

ARPは、ネットワーク層技術とデータリンク層技術の様々な組み合わせで実装されている。IEEE 802標準を使用したIPv4、、DECnet、(PUP)、および、FDDI、X.25、フレームリレー、ATMなどである。IEEE 802.3（イーサネット）およびIEEE 802.11（無線LAN）上のIPv4が最も一般的な使用法である。

IPv6ネットワークでは、ARPの機能はICMPv6の近隣探索プロトコル(NDP)によって提供される。

## 操作範囲
ARPはであり、メッセージがリンク層プロトコルによってカプセル化される。単一のサブネットワークの内部のみで通信され、ルータを越えてルーティングされることはない。この特性のため、ARPはインターネットプロトコルスイートのリンク層に配置される。

## パケット構造
ARPは、1つのアドレスのみの解決要求または応答を含む単純なメッセージフォーマットを使用する。ARPメッセージのサイズは、リンク層とネットワーク層のアドレスサイズによって異なる。メッセージヘッダで、各層で使用されているネットワークの種類とそれぞれのアドレスのサイズを指定する。メッセージヘッダには、要求（1）と応答（2）のどちらかであるかを示すオペレーションコードが含まれる。パケットのペイロードは、送信側ホストと受信側ホストそれぞれのハードウェアアドレスとプロトコルアドレス、計4つのアドレスで構成されている

イーサネット上で実行されているIPv4ネットワークの場合のARPパケットの構造を次の表に示す。この例では、パケットには送信元ハードウェアアドレス(SHA)と送信先ハードウェアアドレス(THA)用の48ビットフィールドと、対応する送信元プロトコルアドレス(SPA)と送信先プロトコルアドレス(TPA)用の32ビットフィールドがある。この場合のARPパケットサイズは28バイトである。

; ハードウェアタイプ (HTYPE): ネットワークプロトコルの種類。イーサネットの場合は1。
; プロトコルタイプ (PTYPE): ARPリクエスト要求が意図するインターネットプロトコル。IPv4の場合、0x0800以降の値。使用される値は、EtherTypeのものを流用する。
; ハードウェア長 (HLEN): オクテットによるハードウェアアドレスの長さ。イーサネットアドレス（MACアドレス）のサイズは6。
; プロトコル長 (PLEN): 上位層のプロトコル（PTYPEに指定された上位層プロトコル）が使用するオクテットによるアドレス。IPv4のアドレスサイズは4。
; オペレーション : 送信者が実行している動作。1は要求、2は返信。
; 送信元ハードウェアアドレス (SHA): 送信側のメディアアドレス（Media address、MACアドレス）。ARPリクエストでは、要求を送信するホストのアドレスを示す。ARP応答では、要求が探していたホストのアドレスを示す。（必ずしも、仮想メディアのように応答するホストのアドレスではない。）スイッチはMACアドレスを学習するが、このフィールドに注意を払っていないことに注意が必要である。ARP PDUは、イーサネットフレームにカプセル化され、データリンク層（第2層）のデバイスが調べる。
; 送信元プロトコルアドレス (SPA): 送信元のインターネットワークアドレス（internetwork address、IPアドレス）。
; 送信先ハードウェアアドレス (THA): 受信側のメディアアドレス（Media address、MACアドレス）。ARPリクエストでは、このフィールドは無視する。ARP応答では、このフィールドは、ARPリクエストを送信したホストのアドレスを示す。
; 送信先プロトコルアドレス (TPA): 送信先のインターネットワークアドレス（internetwork address、IPアドレス）。

ARPプロトコルのパラメータ値は Internet Assigned Numbers Authority (IANA) によって標準化され、維持されている.。

ARPのEtherTypeは0x0806である。これは、イーサネットヘッダ内で使用されてペイロードがARPパケットであることを示すものであり、カプセル化されるARPパケット内に含まれるPTYPEとは別である。

## 動作
送信元は、送信元のIPアドレス・MACアドレスと送信先のIPアドレスを格納したARPリクエスト（送信先のMACアドレスはALL0）をブロードキャストで送信する。ARPリクエストを受信した各ノードは、格納された送信先IPアドレスが自身のIPアドレスと同一であれば、自身のMACアドレスを格納したARPリプライを送信元に返信する。

### ARPキャッシュ
効率を上げるため、多くの機器では一度取得したIPアドレスとMACアドレス間のマッピング情報を**ARPテーブル**に**ARPキャッシュ**として保持する。BSD Unix に由来する TCP/IP スタックを実装した機器の多くは、タイムアウト値として 1200秒（20分）を採用している。また、Ciscoの機器ではタイムアウトのデフォルト値として14400秒（4時間）を採用している。キャッシュ情報はWindowsであればコマンドプロンプトから *arp -a* と入力すれば一覧が見られ、キャッシュ情報はハイフンで分割された6つの16進数で表示される。

## ARPプローブ
**ARPプローブ**(ARP probe)とは、送信者IPアドレス(SPA)をALL0にしたARPリクエストである。この用語は、IPv4 Address Conflict Detection（IPv4アドレス競合検出）仕様(  )で使用されている。この仕様を実装しているホストは、IPv4アドレスの使用を開始する前に（手動設定、DHCP、またはその他の手段でIPアドレスを受信したかどうかにかかわらず）、ARPプローブパケットをブロードキャストで送信して、アドレスが既に使用中かどうかを確認する必要がある。

## ARPアナウンスメント

ARPは、単純なアナウンスプロトコルとしても使用できる。これは、送信者のIPアドレスまたはMACアドレスが変更されたときに、他のホストのハードウェアアドレスのマッピングを更新するために使用される。このアナウンスメントはgratuitous ARP(GARP)メッセージとも呼ばれ、通常、送信先ハードウェアアドレス(THA)をALL0に設定し、送信元プロトコルアドレスを送信先プロトコルアドレスに格納した(TPA=SPA)ARPリクエストパケットであり、ブロードキャストで送信される。また、送信先アドレスと送信元アドレスの両方に送信元アドレスを格納(TPA=SPA、THA=SHA)したARPリプライをブロードキャストで送信したものもARPアナウンスメントとして使用される。

gratuitous ARPは、ARPリクエスト・ARPリプライのどちらも規格に規定されている正規の手法であるが、ARPリクエストを使用するほうが望ましい。デバイスによっては、どちらかのGARPを使用するように設定されているものもある。

ARPアナウンスは応答を求めることを目的としていない。パケットを受信した他のホストに対し、ARPテーブル内のキャッシュエントリを更新させることを目的としている。ARPの規格では、ARPテーブルがアドレスフィールドから更新される時のみオペレーションコードを解釈することと規定しているので、オペレーションコードは要求と応答のどちらでも良い。

多くのオペレーティングシステムは、起動時にGratuitous ARPを実行する。これは、仮に電源を落としている間にネットワークカードが変更されていた場合に、他のホストのARPキャッシュテーブルにIPアドレスと以前のMACアドレスとのマッピングが残っていると問題が起こるためである。

## ARPメディエーション
**ARPメディエーション**(ARP mediation)とは、接続した回線で異なるアドレス解決プロトコルが使用されている場合（例えば、一方の端がイーサネットで、もう一方の端がフレームリレーであるような場合）、Virtual Private Wire Service(VPWS)を介してレイヤ2アドレスを解決するプロセスである。IPv4では、各(PE)デバイスは、ローカルに接続されている(CE)デバイスのIPアドレスを検出し、そのIPアドレスを対応するリモートPEデバイスに配布する。その後、各PEデバイスは、リモートCEデバイスのIPアドレスとローカルPEデバイスのハードウェアアドレスを使用してローカルのARPリクエストに応答する。IPv6では、各PEデバイスはローカルとリモートの両方のCEデバイスのIPアドレスを検出し、次にローカルの近隣探索(ND)パケットと逆近隣探索(IND)パケットを代行受信し、それらをリモートPEデバイスに転送する。

## Inverse ARP
**Inverse Address Resolution Protocol**（**Inverse ARP**、**InARP**）は、データリンク層（レイヤ2）アドレスから他のノードのネットワーク層アドレス（IPアドレスなど）を取得するために使用される。これは主にフレームリレー（）やATMで使用される。これらのネットワークでは、仮想回線のレイヤ2アドレスはレイヤ2シグナリングから取得されることがあり、その仮想回線を使用する前に対応するレイヤ3アドレスを使用できるようにする必要がある。

ARPはレイヤ3アドレスをレイヤ2アドレスに変換するので、InARPはその逆と表現することができる。InARPはARPのプロトコル拡張として実装されている。ARPと同じパケットフォーマットを使用するが、オペレーションコードは異なる。

## Reverse ARP
Reverse Address Resolution Protocol（Reverse ARP、RARP）は、InARPと同様にレイヤ2アドレスをレイヤ3アドレスに変換するために使用する。ただし、InARPでは、要求側は別のノードのレイヤ3アドレスを照会するのに対し、RARPはアドレス設定の際に要求側自体のレイヤ3アドレスを取得するために使用される。RARPは現在ではほぼ使用されていない。RARPはBOOTPに置き換えられ、BOOTPも後にDHCPに置き換えられている。

## ARPスプーフィングとプロキシARP

ARPにはネットワーク上のARPリプライを認証する方法がなく、ARPリプライは必要なレイヤ2アドレスを持つシステム以外のシステムから送信される可能性もある。プロキシARP(Proxy ARP)は、ネットワークの設計の一部として、他のネットワークにARP要求があった場合にルータがホストに代わって回答する仕組みであり、NAT環境下において使用される例が多い。これに対して、ARPスプーフィング(ARP spoofing)は、そのシステム宛てのデータを傍受する目的で、別のシステムのアドレスに対するARPリクエストに応答するものである。ARPスプーフィングを使用して、悪意のあるユーザがネットワーク上の他のユーザーに対して中間者攻撃やDoS攻撃を行う可能性がある。ARP自体にはこのような攻撃からの保護方法は提供されておらず、ARPスプーフィング攻撃を検出して対策するための様々なソフトウェアが存在する。

## ARPの代替
それぞれのコンピュータは、レイヤ3アドレス（IPアドレスなど）とレイヤ2アドレス（イーサネットMACアドレスなど）のマッピングのデータベースを維持する。これは、主にローカルネットワークリンクからのARPパケットの受信によって維持されることから、このデータベースは一般に「ARPキャッシュ」と呼ばれる。伝統的には、静的な設定ファイルや一元管理されたリストなど、このテーブルを管理するために他の方法も使われていた。

少なくとも1980年代以降、ネットワーク接続のできるコンピュータは、このテーブルを表示したり操作したりするための'arp'というユーティリティを持っている。

## ARPスタッフィング
ネットワークカメラやネットワーク配電装置などのユーザインタフェースのない組み込みシステムでは、「ARPスタッフィング」(ARP stuffing)を使って初期ネットワーク接続を行うことができる。ただし、この仕組みはARPは関係ないので、これは不適切な名称である。

ARPスタッフィングは、コンシューマデバイスのネットワーク管理、特にイーサネットデバイスのIPアドレスの割り当てにおける以下のような問題の解決策である。

# ユーザは、DHCPなどのアドレス割り当てプロトコルを制御することができない。
# デバイスは、それを設定するためのユーザーインターフェースを持っていない。
# 適切なIPアドレスがないため、ユーザのコンピュータは通信ができない。

採用された解決策は以下の通りである。
* ユーザのコンピュータは、アドレステーブルに手動で入力（*stuffed* = 詰め込まれる）されたIPアドレスを持っている（通常はarpコマンドを使用し、MACアドレスをデバイスのラベルから取得する）。
* コンピュータは特殊なパケットをデバイスに送信する。通常は、デフォルト以外のサイズのpingパケットである。
* デバイスはこのIPアドレスを採用する。
* その後、ユーザはtelnetやWebプロトコルで通信して設定を完了する。

ARPスタッフィングを使用するデバイスは通常、攻撃に対して脆弱であるため、デバイスが正常に動作しているときはこのプロセスを無効にする。

## 標準文書
*  - Ethernet Address Resolution Protocol, Internet Standard STD 37.
*  - Reverse Address Resolution Protocol, Internet Standard STD 38.
*  - Inverse Address Resolution Protocol, draft standard
*  - IPv4 Address Conflict Detection, proposed standard

## 関連項目
* ARPスプーフィング
* Reverse address resolution protocol(RARP、リバースARP) - MACアドレスからIPアドレスに変換するプロトコル
* Gratuitous ARP - ARPパケットの送信元ホスト自身のIPアドレスに対するARP
* ブリッジ
* レイヤ3スイッチ
* 近隣探索プロトコル
*  - ルーターなどが代理でIPアドレスを回答する仕組み

## 脚注

## 外部リンク
* RFC826 "An Ethernet Address Resolution Protocol" ()
* RFC5227 "IPv4 Address Conflict Detection" (日本語訳)
* RFC5494 IANA Allocation Guidelines for the Address Resolution Protocol (ARP)
* 
* Gratuitous ARP
* ARP-SK ARP traffic generation tools
* Sample Capture file from WireSharkWiki