質問

クライアント/サーバーのTCP接続はいつまでも続くと予想できますか?

永続的に接続したままにしておきたいのですが、事態が発生するため、クライアントは再接続する必要があります。外部機器に問題があるのではなく、コードに問題があると言うのはどの時点ですか?

役に立ちましたか?

解決

Zan Lynxに同意します。保証はありませんが、接続や帯域幅の問題がないと仮定して、データを送信することで接続をほぼ無期限に維持できます。

一般に、アプリケーションレベルのキープアライブアプローチに移行しましたが、これは通常、クライアント仕様に含まれていたため、実行する必要がありました。ただし、1〜2分ごとに短いデータを送信するだけで、何らかの確認を期待できます。

接続の失敗はあなた次第であるため、確認の失敗を1つカウントするかどうか。一般的にこれは私が過去にやったことですが、接続の反対側のアプリが応答するのが非常に不安定だったので、3つの失敗した応答が連続して接続を切断するのを待っていた場合がありますそこに?"リクエスト。

接続が失敗した場合、同じネットワーク上のマシンであっても、ある時点で接続が失敗する可能性がある場合は、再確立してみてください。それが設定された回数失敗した場合、問題があります。しばらく接続した後も接続が持続的に失敗する場合は、問題があります。どちらの場合も、おそらくコードではなくネットワークの問題か、マシンのTCP / IPスタックの問題である可能性があります(既知の問題:古いバージョンのQNXで問題が発生しました。ただランダムに倒れます)。ソフトウェアに問題があるかもしれないと言ったが、確実に知る唯一の方法は、多くの場合、デバッガを接続するか、そこにログインすることです。例えば。いつでも正常に接続できるが、再接続後でもACKの取得を停止した場合、サーバーがデッドロックしているか、ループなどでスタックしている可能性があります。

本当に便利なのは、単にキープアライブを送信するだけでなく、リクエストと応答を完全に送信することから、サーバーを完全に破壊するまで、さまざまな負荷条件で一連の長時間実行テストをセットアップすることです。これにより、通常、ソフトウェアコンポーネントに関する信頼性が高まり、接続に問題を引き起こすとは限りませんが、トランザクションの問題につながる可能性のある、本当に奇妙な問題を解決するのに非常に役立ちます。たとえば、私はかつて電話番号変換などのサービスを提供する通信アプリケーションサーバーを書いていましたが、一度に何日も実行したままにしておきました。問題は、土曜日が丸一日になったときに、着信したすべての呼び出し要求を拒否することであり、これは何百万もの呼び出しに相当し、その理由はわかりませんでした。土曜日にのみ問題を引き起こした日付変換コードのタイプミスが原因であることが判明しました。

役立つこと。

他のヒント

ここで最も重要なアイデアは、理論と実践です。

元の理論では、接続には寿命がありませんでした。接続があった場合、トラフィックがなくても、イベントによって接続が閉じられるまで、接続は永久に開いたままになりました。

新しい理論では、ほとんどのOSリリースでキープアライブタイマーがオンになっています。これは、相手側のシステムが時折TCPレベルの交換に応答する限り、接続が永久に続くことを意味します。

実際には、さまざまな基準と状況で、時間の経過後に多くの接続が終了します。

2つの非常に良い例は、リモートクライアントがDHCPを使用しており、リースが期限切れになり、IPアドレスが変更されることです。

もう1つの例は、ますますインテリジェントになりそうなファイアウォールです。キープアライブトラフィックと実際のデータを識別し、高度な基準、特にアイドル時間に基づいて接続を閉じることができます。

再接続ロジックの実装方法は、アーキテクチャ、作業環境、およびパフォーマンスの目標に大きく依存します。

実際には問題ではありません。それが望ましい動作である場合、自動的に再接続するようにコードを設計する必要があります。

実際に伝える方法はありません。 TCPに固有のものはなく、一定の時間が経過すると接続がドロップするだけです。信頼できる接続をしている人は何年も稼働している可能性がありますが、別の接続をしている人は5分ごとに再接続する必要があります。伝える方法も推測する方法もありません。

接続を維持するには、定期的に接続を通過するデータが必要になります-多くのOSまたはファイアウォールは、非アクティブな接続をドロップします。

値を選択します。 1時間ごとに1滴落としても問題ありません。 5分間で予期せぬ10の接続の切断は、おそらく問題を示しています。

TCP接続は通常、トラフィックなしで約2時間続きます。どちらの側もキープアライブパケットを送信できます。これは、最後に受信したパケットに対する単なるACKであると思います。これは通常、ソケットごとに設定するか、デフォルトですべてのTCP接続に設定できます。

アプリケーションレベルのキープアライブも可能です。 FTP、SMTP、POP、IMAPなどのtelnetスタイルのプロトコルの場合、return、newlineの送信、コマンドプロンプトの取得などがあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top