web-dev-qa-db-ja.com

TCPプログラムをネットワークインターフェイスにバインドする方法は?

Boost ASIO TCPソケットを使用するクライアント/サーバーネットワークアプリケーションがあります。クライアントは、複数のネットワークインターフェイス(WiFi、セルラーなど)が利用可能な組み込みLinuxシステムで実行されています。 1つのネットワークインターフェイスのみが稼働していて、署名されたIPアドレスです。インターフェイスがダウンしている場合は、別のインターフェイスが稼働していて、署名されたIPアドレスです。私が抱えている問題は、アプリケーションがTCPソケットを1つに作成するときです。使用可能なインターフェイスでは、リモートサーバーにデータを転送できますが、インターフェイスがダウンしているとき、別のインターフェイスがアップしている場合でも、クライアントアプリケーションは同じダウンインターフェイスを使用してデータをリモートサーバーに転送するため、サーバーはデータを受信できません。 Linux OSルートはネットワークインターフェイスのフェイルオーバーを処理できるはずだと考えたので、ユーザーTCPアプリケーションはネットワークインターフェイスの変更について心配する必要はありません。プログラムを修正するためのヒントに感謝します。

イーサネットとWiFiの両方を備えたUbuntu18を実行しているラップトップでも見られるのと同じ問題があります。イーサネットが接続されているときにリモートサイトに接続されたsshを実行すると、イーサネットケーブルを抜いたときに、WiFiは接続されたままですが、sshがフリーズします。 OSルートで接続を迂回させることはできません。

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

敬具、

  • j

1つのインターフェイスがダウンしたときに既存のTCP接続スイッチングインターフェイスについて話しているのですか?これは機能しません、TCPはマルチホーミングではないので、これはLinuxではなくプロトコルの欠陥。TCPソケットをリッスンするOTOHは、デフォルトですべてのインターフェイスを使用し、TCP接続を開きます。

はい、既存のTCP 1つのインターフェイスがダウンしたときの接続スイッチングインターフェイス。

クライアントサーバーアプリケーションで両側を制御する場合は、SCTPやマルチパスTCPなどのマルチホーミングプロトコルの使用を検討してください。

はい、クライアントサーバーアプリケーションの両側を制御します。 Boost ASIOソケットを使用し、BoostがMultipath TCP)をサポートしているかどうかを確認します。

ボンディングなどの物理リンクのフェイルオーバーを処理する方法は他にもありますが、両方を制御できる必要もあります。

はいまたはいいえ、クライアントサーバーアプリケーションの両側を制御しますが、サーバープラットフォームサイトのみを制御し、クライアントプラットフォームサイトは制御しません。ネットワーク操作を変更するようにクライアントサイトに提案できますか?

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

1
user157912

1つのインターフェイスがダウンしたときに既存のTCP接続スイッチングインターフェイスについて話しているのですか?これは機能しません、TCPはマルチホーミングではないので、これはLinuxではなくプロトコルの欠陥。TCPソケットでのOTOHlisteningは、デフォルトですべてのインターフェイスを使用しますopeninga TCP接続。

クライアントサーバーアプリケーションで両側を制御する場合は、 [〜#〜] sctp [〜#〜] または Multipath TCP のようなマルチホーミングプロトコルの使用を検討してください。

LinuxOSルートはネットワークインターフェースのフェイルオーバーを処理できるはずだと思いました

TCPとUDP)の他の既存の実装もそうではありません。同様に、複数のISPを同時に簡単に使用することはできません。これはFAQです。 。

ボンディングなどの物理リンクのフェイルオーバーを処理する方法は他にもありますが、両方を制御できる必要もあります。

編集

サーバーとクライアントの間にあるものに応じて、ネットワークのこの部分はSCTPを通過させる場合と通過させない場合があります(疑わしい場合はテスト)。

ほとんどの組み込みLinuxシステムでは、カーネルを再コンパイルできるはずです。これは、マルチパスTCPに必要なものです。

これができない場合は、おそらくこの問題で立ち往生しています-唯一の回避策は、インターフェイスがダウンしたかどうかを検出し、クライアントから接続を再度開くことです(サーバーに既知のIPがあると仮定します)。

3
dirkt