1

2枚のネットワークインターフェイスカードを備えたマシンがあります。マルチキャストメッセージをLANの1つに送信したいのかどうか疑問に思っていました。そのLANでマシンのIPを使用する必要がありますか、それともLANからの入力antIPとして使用できますか。

つまり、マシンのIPが190.20.20.20であり、そのLAN内の別のマシンが190.20.20.1であるとします。

  1. 私は置くことができます:multcastiScoket.setInterface( "190.20.20.1");

  2. もしそうなら-そのマシンはオンになっている必要がありますか?

ありがとうございました。

4

3 に答える 3

3

マルチキャストには独自のルーティング特性がありますが、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つの議論をします。

  1. enp0s32つのNIC(、、およびenp0s8)を使用してCentOS 7で単純な送信者と受信者をテストしました(コードはこちら)。受信者にNICの明示性を設定することによってのみ、どのNICでIGMP参加が発行され、どのNICでプログラムがip maddrMCグループに参加したものとしてリストされるかを自信を持って知ることができました。送信者を特定のNICに設定することにより、送信が上enp0s3の受信者にのみ到達し、到達しないenp0s3ことが容易に確認されますenp0s8(同様に、tcpdumpは選択したインターフェイスでパケットを送信として表示します)。もちろん、これは、OSでMCルーティングを試してみる必要はありません。これにより、パケットを希望どおりにルーティングすることができます。
  2. 2つの異なるNICが完全に分離されたLANにつながり、MCルーティングのすべて/完全な要素(指定されたルーター、おそらくランデブーポイントなど)をさらに持つ可能性がある、あなたのようなセットアップを想像するかもしれません。したがって、IGMP結合に適切なNICを選択することが不可欠であり、すべてを決定します。これらが間違ったNICに発行された場合、MCトラフィックを受信できない可能性があります。それらが両方のNICに発行された場合、必要以上の結果が得られる可能性があります。

これがお役に立てば幸いです(質問が6歳になったとしても)。

于 2018-07-27T16:31:08.993 に答える
2

IIRCMulticastSocketはマルチキャストメッセージを受信setGroupするためのものであり、特定のマルチキャストIPアドレスにバインドされたマルチキャストメッセージをリッスンするように設定する必要があります。マルチキャストメッセージを送信する場合は、はるかに簡単です。メッセージをその特定のマルチキャストIPアドレスに送信するだけで、ルーター/ゲートウェイが実際のマルチキャストロジックを処理します。(したがって、マルチキャストを適切にサポートするルーター/ゲートウェイが必要です。)

編集:Javaチュートリアルはこのトピックもカバーしています:http://docs.oracle.com/javase/tutorial/networking/datagrams/broadcasting.html

于 2012-06-24T01:36:37.633 に答える
1

setInterface()メソッドのIPアドレスは、独自のインターフェイスの1つのアドレスです。これは、複数のNICがあり、すべてが異なるサブネットに接続されており、マルチキャスト参加およびグループメッセージを残して、IPルーティングテーブルのデフォルトルートではないサブネットに送信する場合に使用されます。

あなたが言及した場合、setInterface()を呼び出す必要はまったくありません。

マシンにメッセージを受信させたい場合は、オンにする必要があります。

于 2012-06-24T01:30:13.493 に答える