Dirktが指摘したように、情報がありません。これ質問ですが、要約すると、複数のインターフェイスが処理できるマルチキャストトラフィックをたくさん受信したいのですが、すべてのトラフィックを受信するには、複数のインターフェイスを使用し、各インターフェイスで個別にストリームに参加したいと思います。
3つのNICがあり、そのうちの1つ(webIfと呼ばれる)がインターネットに接続され、残りの2つ(lanIf1とlanIf2と呼ばれる)がLANに接続されています(両方とも同じです)。両方のインターフェイスでマルチキャストトラフィックを受信しようとしましたが、1つのインターフェイスでのみIGMPクエリの受信を報告し、リンクされたストリームについてのみ報告しました。したがって、タイムアウト期間が過ぎると、スイッチは他のインターフェイスによって結合されたフロー転送を停止します。
この問題を解決するためにポリシールーティングを試しました。各lanIfのルートテーブルを作成し、各lanIfにルートを追加して同じゲートウェイに移動し、デフォルトのルートルーティングテーブルテーブルを使用する前に、2つの新しいルールを使用する2つのルールを作成します。
私の住所が次のような場合:
lanIf1: 25.25.43.88
lanIf2: 25.25.43.84
default gateway of the lan switch: 25.25.43.5
igmp querier: 25.25.43.1
まず、次のように/etc/iproute2/rt_tablesにテーブルを追加しました
cat /etc/iproute2/rt_tables
。
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
2 lanIf1Table
3 lanIf2Table
その後、このスクリプトをrootとして実行します。
ip route add 25.25.43.0/24 dev lanIf1 src 25.25.43.88 table lanIf1Table
ip route add default via 25.25.43.5 dev lanIf1 table lanIf1Table
ip route add 25.25.43.0/24 dev lanIf2 src 25.25.43.84 table lanIf2Table
ip route add default via 25.25.43.5 dev lanIf2 table lanIf2Table
ip rule add from 25.25.43.88 table lanIf1Table prio 1000
ip rule add from 25.25.43.84 table lanIf2Table prio 1001
しかし、何も起こりません。 IGMP クエリは、インターフェイスの 1 つでのみ応答されます。
私が何でも動作させる唯一の方法は、ルールの1つを変更することです
ip rule add from 0.0.0.0 table lanIf1Table prio 1000
。その後、lanIf1でIGMPレポートが完了します。ただし、すべてのトラフィックが通過するため、もちろんすべてのインターネットアクセスが失われますlanIf1Table
。
私は何が間違っていましたか?私は次のチュートリアルに従ってきました: http://www.rjsystems.nl/en/2100-adv-routing.php
https://blog.scottlowe.org/2013/05/29/a-quick-introduction-to-linux-policy-routing/
答え1
スイッチの仕組みは次のとおりです。
スイッチには、コンピュータのNICにポイントツーポイント接続される複数のネットワークポートがあります。 NICが25 GB / sを実行できる場合、これはポイントツーポイント接続が25 GB / sを実行するプロトコルを使用することを意味します。
これで、愚かなスイッチができましたが、これは次のことも意味します。着信このNICにルーティングされる接続は25 GB / sに制限されます。さらに、シンプルスイッチはマルチキャストをすべてのポートにルーティングします。したがって、同じコンピュータに2つの25 GB / s NICがある場合、各NICは合計25 GB / sの速度で同じマルチキャストパケットを受信します。スイッチ自体に強力な機能があるか、より高い帯域幅があるかにかかわらず。
ただし、その帯域幅では、スイッチは非常にスマートで内部メモリを持つことができます。したがって、スイッチはいくつかの操作を実行できます。
1) 内部RAMにパケットを保存して転送します。これは、着信接続が発信接続の最大速度に制限されないことを意味します。
2) ボンディングが可能な場合は、2 つのポイントツーポイント接続を 2 つの帯域幅で 1 つの接続にまとめることができます。
3)マルチキャストを認識してマルチキャストプロトコルを受信した場合は、マルチキャストグループに登録されている受信者にのみパケットを転送します。したがって、2つの異なるマルチキャストグループ(またはそれ以上)があり、1つのグループの1つのNICレジスタにアプリケーションがあり、別のグループの別のNICレジスタにアプリケーションがある場合、実際に帯域幅が2倍になります。繰り返しますが、これらは異なるマルチキャストグループでなければならず、異なるアプリケーションだけでは十分ではありません。
したがって、最も簡単な方法は(2)です。 NICをバインドして完了することです。
(3)の場合、Linuxが異なるNICで同じサブネットを正しく処理できないという問題を解決できませんでした。この問題を解決する方法はいくつかあります。
a) ネットワークインターフェイスを別のネットワークネームスペースに配置し、そのネームスペースから受信アプリケーションを起動します。
b) 申請しました製本ネットワークインターフェイスに。すべてのアプリケーションがこれを実行できるわけではなく、実際にマルチキャストに複雑さがないかどうかはわかりません(ユニキャストで動作します)。
c)異なるサブネットを使用し、ネットワークアーキテクチャ(たとえば、可能であればスイッチ)の他のサブネット間でマルチキャストをルーティングします。
これらすべては(2)よりはるかに難しいです。
これらすべてはあなたに2倍の利益しか与えません。可逆ビデオ圧縮(ビデオでノイズのあるピクセルを保存したい場合)も2〜3倍の利得を提供しますが、わずかな損失のある圧縮はより良い要素を提供します。そして良い結果を得るために多くのCPUは必要ありません。したがって、あなたが属する帯域幅の範囲内でネットワークを複雑にする前に、最初のステップとして圧縮を検討します。
答え2
ここで説明してください: https://access.redhat.com/solutions/53031
ここではあまり明確ではありません。 https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
2つのネットワークインターフェース(インターフェースAとインターフェースB)を持つコンピューターを考えてみましょう。 Linux がインターフェイス B を使用して IP アドレス X にパケットを送信することを決定したとします。インターフェイスAのIPアドレスXから受信したパケットを考えてみましょう。 Linux はパケットをドロップします。
端末で実行するか、
sysctl net.ipv4.conf.all.rp_filter=2
その行を/etc/sysctl.conf
。
そのIPアドレスにパケットを送信するために使用されるインターフェイスとは異なるインターフェイスのIPアドレスからパケットを受信できます。