このセクションでは、Windows ソケットで使用できるマルチキャスト機能に IPv6 ブロードキャスト アプリケーションを移植するためのベスト プラクティスについて説明します。
IPv4 と IPv6 の比較
IPv4 ブロードキャスト アプリケーションを IPv6 に移植する準備をする際に最も重要な考慮事項は次のとおりです。IPv6 にはブロードキャストの概念が実装されていません。 代わりに、IPv6 はマルチキャストを使用します。
IPv6 のマルチキャストは、IPv4 で見つかった従来のブロードキャスト機能をエミュレートできます。 IPv6 アドレスをリンクローカル スコープに設定して IPV6_ADD_MEMBERSHIP ソケット オプションを設定すると、すべてのノード アドレス (FF02::1) は、SO_BROADCAST ソケット オプションを使用した IPv4 ブロードキャスト アドレスでのブロードキャストと同じです。 このアドレスは、オールノード マルチキャスト グループと呼ばれることもあります。 単に IPv6 のブロードキャスト エミュレーションを必要とするアプリケーションの場合、そのアプローチは運用上同等です。 ただし、IPv6 との顕著な違いの 1 つは、すべてのノードのマルチキャスト グループ アドレス上のマルチキャストが既定で受信されないことです (IPv4 ブロードキャストは既定で受信されます)。 アプリケーション プログラマは、IPV6_ADD_MEMBERSHIP ソケット オプションを使用して、すべてのノードのマルチキャスト グループ アドレスを含む任意のソースからのマルチキャスト受信を有効にする必要があります。
手記
IPv6 では、マルチキャスト ソケット オプションまたは IOCTL に渡される引数構造体でインターフェイスの選択が指定されます。
ただし、より豊富で堅牢で、選択的で管理しやすい複数のホストへの転送では、アプリケーション開発者はマルチキャスト モデルへの移行を検討する必要があります。
マルチキャストへの移行
マルチキャストを使用すると、アプリケーション プログラマは特定のソース/グループ ペアを選択的に選択し、選択的受信モデルを有効にすることができます。 IPv6 のマルチキャスト リスナー検出 (MLD) と IPv4 上のインターネット グループ管理プロトコル (IGMPv3) のバージョン 3 では、マルチキャスト プログラミングがサポートされています。 さらに、マルチキャストを使用すると、アプリケーションはグループ内の送信者を具体的にブロック (またはブロック解除) でき、悪意のあるブロードキャスト者からアプリケーションをさらに保護できます。 この機能は、IPv4 (IGMPv3 が必要) と IPv6 (MLDv2 が必要) で使用できます。
マルチキャストを使用するアプリケーション プログラマには、IPv4 ブロードキャスト (またはマルチキャスト) アプリケーションから IPv6 に移植するシナリオと、新しい IPv6 マルチキャスト アプリケーションを作成するシナリオの 2 つがあります。
既存のアプリケーションを移植する場合、IPv6 マルチキャストに移行するには、ソケット オプションの使用と IOCTL の使用の 2 つのオプションがあります。
- ソケット オプションの使用は変更ベースのアプローチであり、開発者は必要に応じてソケットのプロパティを変更できます (送信者のブロックやブロック解除、新しいソースの追加など)。 このアプローチは、より直感的で推奨されるアプローチです。 マルチキャスト プログラミングに対する変更ベースのアプローチの詳細については、「MLD と IGMP Using Windows Sockets」を参照してください。
- IOCTL の使用は最終状態ベースのアプローチです。開発者は、包含リストや除外リストを含む完全に構成されたソケット状態を 1 回の呼び出しで提供できるためです。 最終状態ベースのアプローチの詳細については、Final-State-Based マルチキャスト プログラミングを参照してください。
新しい IPv6 マルチキャスト アプリケーションを作成する場合は、IOCTL を使用するのではなく、ソケット オプションを使用することをお勧めします。
IPv6 を使用してマルチキャスト アプリケーションを作成するもう 1 つの方法があり、WSAJoinLeaf 関数を使用する必要があります。 WSAJoinLeaf 関数 を使用することは推奨されませんが、その使用を指示する場合があります。 たとえば、Windows Server 2003 以前でソケット オプションを使用する場合の欠点の 1 つは、IP バージョン固有であるということです。 これらの古いバージョンの Windows では、IPv6 と IPv4 用のさまざまなソケット オプションが必要です。 Windows Vista 以降では、IPv4 と IPv6 の両方で使用できる新しいソケット オプションがサポートされています。 一方、WSAJoinLeaf 関数 は IP バージョンとプロトコルに依存しないため、Windows Server 2003 以前で複数の IP バージョンで動作する必要があるアプリケーションを構築する場合に便利な方法です。 WSAJoinLeaf 関数を使用すると、プロトコルと IP バージョンに依存しない特定の状況でより適切な場合があります。