第11回 MACアドレスを解決するARPプロトコル基礎から学ぶWindowsネットワーク(2/4 ページ)

» 2003年05月09日 00時00分 公開

 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プロトコルの動作を説明する前に、具体的なARPのパケットの構造を示しておく。パケットの構造は以下のように非常に単純であり、このパケットを送信元とあて先コンピュータの間で1回やりとりすることにより、お互いの持つIPアドレスとMACアドレス情報を交換している。

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

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

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

■ハードウェア種別(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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。