Откуда берется время ожидания сокета 21000 мс?

Эта проблема

Приложение, которое я поддерживаю, продолжает получать время ожидания сокета примерно после 21000 мс, несмотря на то, что я явно установил более длительное время ожидания. Это, казалось бы, волшебное значение 21000 мс появилось в нескольких других SO-вопросах и ответах, и я пытаюсь точно выяснить, откуда оно исходит.

Вот суть моего кода:

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

Перехват всех исключений в одном блоке, по общему признанию, не идеален, но это унаследованный код, и я не хочу с ним связываться. Я знаю это ловитSocketTimeoutException через 21000 мс, поскольку в нем регистрируется простое имя класса исключения.

Улики

Я нашел вопрос, где аскер получалConnectTimeout через 21000 мсНесмотря на то, что он явно установлен на 40000 мс. Это интригует, несмотря на то, что класс исключений отличается.

Я также нашел плохо объясненный ответ, который утверждает, чтосторона сервера отвечает за тайм-аут 21000 мс.

Моя догадка

Я не думаю, что какое-либо действие или бездействие сервера может привести к сокращению времени ожидания сокета на клиенте. Но, возможно, стеки TCP в Windows и Android имеют общего предка или, по крайней мере, используют аналогичную логику повторных попыток соединения.

Может ли быть так, что Android устанавливает максимальное время ожидания соединения 21000 мс и устанавливает более длительное время ожидания вHttpURLConnection бесполезно? Или этот тайм-аут может быть вызван какой-то машиной Windows на пути между мобильным устройством и сервером? У некоторых версий Android кидаютSocketTimeoutException где другие бросаютConnectException?

Ответы на вопрос(3)

Ваш ответ на вопрос