25

クライアント/サーバーの TCP 接続が実際にどのくらい持続すると予想できますか?

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

4

6 に答える 6

18

私はザン・リンクスに同意します。保証はありませんが、接続や帯域幅の問題がなければ、データを送信することでほぼ無期限に接続を維持できます。

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

接続が失敗したことを確認するために 1 回の失敗をカウントするかどうかは、あなた次第です。これは私が過去に行った一般的な方法ですが、接続の相手側のアプリが「そこにいますか? ?」リクエスト。

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

本当に役立つのは、キープアライブ are you there?/ack リクエストとレスポンスを送信するだけでなく、サーバーを徹底的に破壊するなど、さまざまな負荷条件の下で一連の長期実行テストをセットアップすることです。これにより、一般に、ソフトウェア コンポーネントについてより信頼できるようになり、実行中のトランザクションに問題が発生する可能性がありますが、必ずしも接続に問題が発生するわけではない、いくつかの非常に奇妙な問題を解決するのに非常に役立ちます。たとえば、私はかつて番号変換などのサービスを提供する通信アプリケーション サーバーを作成していましたが、一度に何日も実行したままにしていました。問題は、土曜日が来ると、1 日中、入ってくるすべての通話要求を拒否することでした。これは何百万もの通話に相当し、その理由はわかりませんでした。

それが役立つことを願っています。

于 2008-10-01T17:32:13.823 に答える
7

必要な動作である場合は、自動的に再接続するようにコードを設計する必要があります。

于 2008-10-01T17:10:11.770 に答える
6

本当に伝える方法はありません。一定の時間が経過すると接続が切断される原因となる TCP 固有の機能はありません。信頼できる接続を使用している人は何年も稼働している可能性がありますが、別の接続を使用している人は 5 分ごとに再接続する必要があります。伝える方法も推測する方法もありません。

于 2008-10-01T17:13:02.530 に答える
2

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

于 2008-10-01T17:18:30.457 に答える
-3

値を選択します。1 時間に 1 滴で十分でしょう。5 分間に 10 回の予期しない接続のドロップは、おそらく問題を示しています。

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

アプリケーション レベルのキープアライブも可能です。FTP、SMTP、POP、IMAP などの telnet スタイルのプロトコルの場合、return、改行を送信してコマンド プロンプトを返すようなものです。

于 2008-10-01T17:18:19.553 に答える