Woher kommt das Socket-Timeout von 21000 ms?

Das Proble

Eine App, die ich verwalte, erhält nach ungefähr 21000 ms immer Socket-Timeouts, obwohl ich ausdrücklich längere Timeouts festgelegt habe. Dieser scheinbar magische Wert von 21000 ms ist in einigen anderen SO-Fragen und -Antworten aufgetaucht, und ich versuche herauszufinden, woher er kommt.

Hier ist die Essenz meines Codes:

HttpURLConnection connection = null;
try {
URL url = new URL(urlString);
    connection = (HttpURLConnection) url.openConnection();
    connection.setConnectTimeout(45000);
    connection.s,etReadTimeout(90000);
    int responseCode = connection.getResponseCode();
    if (responseCode == 200) {
        // code omitted
    }       
} catch (Exception e) {
    // code omitted
}
finally {
    if (connection != null) {
        connection.disconnect();
    }
}

Es ist zwar nicht ideal, alle Ausnahmen in einem Block abzufangen, aber es ist vererbter Code, und ich zögere, mich damit herumzuschlagen. Ich weiß, dass es @ fänSocketTimeoutException nach 21000 ms, da der einfache Name der Ausnahmeklasse protokolliert wird.

Hinweis

Ich habe eine Frage gefunden, bei der ein Fragesteller ein @ erhalten haConnectTimeout nach 21000 ms, obwohl es explizit auf 40000 ms gesetzt wurde. Das ist faszinierend, obwohl die Ausnahmeklasse anders ist.

Ich habe auch eine schlecht erklärte Antwort gefunden, die besagt, dassdie Serverseite ist verantwortlich für das Timeout von 21000 ms.

Meine Ahnung

Ich glaube nicht, dass eine Aktion oder Inaktivität des Servers eine kürzere als erwartete Socket-Zeitüberschreitung auf dem Client verursachen kann. Aber vielleicht haben die TCP-Stapel in Windows und Android einen gemeinsamen Vorfahren oder verwenden zumindest eine ähnliche Logik für Verbindungswiederholungen.

Kann es sein, dass Android ein maximales Zeitlimit für die Verbindung von 21000 ms festlegt und in @ ein längeres Zeitlimit festlegHttpURLConnection ist sinnlos? Oder könnte dieses Timeout von einem Windows-Computer auf dem Pfad zwischen dem mobilen Gerät und dem Server ausgelöst werden? Einige Android-Versionen werfen einSocketTimeoutException wo andere ein @ werfConnectException?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage