
Boost ASIO TCP ソケットを使用するクライアント/サーバー ネットワーク アプリケーションがあります。クライアントは、複数のネットワーク インターフェイス (WiFi、セルラーなど) が利用可能な組み込み Linux システムで実行されており、常に 1 つのネットワーク インターフェイスのみが稼働しており、IP アドレスが署名されています。インターフェイスがダウンしている場合は、別のインターフェイスが稼働しており、IP アドレスが署名されています。問題は、アプリケーションが 1 つの利用可能なインターフェイスで TCP ソケットを作成すると、リモート サーバーにデータを転送できますが、インターフェイスがダウンしていて別のインターフェイスが稼働している場合、クライアント アプリケーションは同じダウンしているインターフェイスを使用してリモート サーバーにデータを転送するため、サーバーがデータを受信できないことです。Linux OS ルートはネットワーク インターフェイスのフェイルオーバーを処理できるはずであり、ユーザー TCP アプリケーションはネットワーク インターフェイスの変更について心配する必要はないと考えていました。プログラムを修正するためのヒントがあれば教えてください。
イーサネットと WiFi の両方を備えた Ubuntu 18 を実行しているラップトップでも同じ問題が発生します。イーサネットが接続されているときにリモート サイトに接続して ssh を実行すると、イーサネット ケーブルを外すと、WiFi はまだ接続されていますが、ssh はフリーズし、OS ルートで接続を転送できません。
ありがとう。
敬具、
- じ
1 つのインターフェースがダウンしたときに、既存の TCP 接続がインターフェースを切り替えることについて話しているのですか? これは機能しません。TCP はマルチホーミングではないため、これはプロトコルの欠陥であり、Linux の欠陥ではありません。一方、TCP ソケットをリッスンすると、TCP 接続を開く場合と同様に、デフォルトですべてのインターフェースが使用されます。
はい、1 つのインターフェースがダウンすると、既存の TCP 接続がインターフェースを切り替えます。
クライアント サーバー アプリケーションの両側を制御する場合は、SCTP や Multipath TCP などのマルチホーミング プロトコルの使用を検討してください。
はい、クライアント サーバー アプリケーションの両側を制御します。Boost ASIO ソケットを使用しており、Boost がマルチパス TCP をサポートしているかどうかを確認します。
ボンディングなどの物理リンクのフェイルオーバーを処理する方法は他にもありますが、その場合も両側を制御できる必要があります。
はい、またはいいえ。クライアント サーバー アプリケーションの両側を制御しますが、制御するのはサーバー プラットフォーム サイトのみで、クライアント プラットフォーム サイトは制御しません。クライアント サイトにネットワーク操作の変更を提案することはできますが、それは機能しますか?
ありがとう。
答え1
1 つのインターフェースがダウンしたときに、既存の TCP 接続がインターフェースを切り替えることについて話しているのですか? これは機能しません。TCP はマルチホーミングではないため、これはプロトコルの欠陥であり、Linux の欠陥ではありません。聞いているTCPソケットではデフォルトですべてのインターフェースが使用されます。オープニングTCP 接続。
クライアントサーバーアプリケーションで両側を制御する場合は、次のようなマルチホーミングプロトコルの使用を検討してください。SCTPまたはマルチパスTCP。
Linux OSルートはネットワークインターフェースのフェイルオーバーを処理できるはずだと思った
これまでもそうではありませんでしたし、TCP や UDP の他の既存の実装でも同様です。同様に、複数の ISP を同時に使用することは容易ではありません。これは FAQ にもあります。
ボンディングなどの物理リンクのフェイルオーバーを処理する方法は他にもありますが、その場合も両側を制御できる必要があります。
編集
サーバーとクライアントの間にあるものに応じて、ネットワークのこの部分は SCTP を通過させる場合とさせない場合があります (疑わしい場合はテストしてください)。
ほとんどの組み込み Linux システムでは、カーネルを再コンパイルできるはずです。これは、Multipath TCP に必要な作業です。
これができない場合は、おそらくこの問題に悩まされていることになります。唯一の回避策は、インターフェースがダウンしたかどうかを検出し、クライアントからの接続を再度開くことです (サーバーの IP が既知であると仮定)。