De onde vem o tempo limite do soquete de 21000 ms?

O problema

Um aplicativo que eu mantenho continua recebendo intervalos de soquete após aproximadamente 21000 ms, apesar de eu ter definido explicitamente intervalos mais longos. Esse valor aparentemente mágico de 21000 ms surgiu em algumas outras perguntas e respostas do SO, e estou tentando descobrir exatamente de onde vem.

Aqui está a essência do meu 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();
    }
}

Não é ideal capturar todas as exceções em um bloco, mas é um código herdado e estou relutante em mexer com ele. Eu sei que está pegandoSocketTimeoutException após 21000 ms porque registra o nome simples da classe de exceção.

Pistas

Encontrei uma pergunta em que um solicitante estava recebendo umConnectTimeout após 21000 ms, apesar de defini-lo explicitamente para 40000 ms. Isso é intrigante, apesar da classe de exceção ser diferente.

Eu também encontrei uma resposta mal explicada que afirma queo lado do servidor é responsável pelo tempo limite de 21000 ms.

My Hunch

Eu não acho que nenhuma ação ou inação do servidor possa causar um tempo limite de soquete menor que o esperado no cliente. Mas talvez as pilhas TCP no Windows e no Android compartilhem um ancestral comum ou, pelo menos, usem uma lógica de repetição de conexão semelhante.

Será que o Android impõe um tempo limite máximo de conexão de 21000 ms e a configuração de um tempo limite mais longo emHttpURLConnection é fútil? Ou esse tempo limite pode ser acionado por alguma máquina Windows no caminho entre o dispositivo móvel e o servidor? Algumas versões do Android lançam umSocketTimeoutException onde outros jogam umConnectException?

questionAnswers(3)

yourAnswerToTheQuestion