ConnectionTimeout versus SocketTimeout

135

Estou tendo um problema com uma biblioteca que estou usando. Pode ser a biblioteca ou talvez eu esteja usando errado!

Basicamente, quando faço isso (Tempo limite em milissegundos)

_ignitedHttp.setConnectionTimeout(1);  // v short
_ignitedHttp.setSocketTimeout(60000);  // 60 seconds

Nenhuma exceção de tempo limite é gerada e funciona bem, no entanto, quando eu faço o seguinte,

_ignitedHttp.setConnectionTimeout(60000);  // 60 seconds
_ignitedHttp.setSocketTimeout(1);          // v short

Eu recebo uma exceção de soquete.

Portanto, minha pergunta é por que não posso simular uma exceção de conexão? Estou entendendo mal a diferença entre um soquete e um tempo limite de conexão? A biblioteca está aqui (ainda não foi oficialmente lançada).

Robert
fonte

Respostas:

227

Um tempo limite de conexão ocorre apenas ao iniciar a conexão TCP. Isso geralmente acontece se a máquina remota não atender. Isso significa que o servidor foi desligado, você usou o nome IP / DNS errado, a porta errada ou a conexão de rede com o servidor está inoperante.

Um tempo limite do soquete é dedicado para monitorar o fluxo contínuo de dados recebidos. Se o fluxo de dados for interrompido pelo tempo limite especificado, a conexão será considerada parada / interrompida. Obviamente, isso só funciona com conexões em que os dados são recebidos o tempo todo.

Ao definir o tempo limite do soquete para 1, isso exigiria que todos os novos dados em milissegundos fossem recebidos (supondo que você lesse o bloco de dados e o bloco seja grande o suficiente)!

Se apenas o fluxo de entrada parar por mais de um milissegundo, você estará executando um tempo limite.

Robert
fonte
1
Você poderia obter um tempo limite de conexão se o servidor não estiver inativo, mas estiver ocupado? Ou isso seria um tempo limite de soquete?
Robert
9
Isso depende - se a conexão TCP tiver sido estabelecida antes da sobrecarga do servidor, você receberá uma exceção de soquete - caso contrário, receberá uma exceção de conexão, indicando que a conexão TCP não pôde ser estabelecida.
Robert
2
Considerando a alta latência de redes móveis especialmente antigas, o tempo limite da conexão deve ser definido para vários segundos (por exemplo, 10s ou 10000 ms). O tempo limite do soquete eu definiria apenas se você não usar várias conexões porque o HTTP pode reutilizar a conexão após uma solicitação.
Robert
1
Isso significa que se você definir um tempo limite de soquete (por exemplo, 1 min), a conexão será interrompida após 1 min de inatividade, onde normalmente seria reutilizada se nenhum tempo limite fosse definido?
Robert
2
@ Robert Você não receberá necessariamente uma exceção de conexão se o servidor estiver muito ocupado. Depende da plataforma, na plataforma do servidor. Um tempo limite de leitura do soquete não interrompe a conexão. Apenas causa uma SocketTimeoutException. Se a conexão ainda é utilizável é uma decisão que o aplicativo precisa tomar. Certamente não há nada sobre a API que diga que você não pode tentar mais E / S no soquete. Sua declaração sobre não usar tempos limite se você usar várias conexões não começa a fazer sentido. Muita desinformação aqui.
Marquês de Lorne
83

Um tempo limite de conexão é a quantidade máxima de tempo que o programa está disposto a esperar para configurar uma conexão com outro processo. Você não está obtendo ou postando nenhum dado de aplicativo neste momento, apenas estabelecendo a conexão em si.

Um tempo limite de soquete é o tempo limite ao aguardar pacotes individuais. É um equívoco comum que um tempo limite de soquete seja o tempo limite para receber a resposta completa. Portanto, se você tiver um tempo limite de soquete de 1 segundo e uma resposta composta por 3 pacotes IP, em que cada pacote de resposta leva 0,9 segundos para chegar, para um tempo total de resposta de 2,7 segundos, não haverá tempo limite.

entpnerd
fonte
3
OK. 1. Então, podemos dizer que o SocketTimeout só aparece quando uma conexão já está estabelecida? 2. E se não houver fluxo de dados, por exemplo, 5 minutos após o recebimento dos 3 pacotes? Haverá uma exceção SocketTimeout após o recebimento do terceiro pacote?
Saurabh Patil
2
@SaurabhPatil 1. Sim. Consulte a Visão geral técnica da Wikipedia do protocolo HTTP para confirmação. 2. Depois que o final da mensagem é enviado, nenhum dado adicional é necessário; portanto, um tempo limite de soquete não ocorrerá. Veja esta resposta no tópico.
entpnerd
7
Eu gostaria que eles tivessem chamado "socket timeout" como "idle timeout".
Manish Maheshwari