IPアドレスからMACアドレスを知るには-ARP

 皆さんはインターネットの通信をする際にIPアドレスを指定しますか?たぶんそんな人は余りいないでしょうね。皆さんはドメイン名を指定すると思います。ドメイン名を指定すると、DNSサーバがIPアドレスに変えて教えてくれます。そのIPアドレスを使って皆さん(皆さんが使うアプリケーション)は通信をするわけです。宛先のIPアドレスと、自分のIPアドレスはデータグラム(パケット)のヘッダフィールドに記述されます。手紙の宛先と、送り主の住所みたいなものですね。これでデータグラムは宛先のコンピュータまで届けられます。届けてくれるのはルータです。これで問題ないようですが、実は、皆さんがルータまでデータグラムを届けるには、むき出しのデータグラムではだめなんです。

 インターネットには物理ネットワークについての規定がないということを思い出してください。インターネットは実際の物理ネットワークについては他のシステムを借りてしまおうという考え方です。現実には、大学や企業のLANではイーサネットという物理ネットワークの上でインターネット技術が動いています。イーサネットでは、フレームという形で信号の塊を送信しますので、フレームのデータ用フィールドにインターネット(TCP/IP)のデータグラムを格納して、運んでいます。イーサネットの制御用情報を載せるのはフレームのヘッダということになります。ここには当然宛先アドレスと、送信元のアドレスを載せます。イーサネットのアドレスといえばMACアドレスでしたね。このMACアドレスをフレームヘッダに載せます。




1 MACアドレスとIPアドレスの固定的対応は難しい

NICにLANケーブルを接続

MACアドレスやIPアドレスを割り当てられているのはパソコン自体ではなく、パソコンに装着されているNIC
パソコンを背後から見たところ

NICは背後のスロットから挿してマザーボードに接続(最近はパソコンの購入時にNICがついていることも多い。左の写真は購入時についていたもの)

 イーサネットではMACアドレスでNICの識別をします。NICを識別することで、NICを装着しているマシン(パソコン)を識別できることになります。イーサネットではフレームを使って通信をしますので、フレームヘッダにMACアドレスを書き込みます。このMACアドレスはクライアントを使って通信を始めようとするユーザが入力するのでしょうか。MACアドレスは、ご存知のように48ビットのアドレスです。人が扱う場合は4ビットずつ16進表示しますので、12桁の文字列になりますが、それにしても人間にはちょっと扱いにくい数字です。これを覚えていて入力するといいのでしょうが、覚えておくのも大変です。MACアドレスをいちいち指定するのは難しいので、IPアドレスとMACアドレスの対応関係をテーブルに記述し、IPアドレスを指定すれば、それを元にMACアドレスに変換してくれるシステムを開発すればいいではないかと思った人もいるでしょうに。こうすると、ドメイン名を指定すれば、DNSがIPアドレスにしてくれて、新しいシステムがこのIPアドレスをMACアドレスに変換してくれるということになり、MACアドレスを覚えておかなくてはならないという束縛から解放してくれます。ところがこんなにうまい具合にことは運びません。なぜでしょうか。パソコンを移動して、違うサブネットに移動すると、当然のことながら、IPアドレスはそのサブネット用に合わせたものに変更しなくてはなりません。

 解決策は通信をする際にいちいち宛先のコンピュータにMACアドレスを聞くことです。






2 ARPでMACアドレスを確認する

 インターネットは通信の際に毎回相手のパソコンのMACアドレスを聞きだすという手法を採用しています。この方法をARP(Address Resolution Protocol、通称はアープ)といいます。ARPはRFC826で定義され、その後RFC 5227、5494で機能を拡張されています。

 ARPではアドレス要求(ARP Request)とアドレス応答(ARP Reply)の2つのメッセージが定義されています。アドレス解決を望むコンピュータは、アドレス解決したいIPアドレスを含んだARP要求を物理ネットワーク全体にブロードキャストします。
 ARP要求を受信したコンピュータは自分のIPアドレスと、要求メッセージのターゲットIPアドレスを比較し、一致しないときは破棄し、一致した場合は、ARP応答メッセージを作成し、自分のMACアドレスを格納して、ユニキャストで回答します。

 ホストAはアドレス解決したいIPアドレスを含んだARP要求を物理ネットワーク全体にブロードキャスト
要求を受けたコンピュータは自分のMACアドレスをユニキャストで回答 



3 いちいち確認するのは大変なので一度聞いたらキャッシュする

 毎回ARPで確認するのも大変ですので、多くのマシンでは一度聞いたものは覚えています(一度取得したIPアドレスとMACの対応関係をARPテーブルに保存)。どのくらい覚えているかはマシンが採用しているOSによって異なります。Cisco社(世界的な通信機メーカ)のルータはデフォルトで4時間くらい覚えています。Windowsなどは20分位キャッシュしています。Windowsの場合は、Powershellで"arp -a"というコマンドを実行して、キャッシュ情報を表示させることができます。


4 ARPの逆はRARP

 IPアドレスからMACアドレスを取得するのがARPですが、その逆のMACアドレスからIPアドレスを取り出すのがRARP(Reverse Address Resolution Protocol、通称はリバースARP)。RARPは、MACアドレスに対応したIPアドレスを返すのみに、サブネットマスク、デフォルトゲートウェイ、DNSサーバのアドレスなどを返すことはできません。
 RARPはTCP/IPの開発当初からあったものですから、サブネットマスクなどを返せないのは仕方がありません。サブネットマスクという概念は、TCP/IPの開発当初はなかった概念だからです。RARPはやがてBOOTPに取って代わられ、最近ではBOOTPもDHCPに取って代わられています。






5 ARPパケットのフォーマット

 ARPパケットをイーサネットフレームでカプセル化する場合のタイプ番号は"0x0806"となっていますので注意して下さい。念のため、初めにフレームフォーマットを示します。フレームヘッダのタイプ番号フィールドには"0x0806"が入ります。

イーサネットフレームフォーマット 
宛先MACアドレス 送信元MACアドレス タイプ番号
0x0806
データ  FCS

 イーサネットフレームのペイロードとして運ばれるのがARPパケットです。

※ペイロード(payload;payloadとはもともと代金の発生する荷物のことです。運転手さんの手荷物ではない):イーサネットのペイロードとして運ばれるのはデータ部分です。


 次にARPパケットのフォーマットを示します。
ARPパケットフォーマット
ハードウエア種別 プロトコル
HLEN PLEN 動作(ARP/RARP)
送信元MAC
送信元MAC(続き) 送信元IPアドレス
送信元IPアドレス(続き) 宛先MACアドレス
宛先MACアドレス(続き)
宛先IPアドレス

 ハードウエア種別はネットワークの物理的な媒体の種別です。イーサネットならば「0x0001」、その他フレームリレーなら「0x000f」、HDLCなら「0X0011」です。通常の場合は、イーサネットのMACアドレスを知りたいのですから、ここは「0x0001」となります。

 プロトコルはARPにサービスを依頼している上位層のプロトコルです。インターネットのプトロコル(TCP/IP)がARPにアドレス解決を求めていますので、ここはIPの0x0080が入ります。

 HLEN(hardware address length)はMACアドレスの長さを示します。ここはバイトで長さを表すことになっていますので、48ビット=6バイトとなります。従って、0x06が入ります。

 PLEN(protocol address length)は上位層プロトコルで利用されるアドレス情報の長さを示すフィールドです。IPv4のアドレスは32ビットですから、4バイトになります。従って、0x04が入ります。

 動作はARP要求とARP応答以外に、RARP要求、RARP応答の区別が入ります。コード表は次の通りです。

コード 動作
1 ARP要求
2 ARP応答
3 RARP要求
4 RARP応答

 ターゲットのコンピュータのMACアドレスは、ARP応答の送信元MACアドレスフィールドから分かります。 宛先MACアドレスですが、ARP要求の場合はここが分からないので、ARPを使うわけですので、ARP要求の場合は意味がありません(00-00-00-00-00-00とか、FF-FF-FF-FF-FF-FFが入ります)。ARP応答の場合は宛先のMACアドレスが入ります。

 宛先のIPアドレスです。ブロードキャストされたARPリクエストのこの部分を見て、各コンピュータは自分がターゲットであるかどうかを判断します。









更新履歴

2016/02/04 作成
2016/03/13 「5 ARPパケットのフォーマット」の追加














































 ページの先頭