¿De dónde viene el tiempo de espera de socket de 21000 ms?

El problema

Una aplicación que mantengo sigue obteniendo tiempos de espera de socket después de aproximadamente 21000 ms, a pesar de que he establecido explícitamente tiempos de espera más largos. Este valor aparentemente mágico de 21000 ms ha surgido en algunas otras preguntas y respuestas SO, y estoy tratando de averiguar exactamente de dónde proviene.

Aquí está la esencia de mi código:

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();
    }
}

Sin duda, capturar todas las excepciones en un bloque no es lo ideal, pero es un código heredado y soy reacio a meterse con él. Sé que está atrapandoSocketTimeoutException después de 21000 ms porque registra el nombre simple de la clase de excepción.

Pistas

Encontré una pregunta en la que un autor de la pregunta recibíaConnectTimeout después de 21000 ms, a pesar de establecerlo explícitamente en 40000 ms. Eso es intrigante a pesar de que la clase de excepción es diferente.

También encontré una respuesta mal explicada que afirma queel lado del servidor es responsable del tiempo de espera de 21000 ms.

Mi corazonada

No creo que ninguna acción o inacción del servidor pueda causar un tiempo de espera de socket menor al esperado en el cliente. Pero tal vez las pilas TCP en Windows y Android comparten un ancestro común, o al menos usan una lógica de reintento de conexión similar.

¿Podría ser que Android imponga un tiempo de espera de conexión máximo de 21000 ms y establezca un tiempo de espera más largo enHttpURLConnection es inútil? ¿O podría este tiempo de espera ser activado por alguna máquina Windows en la ruta entre el dispositivo móvil y el servidor? ¿Algunas versiones de Android arrojan unSocketTimeoutException donde otros tiran unConnectException?

Respuestas a la pregunta(3)

Su respuesta a la pregunta