ARP
ARP(Address Resolution Protocol)とは, IPアドレスからMACアドレスを得るためのプロトコルである.
TCP/IPを利用したLANでの通信では, IPパケットは下位層でMACフレームが付加された状態で伝送されることから, MACアドレスの情報が必要となる.
しかし, IPアドレスとMACアドレスは自動的な関連付けがないので, ARPでMACアドレスを得る必要がある.
ARPの仕組み
ARPにはARPリクエストとARPリプライという2種類のパケットを利用し, 宛先となるIPアドレスを持つノードのMACアドレスの情報を得る.
ARPリクエストの中には, MACアドレスを知りたいノードのIPアドレスが入っている.
ARPリクエストはブロードキャストされるため, セグメント内の全ノードがパケットを受信する.
受け取ったノードはそれぞれ中身を見て, それが自身のIPアドレスだと分かると, 自身のMACアドレスが入ったARPリプライを送信元のノードへ送信する.
これにより, 送信元のノードはIPアドレスの対応したMACアドレスを取得でき, LANでの通信が可能となる.
当然ながら, ARPリプライはユニキャストで送信される.
また, 異なるネットワークにあるノードのMACアドレスが分からない場合は, デフォルトゲートウェイのMACアドレスを知るためのARPリクエストを送信する.
ARPパケットのフォーマット
ARPパケットのフォーマットは以下の通りである.
ARPはIPと同様にOSI参照モデルのネットワーク層で動作し(TCP/IPではインターネット層), IPパケットではなくARPパケットであり, Ethernetフレームによりカプセル化される.
フィールド | ビット数 | 説明 |
---|---|---|
ハードウェアタイプ | 16bit | ハードウェアの種別情報は入る. Ethernetの場合は"0x0001"である. |
プロトコルタイプ | 16bit | プロトコルの種別情報が入る. IPの場合は"0x0800"である. 元々はTCP/IP以外でもARPを使えるように設計されていたが, TCP/IP以外で使われることはない. |
ハードウェアアドレス長 | 8bit | MACアドレスの長さが入る. 固定値で"6"となる. |
プロトコルアドレス長 | 8bit | IPアドレスの長さが入る. 固定で"4"となる. |
オペレーション | 16bit | ARPリクエストなのかARPリプライなのかを識別するための情報が入る. ARPリクエストの場合は"0x0001", ARPリプライの場合は"0x0002"となる. |
送信元のMACアドレス | 48bit | 送信元のMACアドレスが入る. 通信に必要な「送信元MACアドレス」の情報は当然L2ヘッダの中にある. |
送信元のIPアドレス | 32bit | 送信元のIPアドレスが入る. |
探索するMACアドレス | 48bit | 探索するMACアドレスが入る. ARPリクエストの場合は"00-00-00-00-00-00"又は"FF-FF-FF-FF-FF-FF"が入る. |
探索するIPアドレス | 32bit | 探索するIPアドレスが入る. このIPアドレスが自身のIPアドレスと一致した場合, ARPリプライを返す. |
ARPキャッシュとARPテーブル
一度, ARPリクエストとARPリプライによりARPパケットのやり取りがされると, ARPキャッシュとして一定時間情報が残る.
ARPキャッシュが残っている間, そのノード間はARPパケットのやり取りをすることなく, LANでの通信が可能となる.
ARPキャッシュはARPテーブルという場所に保存されており, PCからの場合は, ターミナルでarp -a
と入力することで確認できる.
ARPパケットのやり取りにより, 動的(dynamic)に得られるARPキャッシュとデフォルトで静的(static)に定義されているARPキャッシュの2種類が存在する.
また, 動的に得たARPキャッシュは一定時間後削除されるが, ターミナルでarp -d
と入力することで今すぐ削除することも可能である.
CiscoルータからARPテーブルを確認する場合は, ターミナルでshow ip arp
と入力する.
Ciscoルータでは, 自身のIPアドレスとMACアドレスもARPテーブルにのせている.
また, ARPキャッシュの時間の項目(Age)には"-"と表示しており, このARPキャッシュが消えないことを表している.
なお, Cisco IOS SoftwareにおけるARPキャッシュのタイムアウトはデフォルトで240分(4時間)となっている.