IPv6 のリンク ローカル アドレスとサイト ローカル アドレスは、スコープ付きアドレスと呼ばれます。 Windows ソケット (Winsock) API では、スコープ付きアドレスで使用するために、sockaddr_in6 構造体の sin6_scope_id メンバーがサポートされています。 IPv6 リンク ローカル アドレス (fe80::/10 プレフィックス) の場合、sockaddr_in6 構造体の sin6_scope_id メンバーはインターフェイス番号です。 IPv6 サイトローカル アドレス (fec0::/10 プレフィックス) の場合、sockaddr_in6 構造体の sin6_scope_id メンバーはサイト識別子です。
インターフェイス #5 のリンク ローカル IPv6 アドレスの例を次に示します。
fe80::208:74ff:feda:625c%5
Service Pack 1 (SP1) 以降の Windows XP では、次のコマンドを使用して、ローカル コンピューターで IPv6 のクエリと構成を行うことができます。
Netsh.exe コマンドを使用して行われた構成変更は永続的であり、コンピューターまたは IPv6 プロトコルを再起動しても失われません。
Windows XP Service Pack 1 (SP1) より前のバージョンでは、IPv6 の構成と管理に、いくつかの古いコマンド ライン ツール (Net.exe、Ipv6.exe、Ipsec6.exe) を使用して IPv6 を構成および管理しました。 これらの古いツールを使用すると、IPv6 の変更は永続的ではなく、コンピューターまたは IPv6 プロトコルが再起動されたときに失われます。 これらの古いコマンド ライン ツールは、Windows XP でのみサポートされています。
SP1 を使用する Windows XP では、次のコマンドを実行すると、インターフェイス インデックス、インターフェイス名、その他のさまざまなインターフェイス プロパティを含む、ローカル コンピューター上の IPv6 インターフェイスの一覧が表示されます。
netsh インターフェイス ipv6 show interface
SP1 を使用する Windows XP では、次のコマンドを実行すると、インターフェイス インデックスに関連付けられているサイト識別子が変更されます。
netsh インターフェイス ipv6 set interface <InterfaceIndex または Name> siteid=value
Windows XP では、次の古いコマンドによって、サイト ローカル アドレスに関連付けられているサイト識別子も 3 に変更されます。
ipv6 rtu fec0::/10 3
スコープ付きアドレスを送信または接続している場合、sockaddr_in6 構造体の sin6_scope_id メンバーは、あいまいなスコープ アドレスを表す未指定 (ゼロ) のままにすることができます。 たとえば、次のリンク ローカル アドレスはあいまいです。
fe80::10
スコープ アドレスにバインドする場合、sockaddr_in6 構造体の sin6_scope_id メンバーには、リンク ローカル アドレスの有効なインターフェイス番号またはサイト ローカル アドレスのサイト識別子を指定する 0 以外の値が含まれている必要があります。
あいまいな範囲のアドレス
スコープ付きアドレスを送信または接続していて、sockaddr_in6 構造で sin6_scope_id メンバーを指定していない場合、スコープ付きアドレスはあいまいです。 これを解決するために、IPv6 プロトコルはまず、ソケットをソース アドレスにバインドしたかどうかを判断します。 その場合、バインドされたソース アドレスは、インターフェイス番号またはサイト識別子を指定することであいまいさを解決します。
スコープ付きアドレスを送信または接続していて、sin6_scope_id メンバーを指定せず、送信元アドレスをバインドしていない場合、IPv6 プロトコルはルーティング テーブルをチェックします。 たとえば、次のコマンドを実行すると、ローカル コンピューター上の IPv6 ルーティング テーブルが表示されます。
netsh インターフェイス ipv6 show route
No Manual 256 fe80::/64 13 Local Area Connection
No Manual 256 fe80::/64 14 Wireless Network Connection
これは、リンク ローカル アドレスが既定でインターフェイス #13 および #14 へのオンリンクとして扱われることを示します。
あいまいさは、ローカル コンピューターに複数のネットワーク アダプターがある場合に発生します。 たとえば、上記の netsh コマンドは、2 つのネットワーク インターフェイス (ローカル エリア接続とワイヤレス ネットワーク接続) があることを示しています。 アプリケーションがスコープ ID なしで宛先リンク ローカル アドレス (fe80::10 など) を指定する場合、パケットの送信に使用するアダプターが明確ではありません。 パケットの送信時にスコープ ID がないのは、リンク ローカル ユニキャスト (fe80::/64) またはリンク スコープ マルチキャスト (ff00::/8) IPv6 宛先アドレスだけです。
近隣探索
sockaddr_in6 構造体で sin6_scope_id メンバーを指定していない場合、ソース アドレスをバインドしていない場合、およびリンク ローカル アドレスのルートを指定していない場合、IPv6 プロトコルは近隣探索を試して宛先のリンクローカル アドレスを解決します。 送信される特定のパケットに対して、1 つのインターフェイスが試行されます。 試行されるこの最初のインターフェイスは、最も優先されるインターフェイスと見なされます。 近隣探索がインターフェイス上のリンク ローカル アドレスを解決できない場合、送信されるパケットは破棄され、宛先リンク ローカル アドレスがそのインターフェイス経由で到達できないことがシステムによって記憶されます。 すべての同じ条件下で送信される次のパケットで、ネイバー検出用に別のインターフェイスが試行されます。 このプロセスは、近隣探索が宛先リンクローカル アドレスに対して応答するか、または考えられるすべてのインターフェイスが試行されて失敗するまで、新しいパケットごとにローカル コンピューター上の各インターフェイスを介して続行されます。 ネイバーの解決が失敗するたびに、そのネイバーに対して 1 つのインターフェイスが削除されます。
宛先リンクローカル アドレスが解決される場合、そのインターフェイスは現在のパケットを送信するために使用されます。 このインターフェイスは、同じリンク ローカル宛先アドレスに送信される、あいまいな範囲のパケットにも使用されます。
ネイバー探索がすべてのインターフェイスの宛先リンク ローカル アドレスを解決できない場合、システムは最も優先インターフェイス(最初に試行されたインターフェイス)でパケットの送信を試みます。 ネットワーク スタックは、最も優先されるインターフェイスで宛先のリンクローカル アドレスを解決しようとし続けます。 すべてのインターフェイスで近隣探索が失敗した後、ネットワーク スタックはプロセスを再度再起動し、すべてのインターフェイスの宛先リンク ローカル アドレスを解決しようとします。 現時点では、すべてのインターフェイスでネイバー検出が再度試行されるときのこの時間間隔は 60 秒です。 ただし、この時間間隔は Windows のバージョンで変更される可能性があるため、アプリケーションでは想定しないでください。
手記
近隣探索でリンク ローカル アドレスが解決された後、アプリケーションが同じリンク ローカル アドレスを別のインターフェイスにバインドする場合、ネイバー探索によって返されるリンク ローカル宛先アドレスでインターフェイスがオーバーライドされることはありません。
IP バージョン 6 の近隣探索の詳細については、IETF によって公開 RFC4861 を参照してください。
関連トピック