ARPパケット

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

ARPパケットのフォーマットは以下の通りです。Ethernet形式のフレームでARPパケットはイーサネットヘッダによってカプセル化されています。


ハードウェアタイプ(Hardware Type)ハードウェアのタイプを定義します。
イーサネットの場合は0x0001です。
プロトコルタイプ(Protocol Type)プロトコルのタイプを定義します。
IPv4の場合0x0800です。
ハードウェアサイズ(Hardware size)ハードウェアアドレスの長さを定義します。
MACアドレスの6バイトの6が固定値です。
プロトコルサイズ(Protocol size)プロトコルアドレスの長さを定義します。
IPアドレスの4バイトの4が固定値です。
オペレーションコード(Opcode)ARPリクエストの場合は0x0001
ARPリプライの場合は0x0002になります。
送信元MACアドレス(Sender MAC address)送信元のMACアドレスです。
送信元IPアドレス(Sender IP address)送信元IPアドレスです。
ターゲットMACアドレス(Target MAC address)宛先のMACアドレスです。
ARPリクエストの場合は00:00:00:00:00:00
が入ります。
ターゲットIPアドレス(Target IP address)宛先のIPアドレスです。

ARPパケット

以下のような構成図でARPリクエスト、ARPリプライの中身を確認してみます。

ARPリクエストの中身

R1からR2にpingを行いARPリクエストを送信させます。以下がARPリクエストのデータ部分のキャプチャ内容です。

ARPリクエスト データ部分

上記のARPパケットのフォーマットで記載した内容の値を確認することができます。
ARPリクエストなのでOpcodeは1、Target MAC addressは00:00:00:00:00:00になっています。


また、カプセル化をしているイーサネットヘッダも確認できます。

ARPリクエスト イーサネットヘッダ部分

宛先MACアドレスはBroadcastなのでff:ff:ff:ff:ff:ff、送信元MACアドレスはRT1のMACアドレス(52:54:00:01:44:71)、TypeはARPパケットを表す0x0806となっています。
Paddingは、データ部分が最小46バイトなのでARPパケットでは足りない部分を埋めているダミーのデータです。
プリアンブルとFCSについてはWiresharkで確認することはできません。

ARPリプライの中身

R1からARPリクエストを受け取ったR2は、R1に対してARPリプライを送信します。以下がARPリプライのデータ部分のキャプチャ内容です。

ARPリプライ データ部分

同じく上記のARPパケットのフォーマットで記載した内容の値を確認することができます。
ARPリプライなのでOpcodeは2、Target MAC addressはRT1のMACアドレスになっています。

同じく、カプセル化をしているイーサネットヘッダも確認できます。

ARPリプライ イーサネットヘッダ部分

宛先MACアドレスはユニキャスト通信なのでRT1のMACアドレス、送信元MACアドレスはRT2のMACアドレス、TypeはARPパケットを表す0x0806となっています。