IPv6 リンクローカルアドレスとサイトローカル アドレス
IPv6 リンク ローカル アドレスとサイト ローカル アドレスは、スコープ付きアドレスと呼ばれます。 Windows Sockets (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 プロトコルを再起動しても失われません。
Service Pack 1 (SP1) を使用する Windows XP より前の IPv6 構成と管理では、IPv6 を構成および管理するために、いくつかの古いコマンド ライン ツール (Net.exe、Ipv6.exe、Ipsec6.exe) が使用されました。 これらの古いツールを使用すると、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 のバージョンで変更される可能性があり、アプリケーションでは想定しないでください。
Note
近隣探索でリンク ローカル アドレスが解決された後に、アプリケーションが同じリンク ローカル アドレスを別のインターフェイスにバインドする場合、そのインターフェイスは近隣探索によって返されるリンク ローカル宛先アドレスでオーバーライドされません。
IP バージョン 6 の近隣探索の詳細については、IETF によって発行された RFC4861 を参照してください。
関連トピック