7

2 つの udp ソケットを作成し、それらを INADDR_ANY と同じポート番号にバインドしたとき。しかし、そのうちの 1 つはマルチキャスト グループに参加しました。ただし、ソケットの 1 つがマルチキャスト グループに参加していなくても、両方とも同じマルチキャスト グループからデータを受信できます。

4

2 に答える 2

4

カーネルは、ソケットがどのマルチキャスト グループのメンバーであるかに基づいて、着信マルチキャスト パケットをフィルター処理しません。グループにソケットを追加しない場合でも、同じシステム上の他のソケットがメンバーである場合、グループへのマルチキャストを受信することがあります。(マルチキャストが到着してもソケットがメンバーではない場合に何が起こるかはわかりません。必要に応じてテストできます。)

実際、カーネルはグループの所有権をソケットごとに追跡することに注意してください。IGMP プロトコルのクライアント側を適切に実装する必要があるか、実装できませんでした。たとえば、カーネルはルーターからのさまざまな種類の IGMP クエリ (ホストが参加しているグループを尋ねられる) に応答する必要があり、参加しているソケットがなくなったときにグループ脱退メッセージを送信することも認識しています。特定のグループ。

于 2012-12-17T12:55:44.217 に答える
4

Linux カーネルは IGMP Join の状態を追跡しません。IGMP はルーター プロトコルです。マルチキャスト グループに IGMP Join を送信すると、ルータは特定のアドレスとポートにパケットを転送するように指示されるだけです。ルーターは IGMP と通信できる必要があることに注意してください。

これは、以前setsockopt()はマルチキャスト グループに参加していたにもかかわらず、メンバーシップがカーネルによってソケットごとに追跡されないことを意味します。カーネルは IGMP Join パケットをルーターに送信するだけです。これは、wireshark などを使用して確認できます。

カーネルはソケットの IGMP 状態を追跡しないため、そのアドレスとポートの受信トラフィックは、カーネルの「通常の」トラフィックにすぎません。

そのため、両方のソケットを同じアドレスとポートにバインドし、そのアドレスとポートを使用して IGMP Join を送信した場合、パケットが両方のソケットで利用可能になるのは予想される動作です。

ところで: 同じアドレスとポートにバインドされた 2 つのソケットが必要なのはなぜですか?

更新: @Ambroz Bizjak (感謝) の説明に従うと、Linux カーネルが IGMP 参加の状態を追跡しないというのは正しくありません。します。ただし、複数のソケットが同じアドレスとポートにバインドされている場合、この情報を使用して、どのパケットをどのソケットに転送するかを決定しません。

于 2012-12-16T16:05:29.310 に答える