マルチキャストには独自のルーティング特性がありますが、NICの明示的な選択(送信者と受信者の両方)が重要であり、違いを生むことを理解することが重要です(特定のOSの「automagic」実装に依存する場合を除く) 、これは本番環境では非常に扱いにくい場合があります)。
まず、メッセージの送信と受信の両方に使用できることと使用できることを明確にしjava.net.MulticastSocketます(これは、MCの送信とMCの受信が類似していることを意味するわけではありません。受信者はIGMP参加などを実行する必要がありますip maddr。
一般に、これらのソケットを作成するときに指定すればするほど、より適切になります(そうでない場合は、OSに翻弄され、状況をデバッグするのはそれほど簡単ではありません)。
レシーバーソケットの場合、次のことを行う必要があります。
- ポートを(コンストラクターで)指定します。udpそのポートのインバウンドトラフィックに対してファイアウォールを開く必要があります。
- インターフェイスを指定します(経由socket.setNetworkInterface); それ以外の場合、OSは使用可能なインターフェイスの1つを使用します(で確認してくださいip maddr)。
- MCグループを指定します(例:経由socket.joinGroup(InetAddress.getByName("230.0.0.0"))(これにより、IGMPメカニズムがトリガーされ、経由で表示されますtcpdump -i your_interface -n ether multicast)
Senderソケットについても、同様に、
- MCグループを指定します(同じコマンド)、
- インターフェイスを指定します(同じコマンド)
上記に賛成なら、私は2つの議論をします。
- enp0s32つのNIC(、、および- enp0s8)を使用してCentOS 7で単純な送信者と受信者をテストしました(コードはこちら)。受信者にNICの明示性を設定することによってのみ、どのNICでIGMP参加が発行され、どのNICでプログラムが- ip maddrMCグループに参加したものとしてリストされるかを自信を持って知ることができました。送信者を特定のNICに設定することにより、送信が上- enp0s3の受信者にのみ到達し、到達しない- enp0s3ことが容易に確認されます- enp0s8(同様に、- tcpdumpは選択したインターフェイスでパケットを送信として表示します)。もちろん、これは、OSでMCルーティングを試してみる必要はありません。これにより、パケットを希望どおりにルーティングすることができます。
- 2つの異なるNICが完全に分離されたLANにつながり、MCルーティングのすべて/完全な要素(指定されたルーター、おそらくランデブーポイントなど)をさらに持つ可能性がある、あなたのようなセットアップを想像するかもしれません。したがって、IGMP結合に適切なNICを選択することが不可欠であり、すべてを決定します。これらが間違ったNICに発行された場合、MCトラフィックを受信できない可能性があります。それらが両方のNICに発行された場合、必要以上の結果が得られる可能性があります。
これがお役に立てば幸いです(質問が6歳になったとしても)。