arpコマンドでDNSのパケットが発生する件について


待望のぶぅちゃんズ Advent Calendar 2019 3日目。

OSによるが、$ arp -aというコマンドを実行するとなぜかプロトコルがARPではなくDNSのパケットが発生する。

直感に反する行為で混乱を招いたため、その理由を調査した。

ARPとは

ARPとは、IPアドレスからMACアドレスを解決するために使われるプロトコルであり、OSI参照モデルではネットワーク層に値する。(データリンク層と表記する場合もある。)

同一のネットワークに接続されたものどうしは、MACアドレスで通信を行うため、ARPテーブルというIPアドレスとMACアドレスの対応表をキャッシュとして持っている。これを頼りにMACアドレスを求めてデータを送信する。

ARP要求パケットをブロードキャストして、該当するIPアドレスを持つコンピュータがARP応答パケットを返す。これによりARPテーブルは更新され、一定時間経過すると削除される。

ARPが発生しない理由

arp -aコマンドはARPテーブルの内容を表示するためのものである。
自分が持つキャッシュを参照しているだけなので、パケットは発生しない。

DNSが発生する理由

arp -aコマンドを実行すると以下のようになる。

$ arp -a
? (192.168.80.82) at de:ad:be:ef:ca:fe on en0 ifscope [ethernet]
? (192.168.80.1) at fe:ed:ba:be:fa:ce on en0 ifscope [ethernet]
...

発生するDNSのパケットを解析すると、ARPテーブルにある全てのIPアドレスについてDNSで問い合わせている。

DNSサーバに対応するドメイン名があれば、この?の部分にドメイン名が表示されるのだ。

そのためDNSパケットが発生している。

おまけ

ARPについての豆知識

ARPは自分のIPアドレスが他に使われていないか確認するために使われることもある。
その場合は、自分のIPアドレスをセットしたARP要求パケットを送信し、応答があれば使われていると判断される。

これはGratuitous ARPであり、ネットワークスペシャリストに出題されている。(平成28年度秋期午前II問6)

正解はア。

え?これプログラミングの記事だったの?

まあ。