私はクライアント側にいます。複数のネットワークインターフェイスがあります。さまざまなプロセスがさまざまなネットワークインターフェイスを使用して通信できるようにするにはどうすればよいですか?同じサーバーに接続したいので、ここではルーティングが機能していないようです。また、connect()
ローカルアドレスまたはインターフェイスを指定するための引数はありませんbind()
。
3 に答える
複数のネットワーク インターフェイスを並行して使用してサーバーへの帯域幅を増やすことが目標である場合、それはおそらくアプリケーション レベルで実行できる (または実行する必要がある) ことではありません。代わりに、 Link Aggregationについて調べてから、それを使用するようにコンピューターとネットワーク スタックを構成する必要があります。それが適切に機能するようになると、クライアント アプリケーションがそれを有効にするために特別なことをしなくても、必要な並列化の高速化が自動的に得られます。
「bind()システムコールは誤解されることがよくあります。特定のIPアドレスにバインドするために使用されます。そのIPアドレス宛てのパケットのみが受信され、送信されたパケットはすべてそのIPアドレスを送信元として伝送します。bind()は送信されたパケットのルーティングについては何も制御しません。たとえば、eth0のIPアドレスにバインドしたが、カーネルの最適なルートがeth1を送信する宛先にパケットを送信した場合、パケットはeth1から送信されます。 eth0の送信元IPアドレス。これは、パケットが宛先に向かう途中で無関係のネットワークを通過できるTCP/IPに完全に有効です。」
詳細はこちらなど。
そのため、bind()の呼び出しを誤解している可能性があります。
物理トポロジ(特定のインターフェイス)にバインドする適切な方法は、SO_BINDTODEVICE
ソケットオプションを使用することです。これは電話で行われsetsockopt()
ます。
Source Policy Routing
役立つかもしれません。
次の手順を試してください。
iptables
異なるマークを持つ異なるプロセスからのパケットを提供するために使用します。iproute2
異なるマークを持つパケットを異なるテーブルにルーティングするために使用します。- 別のテーブルで、デフォルト ルートを別のアップリンクに設定します。
プロセス全体では、Linux ネットワーキングについてある程度の理解が必要です。
次の例は、1 つの特定のアップリンクを介してユーザーのすべてのトラフィックをルーティングする方法を示しています。特定のネットワーク インターフェイスを使用する/
異なるユーザーで異なるプロセスを実行し、あるユーザーから 1 つのアップリンクにトラフィックをルーティングすることで、同様のアプローチに従うことができます。
また、プロセスが別のポートを使用してサーバーと通信し、ポートごとにトラフィックをマークすることもできます。