イーサネットで通信する場合、相手のMACアドレスが分からないとパケットを送信できない。ARPに代わるIPv6の近隣探索機能とは?
前回までは、IPv6アドレスの基本と、IPv6パケットの構造について解説した。今回は、同一ネットワーク・セグメント上に接続されたIPv6ノード同士で、どうやってL2のアドレス(MACアドレスなど)を見つけるかについて見ていく。
IPv6で通信する場合、ユーザーやアプリケーションではIPv6アドレスを使って通信相手を識別・特定するが(*1)、実際のイーサネットなどのL2(OSI階層モデルでいう第2層のこと)メディアではL2アドレス(*2)を使って通信相手を識別している。そのため、IPv6でデータをほかのノードに送信するためには、そのノードが持つL2アドレスを何らかの方法で調べておき、そのL2アドレスをあて先としてイーサネット・パケットを送信しなければならない。このように、IPv6やIPv4のIPアドレス(L3アドレス)からL2アドレスを求める処理のことを「L2アドレス解決(L2 address resolution)」とか「MACアドレス解決(MAC address resolution)」という。
*1 名前を使う場合は、何らかの方法で名前からIPv6アドレスへ変換しておく必要がある。その方法については本連載の第6回と第7回を参照していただきたい。
*2 イーサネットなどでは「MACアドレス」と呼ばれている。ネットワーク・アダプタごとに割り当てられている6bytesのユニークな数値。
IPv4の場合は、「ARP(Address Resolution Protocol)」というプロトコルを使って通信相手のIPv4アドレスからそのノードのMACアドレスを求めていた(次の記事参照)。
参考のためにIPv4のARPの動作を簡単にまとめておくと、次のようになっている。
IPv6の場合もこのARPと似たような仕組みを使っているが、IPv4の場合と違って、IPv6ではICMPv6の「近隣探索(ND:Neighbor Discovery)」機能を使って実現している点が異なる(*3)。近隣探索とは、同一リンク(同一のネットワーク・セグメントのこと)上にあるIPv6のノードを見つけることだが、IPv4のARPやルータ発見、リダイレクトなど、ルーティング/L2アドレス解決に関する機能をまとめて整理している。今回は近隣探索のうち、IPv6ルータが存在しない、最もシンプルな形態のIPv6ネットワークにおける探索手順について詳しく見ていこう。IPv6ルータが存在するネットワークや、ドメイン名からIPv6への名前解決も同時に行うようなケースについては次回以降で取り上げる。
*3 「Neighbor Discovery」の訳語には近隣探索のほか、近隣者発見とか近隣発見などいくつかあるが、本連載ではWindows 7などでの用語に合わせている。
まず近隣探索で利用されるICMPv6パケットの構造について見ておこう。ICMPv6にはいくつかのメッセージ・タイプ(コマンド)があるが、近隣探索では次のようなパケットが使われる。これはRFC 4861の「Neighbor Discovery for IP version 6 (IPv6)」で定義されている。
近隣探索では次のようなタイプが定義されているが、今回は135と136の2つに注目する。
タイプ | 名前 | 意味 |
---|---|---|
133 | Router Solicitation(RS) | 同一リンク上におけるIPv6ルータの探索に使用される。ルータ情報の要求 |
134 | Router Advertisement(RA) | RSに対する応答。ルータは定期的にこのパケットを送信することにより、ほかのIPv6ノードに対してルータやIPv6アドレス情報などを通知する |
135 | Neighbor Solicitation(NS) | 同一リンク上におけるIPv6ノードのL2アドレス解決に使用される。IPv4におけるARP要求に相当 |
136 | Neighbor Advertisement(NA) | NSに対する応答。IPv4におけるARP応答に相当 |
137 | Redirect | より望ましいルーティング先情報の通知。IPv4におけるICMPリダイレクトに相当 |
近隣探索に利用される主なICMPv6メッセージ ICMPv6にはいくつかのサブコマンド(メッセージ・タイプ)があるが、リンク上でL2アドレス解決したり、ルータを見つけたりするために利用されるものとしては、これら5つがある。今回は135と136の2つに注目する。 |
Neighbor SolicitationとNeighbor Advertisementを使った、IPv6におけるL2アドレス解決の様子を次に示す。
ここではPC1からPC2に対して、IPv6で通信を行おうとしているとする。PC1がPC2と通信するためには、PC2のMACアドレスが必要である。そこで、最初にPC2に対して近隣探索のNeighbor Solicitationパケットをマルチキャスト送信する。するとPC2はそれに対してNeighbor Advertisementパケット中に自分自身(PC2)のMACアドレスをセットしてユニキャスト通信で返す。これでPC1はPC2のL2アドレス情報を入手できる。
Copyright© Digital Advantage Corp. All Rights Reserved.