[[ネットワーク用語]] > ARP

* ARP [#k42a6daa]

ARP = Address Resolution Protocol アドレス解決プロトコル

[[Address Resolution Protocol - Wikipedia>http://ja.wikipedia.org/wiki/Address_Resolution_Protocol]]
>Address Resolution Protocol (アドレス解決プロトコル、略称:ARP)は、[[イーサネット]]環境において、[[IPアドレス]]からそれに対応する[[MACアドレス]]を動的に得るために用いられる[[プロトコル]]。
RFC 826で定義され、その後 RFC 5227, RFC 5494 により内容のエンハンスが行われている。

>''概要''
[[TCP/IP]]において、[[IPパケット]]を送受信するためには、下位の[[データリンク層]]のアドレスを取得する必要があり、[[MACアドレス]]が必要な場合に [[ARP]] が用いられる。
[[イーサネット]]の場合論理的な[[IPアドレス]]を物理的な[[ハードウェア・アドレス>ハードウェアアドレス]]である[[MACアドレス]]に変換する必要がある。

>''動作''
要求パケットに送信元の IPアドレス・MACアドレスと通信相手の IPアドレスの情報を格納して、Ethernet ネットワークにブロードキャストする。
要求パケットを受け取った各[[ノード]]は、自分の IPアドレスと同一であれば、自分の MACアドレスを送信元に伝える。
こうして、IPアドレスから MACアドレスを取得する。

>''ARPキャッシュ''
効率を上げるために一度取得したIPアドレスとMACアドレス間のマッピング情報をキャッシュとして保持する。
保持時間は一般的に20分である。

>''代理ARP''
他のネットワークにARP要求があった場合にルーターがホストに代わって回答する仕組みである。

** ARPの動作原理 [#c3487d35]
http://www.itbook.info/study/arp2.html

ARPには、「&color(red){ARPリクエスト};」と「&color(red){ARPリプライ};」という2種類あります。

*** ARPリクエスト [#ue26597a]
ARPリクエストは、[[MACアドレス]]を知りたいノードが対象の[[IPアドレス]]と[[MACアドレス]]の対応を調べるために使用します。
この時の送信方法は、ネットワーク内の全[[ノード]]にデータを送信する「[[ブロードキャスト]]」が使われます。

CENTER:&ref(arp3.jpg);

*** ARPリプライ [#d94b6d3f]
ARPリクエストに対して、ターゲットとなるIPアドレスを持っているノードが存在していた場合、そのノードが「ARPリプライ」を返します。

CENTER:&ref(arp4.jpg);

「ARPリクエスト」はブロードキャストで行われたが、「ARPリプライ」は[[ユニキャスト]](1対1通信)で行われます。

以上のようなやり取りによって、MACアドレスを知ることが出来るわけです。 

** ARPキャッシュ [#h29474c5]
ARPによって一度学習したMACアドレスとIPアドレスの関連付け情報は、「ARPキャッシュ」としてそのノード上で一定時間保存されます。
そして次に通信をする場合は、このARPキャッシュを参照して該当する関連付け情報があれば、その情報を使用します。

このように出来るだけ無駄なトラフィックをネットワーク上に流さないようにしているわけです。
ARPキャッシュの保持時間は、OSなどにより異なり、Windowsの場合は2分、Linuxでは15分、ルータは1時間となっています。
そして一定時間更新されない関連付け情報は保持時間を過ぎると削除されます。 

** ARP要求・ARP応答の中身 [#w22eb9e4]
http://atnetwork.info/ccna2/arp05.html

*** ARP要求の中身 [#h0de699f]

CENTER:&ref(arp0501.jpg);

コンピュータAが送信するARP要求パケットは下の構成になっています。

CENTER:&ref(arp0502.jpg);

- MACヘッダ
ARP要求は、ブロードキャストになります。その為、宛先MACアドレスは、「FF:FF:FF:FF:FF:FF」になります。

| 宛先MACアドレス | 送信元MACアドレス |
| FF:FF:FF:FF:FF:FF | 00:17:42:5B:33:01 |

- ARPヘッダ
ARP要求パケットのヘッダは、次のようになります。

CENTER:&ref(ARP_request_header.png);

目標MACアドレスは、分からないので「0」が格納されます。

*** ARP応答の中身 [#p3bede84]

CENTER:&ref(arp0503.jpg);

コンピュータEが、コンピュータAに送信するARP応答パケットは下の構成になっています。

CENTER:&ref(arp0504.jpg);

- MACヘッダ
ARP応答は、ARP要求とは違い、ブロードキャストではなく、ユニキャストになります。
宛先MACアドレスは、ARP要求時にコンピュータAのMACアドレスが判明しているので、そのMACアドレスを使用します。

| 宛先MACアドレス | 送信元MACアドレス |
| 00:17:42:5B:33:01 | 00:17:42:5B:33:05 |

- ARPヘッダ
ARP応答パケットのヘッダは、次のようになります。

CENTER:&ref(ARP_reply_header.png);

** ARPプロトコル・パケットの構造 [#r06689cd]
[[@IT:連載 基礎から学ぶWindowsネットワーク 第11回 MACアドレスを解決するARPプロトコル 1.ARPプロトコルとは>http://www.atmarkit.co.jp/fwin2k/network/baswinlan011/baswinlan011_02.html]]

パケットの構造は以下のように非常に単純であり、このパケットを送信元とあて先コンピュータの間で1回やりとりすることにより、お互いの持つIPアドレスとMACアドレス情報を交換している。

実際のMACアドレスは物理的なネットワーク媒体によって異なるが、ここではイーサネットの場合を示しておく。
イーサネットでは、お互いのコンピュータ(イーサネットでは「ノード」と呼ぶ)を6bytesのMACアドレスで識別している。
そのため、以下のARPパケットでは、6bytes(48bit)分のMACアドレスが格納できるようになっている。

CENTER:&ref(fig02.gif);
>''ARPパケットの構造''
ARPはIPアドレスからMACアドレスを求めるためのプロトコルであり、パケットの内部には送信元とあて先のIPアドレスとMACアドレスを格納するためのフィールドが用意されている。
MACアドレスとIPアドレスの格納部分は可変長であり、その長さ(bytes長)はHLENとPLENにそれぞれ書き込まれている。
イーサネットの場合はHLENは6である。PLENはIPv4では常に4となっている(IPアドレスは32bit、つまり4bytesだから)。

各フィールドの意味について説明しておこう。

*** ■ハードウェア種別(0x0001) [#c9b0584d]
これはネットワークの物理的な媒体の種類を表す、16bit幅の数値である。
イーサネットではその値は「0x0001」であり、ほかにもフレーム・リレーは0x000f、HDLCは0x0011などいくつか決まっているが(定義はRFC1700「Assingned Numbers」などに記載)、あまり深い意味は持たない。

*** ■プロトコル(0x0800) [#l1221e12]
これはARPプロトコルで取り扱う上位のプロトコルの種類を表す。
0x0800はTCP/IPプロトコルを表す(これはイーサネット・フレーム中にある、TCP/IPプロトコルを表すタイプと同じである)。

*** ■HLEN(0x06) [#j54e1059]
「HLEN(hardware address length)」はMACアドレスの長さを表す。
イーサネットの場合はこの値は「6」となっており、MACアドレスは6bytes(48bit)であることを示している。

*** ■PLEN(0x04) [#k954e325]
「PLEN(protocol address length)」は上位のプロトコルで利用されるアドレス情報の長さを表す。
Version 4のTCP/IPプロトコルではIPアドレスは4byte(32bit)であるので、このフィールドの値は「4」となっている。

*** ■動作(ARP/RARP) [#j26532d1]
ここにはARPの動作の種類を表すためのコードが入っている。
ARPプロトコルを使う場合は、最初にARP要求を送信し、該当するコンピュータがARP応答を返すというふうに動作する。
要求とその応答を区別するために2つのコードが割り当てられているが、さらにARPだけでなく、後述するRARPというプロトコルでもこの構造のパケットを使うため、可能な動作としては以下の4つがある(ARPは必須だが、RARPは実装されていないことも多い)。

| コード | 動作 |h
| 1 | ARP要求。最初にARP要求を送信する側が利用する |
| 2 | ARP要求への応答。ARP要求に該当するコンピュータが応答する場合に利用する |
| 3 | RARP要求。RARP要求を送信する側が利用する |
| 4 | RARP要求への応答。RARP要求をサービスするサーバ(RARPサーバ)が応答する場合に利用する |
CENTER:''ARP/RARPパケットにおける動作コード''

*** ■送信元MACアドレス(6bytes) [#o7db68b1]
ARP要求もしくはARP要求への応答を送信する側のコンピュータが、自分自身のMACアドレスを格納する。
イーサネットの場合、MACアドレスは6bytesなので、このフィールドに自分自身のMACアドレスを埋め込んでパケットを送信する。

*** ■送信元IPアドレス(4bytes) [#z7d0b92d]
ARP要求もしくはARP要求への応答を送信する側のコンピュータが、自分自身のIPアドレスを格納する。
IPv4の場合はIPアドレスは4bytesなので、このフィールドに自分自身のIPアドレスを埋め込んでパケットを送信する。
送信元のMACアドレスとIPアドレスは、必ず自明なので、このフィールドには必ず何らかの値がセットされていることになる。
これに対して、以下の2つのフィールドは、ARPの要求送信時には不明なので、0のままとなっている。

*** ■あて先MACアドレス(6bytes) [#j08a1a9d]
ARPの応答パケットにおいて、ARPパケットを返送する先(つまりもともとのARP要求を最初に送信した側)のコンピュータのMACアドレスがセットされるフィールド。

*** ■あて先IPアドレス(4bytes) [#o0c10023]
ARPの応答パケットにおいて、ARPパケットを返送する先(つまりもともとのARP要求を最初に送信した側)のコンピュータのIPアドレスがセットされる。


ARPパケットの構造は、以上のように利用するネットワーク媒体(MACアドレスの長さ)によって長さが変わる可能性がある。
だがイーサネット(およびその互換技術)が広く普及した現在では、ほとんどの場合は上記のような構造のARPパケットを見る機会が多いだろう。

** リンク [#w71ab6f0]
[[RARP]]
[[GARP]]
[[IPアドレス]]
[[MACアドレス]]

◆Proxy ARP(プロキシARP)
http://net-juku.org/tcpip/tcpip81.html

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS