TCP/IPにおける「ARP(Address Resolution Protocol。アープ)」プロトコルとは、IPアドレスから物理層のネットワーク・アドレス(MACアドレス)を求めるために利用されるプロトコルのことである(TCP/IP以外でもARPという名称や同様の機能を持つプロトコルは広く使われている)。
TCP/IPでは、IPアドレスで通信相手を特定し、そのIPアドレスに向けてIPパケットを送信する。もし通信相手が同一ネットワーク上に存在するなら、そのあて先のコンピュータに向けて直接IPパケットを送信するし、そうでない場合はルータ(ゲートウェイ)に向けてIPパケットを送信し、その後のパケットの配送を依頼する。このとき、相手のコンピュータやルータに対してIPパケットを送信するためには、イーサネットなどの下位のネットワーク媒体を使うが、そこではIPアドレスではなく、MACアドレスを使って通信相手を特定している。そのため、例えばイーサネットを使ってパケットを送信するためには、IPアドレスだけでなく、あて先コンピュータのMACアドレスを知る必要がある。これが分からなければ、送信用のイーサネットのフレームを準備できないからだ。そこで必要になるのが、IPアドレスとMACアドレスの対応表であり、これを作成するのがARPプロトコルの役割である。TCP/IPにおける通信では、通信に先立って、ほとんどの場合に必ずこのARPプロトコル・パケットの送受信が行われ、お互いのコンピュータ同士がMACアドレス情報のやりとりを行うことになっている(シリアル回線のように直接相互に接続されているような場合は、通信相手は常に特定されているので、ARPは使われない)。
TCP/IPはイーサネットやxDSL、光ファイバ、シリアル回線、無線LANなどさまざまなネットワーク媒体上で動作することはすでに述べたとおりである。物理媒体が異なれば、パケットの送受信方法も異なるし、あて先アドレスや送信元アドレスの指定方法なども異なる。ARPプロトコルではこれらの違いを考慮し、どのような物理媒体でも利用できるように作られている。具体的には、長さの異なるMACアドレスに対応できるように、MACアドレスを格納するフィールドは可変長になっている。
利用する物理媒体に応じてARPパケットの詳細や動作は少しずつ異なるが、例えばイーサネット上のARPの規格はRFC826「An Ethernet Address Resolution Protocol」で規定されている。
ARPプロトコルの動作を説明する前に、具体的なARPのパケットの構造を示しておく。パケットの構造は以下のように非常に単純であり、このパケットを送信元とあて先コンピュータの間で1回やりとりすることにより、お互いの持つIPアドレスとMACアドレス情報を交換している。
実際のMACアドレスは物理的なネットワーク媒体によって異なるが、ここではイーサネットの場合を示しておく。イーサネットでは、お互いのコンピュータ(イーサネットでは「ノード」と呼ぶ)を6bytesのMACアドレスで識別している。そのため、以下のARPパケットでは、6bytes(48bit)分のMACアドレスが格納できるようになっている。
各フィールドの意味について説明しておこう。
■ハードウェア種別(0x0001)
これはネットワークの物理的な媒体の種類を表す、16bit幅の数値である。イーサネットではその値は「0x0001」であり、ほかにもフレーム・リレーは0x000f、HDLCは0x0011などいくつか決まっているが(定義はRFC1700「Assingned Numbers」などに記載)、あまり深い意味は持たない。
■プロトコル(0x0800)
これはARPプロトコルで取り扱う上位のプロトコルの種類を表す。0x0800はTCP/IPプロトコルを表す(これはイーサネット・フレーム中にある、TCP/IPプロトコルを表すタイプと同じである)。
■HLEN(0x06)
「HLEN(hardware address length)」はMACアドレスの長さを表す。イーサネットの場合はこの値は「6」となっており、MACアドレスは6bytes(48bit)であることを示している。
■PLEN(0x04)
「PLEN(protocol address length)」は上位のプロトコルで利用されるアドレス情報の長さを表す。Version 4のTCP/IPプロトコルではIPアドレスは4byte(32bit)であるので、このフィールドの値は「4」となっている。
■動作(ARP/RARP)
ここにはARPの動作の種類を表すためのコードが入っている。ARPプロトコルを使う場合は、最初にARP要求を送信し、該当するコンピュータがARP応答を返すというふうに動作する。要求とその応答を区別するために2つのコードが割り当てられているが、さらにARPだけでなく、後述するRARPというプロトコルでもこの構造のパケットを使うため、可能な動作としては以下の4つがある(ARPは必須だが、RARPは実装されていないことも多い)。
コード | 動作 |
---|---|
1 | ARP要求。最初にARP要求を送信する側が利用する |
2 | ARP要求への応答。ARP要求に該当するコンピュータが応答する場合に利用する |
3 | RARP要求。RARP要求を送信する側が利用する |
4 | RARP要求への応答。RARP要求をサービスするサーバ(RARPサーバ)が応答する場合に利用する |
ARP/RARPパケットにおける動作コード |
■送信元MACアドレス(6bytes)
ARP要求もしくはARP要求への応答を送信する側のコンピュータが、自分自身のMACアドレスを格納する。イーサネットの場合、MACアドレスは6bytesなので、このフィールドに自分自身のMACアドレスを埋め込んでパケットを送信する。
■送信元IPアドレス(4bytes)
ARP要求もしくはARP要求への応答を送信する側のコンピュータが、自分自身のIPアドレスを格納する。IPv4の場合はIPアドレスは4bytesなので、このフィールドに自分自身のIPアドレスを埋め込んでパケットを送信する。送信元のMACアドレスとIPアドレスは、必ず自明なので、このフィールドには必ず何らかの値がセットされていることになる。これに対して、以下の2つのフィールドは、ARPの要求送信時には不明なので、0のままとなっている。
■あて先MACアドレス(6bytes)
ARPの応答パケットにおいて、ARPパケットを返送する先(つまりもともとのARP要求を最初に送信した側)のコンピュータのMACアドレスがセットされるフィールド。
■あて先IPアドレス(4bytes)
ARPの応答パケットにおいて、ARPパケットを返送する先(つまりもともとのARP要求を最初に送信した側)のコンピュータのIPアドレスがセットされる。
ARPパケットの構造は、以上のように利用するネットワーク媒体(MACアドレスの長さ)によって長さが変わる可能性がある。だがイーサネット(およびその互換技術)が広く普及した現在では、ほとんどの場合は上記のような構造のARPパケットを見る機会が多いだろう。
Copyright© Digital Advantage Corp. All Rights Reserved.