ソケットの接続タイムアウトと読み取りタイムアウトの違いは何ですか?


180

3つの質問:

  1. ソケットの接続タイムアウトと読み取りタイムアウトの違いは何ですか?

  2. 「無限」に設定された接続タイムアウトは何を意味しますか?どのような状況で無限ループにとどまることができますか?そして、無限ループが死ぬのは何がきっかけですか?

  3. 何ん読ん平均「無限大」にタイムアウトセットを?どのような状況で無限ループにとどまることができますか?そして、無限ループが死ぬのは何がきっかけですか?

回答:


227

1)ソケットの接続タイムアウトと読み取りタイムアウトの違いは何ですか?

接続タイムアウトは、初期接続を行う際のタイムアウトです。つまり、TCP接続ハンドシェイクを完了します。読み取りタイムアウトは、データの読み取りを待機する際のタイムアウトです1。具体的には、サーバーが最後のバイトから<timeout>秒後にバイトの送信に失敗すると、読み取りタイムアウトエラーが発生します。

2)接続タイムアウトが「無限」に設定されているとはどういう意味ですか?どのような状況で無限ループにとどまることができますか?そして、無限ループが死ぬのは何がきっかけですか?

これは、接続の試行が永久にブロックされる可能性があることを意味します。無限ループはありませんが、接続を試みると、ソケットを閉じる別のスレッドによってブロックを解除できます。(Thread.interrupt()呼び出しもトリックを行う可能性があります...わかりません)。

3)読み取りタイムアウトが「無限」に設定されているとはどういう意味ですか?どのような状況で無限ループにとどまることができますか?無限ループが終了する原因は何ですか?

これはread、ソケットストリームへの呼び出しが永久にブロックされる可能性があることを意味します。ここでも無限ループはありませんが、呼び出しreadによってThread.interrupt()ソケットのブロックを解除し、(もちろん)もう一方の端でデータを送信したり、接続を閉じたりすることでブロックを解除できます。


1-それは...一人のコメンターが考えたように...ソケットが開いているか、アイドル状態でいられる時間のタイムアウトです。


8

これらは、TCP接続の確立およびソケットからのデータの読み取りを待機するためにJVMによって適用されるタイムアウト値です。

値が無限に設定されている場合、永遠に待つことはありません。これは単に、JVMにタイムアウトがなく、OSがすべてのタイムアウトを担当することを意味します。ただし、OSのタイムアウトは非常に長い場合があります。一部の低速ネットワークでは、タイムアウトが6分もあることがわかりました。

ソケットのタイムアウト値を設定しても、ネイティブコードでタイムアウトが発生すると機能しない場合があります。Linuxで問題を再現するには、ファイアウォールでブロックされたホストに接続するか、スイッチのケーブルを外します。

TCPタイムアウトを処理する唯一の安全なアプローチは、別のスレッドで接続コードを実行し、時間がかかりすぎる場合はスレッドに割り込むことです。


「値が無限に設定されている場合、あなたは永遠に待つことはありません。」「無限」の意味についての議論でない限り、非常に長く待つことは確かに起こり得ます。ここで、HttpURLConnection.getResponseCode()apprxにぶら下がっているケースがありました。プロセスを再開するまで1週間。明らかに、JVM側でタイムアウトが設定されておらず、Linux OS側でもタイムアウトが設定されていませんでした。
Tom Fink 2013

最後の段落は正しくありません。接続は最大で約1分後にタイムアウトします。別のスレッドは完全に不要です。データがない場合は、読み取りを永久に実行することができます。ただし、Javadocは、デフォルトの接続タイムアウトが無限であることについて間違っています。そうではありません。
ローン侯爵2013

1
@comeGetSome不正解です。入力用のソケットをシャットダウンできます。これにより、ブロックされた読み取りがストリームの終わりに遭遇します。
ローン侯爵

@comeGetSome:開いているHTTP URL接続への参照を保持するスレッドを使用してこれを実装する必要がありました。上記のスレッドが接続を閉じると、他のスレッドが「java.net.SocketException:Socket closed」をスローします。バグJDK-8075484に感謝します。
fmcato 2016年

@comeGetSome確かにあなたはSocket.shutdownInput()あなたの手を持たずに電話をかけることができますか?注意これらのタイムアウトは、JVMではなくTCPによって強制されます。
ローン侯爵
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.