重複アドレス検出
IPv6のユニキャストアドレスを使い始める前に、同じリンク上での重複を調べる手順。近隣要請を送信し、ほかの機器から届く近隣広告や同じアドレスに対する問い合わせをもとに重複を検出する。
イマシルちゃんの解説
同じネットワークで別々の機器が同じIPv6アドレスを使うと、通信相手を正しく区別できなくなることがあるよ。
そこで、使いたいアドレスがほかの機器と重なっていないかを先に調べる手順が、重複アドレス検出なんだ。
機器はそのアドレスをいったん仮のものとして扱い、同じネットワークへ確認の問い合わせを送るよ。
ほかの機器から使用中だという返事が来たり、同じアドレスを使おうとする問い合わせが来たりしたら、そのアドレスは使わないんだ。
決められた確認を終えても重複を示す情報がなければ、使い始めるの。
この解説はわかりやすかったですか?
より深い解説
定義
重複アドレス検出(DAD:Duplicate Address Detection)は、RFC 4862で定められた、IPv6アドレスの重複を確かめる手順である。近隣探索プロトコル(NDP)の近隣要請(NS)メッセージを使う。
自動生成したアドレスでも、手動で設定したアドレスでも、リンクローカルアドレスを含むすべてのユニキャストアドレスについて行う。
手順
- 使おうとするアドレスを「仮のアドレス」(tentative address)として扱い、まだ通信には使わない
- その仮のアドレスを問い合わせる近隣要請(NS)を送る
- 送信元アドレス:未指定アドレス(::)(まだ自分のアドレスを使えないため)
- 宛先アドレス:仮のアドレスの要請ノードマルチキャストアドレス
- 一定時間内に、そのアドレスについての近隣広告(NA)が返ってこなければ、重複なしと判断してアドレスを使い始める
- NAが返ってきたら、すでにほかの機器が使っているので、そのアドレスは使わない
重複が見つかったとき
重複が見つかったアドレスは使われない。特に、MACアドレスから作るリンクローカルアドレスが重複した場合は、MACアドレスの重複などハードウェアの問題が疑われるため、そのインタフェースでのIPv6の通信が止まることがある。
IPv4との比較
IPv4にも、ARPを使って同じことを行う仕組み(Gratuitous ARP、RFC 5227のアドレス競合検出)があるが、必須ではない。IPv6ではアドレスを自動生成すること(SLAAC)が前提なので、DADが標準の手順として組み込まれている。