ConnectionTimeout versus SocketTimeout

135

Tengo un problema con una biblioteca que estoy usando. ¡Podría ser la biblioteca o podría ser que yo la esté usando mal!

Básicamente, cuando hago esto (Tiempo de espera en milisegundos)

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

No se genera ninguna excepción de tiempo de espera y funciona bien, sin embargo, cuando hago lo siguiente,

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

Me sale una excepción de socket.

Entonces, mi pregunta es ¿por qué no puedo simular una excepción de conexión? ¿Estoy malinterpretando la diferencia entre un socket y un tiempo de espera de conexión? La biblioteca está aquí (aún no se ha lanzado oficialmente).

Robert
fuente

Respuestas:

227

Un tiempo de espera de conexión ocurre solo al iniciar la conexión TCP. Esto suele suceder si la máquina remota no responde. Esto significa que el servidor se cerró, usó un nombre IP / DNS incorrecto, un puerto incorrecto o la conexión de red al servidor está inactiva.

Se dedica un tiempo de espera de socket para monitorear el flujo continuo de datos entrantes. Si el flujo de datos se interrumpe durante el tiempo de espera especificado, la conexión se considera como estancada / interrumpida. Por supuesto, esto solo funciona con conexiones donde los datos se reciben todo el tiempo.

¡Al establecer el tiempo de espera del socket en 1, esto requeriría que se reciban nuevos datos de cada milisegundo (suponiendo que lea el bloque de datos sabiamente y que el bloque sea lo suficientemente grande)!

Si solo la secuencia entrante se detiene durante más de un milisegundo, se está agotando el tiempo de espera.

Robert
fuente
1
¿Podría obtener un tiempo de espera de conexión si el servidor no está inactivo pero está ocupado? ¿O sería un tiempo de espera de socket?
Robert
9
Eso depende: si la conexión TCP se ha establecido antes de que el servidor esté sobrecargado, obtendrá una excepción de socket; de lo contrario, obtendrá una excepción de conexión, que indica que no se pudo establecer la conexión TCP.
Robert
2
Teniendo en cuenta la alta latencia de las redes móviles especialmente antiguas, el tiempo de espera de la conexión debe establecerse en varios segundos (por ejemplo, 10 segundos o mejor a 10000 ms). El tiempo de espera del socket solo lo establecería si no usa varias conexiones porque HTTP puede reutilizar la conexión después de una solicitud.
Robert
1
¿Significa esto que si configura un tiempo de espera de socket (por ejemplo, 1 min), la conexión se interrumpirá después de 1 minuto de inactividad, donde normalmente se volvería a usar si no se configurara un tiempo de espera?
Robert
2
@Robert No necesariamente obtendrá una excepción de conexión si el servidor está demasiado ocupado. Depende de la plataforma, en la plataforma del servidor. Un tiempo de espera de lectura de socket no mata la conexión. Simplemente causa una SocketTimeoutException. Si la conexión sigue siendo utilizable es una decisión que debe tomar la aplicación. Ciertamente, no hay nada en la API que diga que no puede probar más E / S en el zócalo. Su declaración sobre no usar tiempos de espera si usa conexiones múltiples no comienza a tener sentido. Demasiada información errónea aquí.
Marqués de Lorne
83

Un tiempo de espera de conexión es la cantidad máxima de tiempo que el programa está dispuesto a esperar para configurar una conexión a otro proceso. No está obteniendo ni publicando datos de la aplicación en este momento, solo está estableciendo la conexión.

Un tiempo de espera de socket es el tiempo de espera cuando se esperan paquetes individuales. Es un error común pensar que un tiempo de espera de socket es el tiempo de espera para recibir la respuesta completa. Entonces, si tiene un tiempo de espera de socket de 1 segundo y una respuesta compuesta de 3 paquetes IP, donde cada paquete de respuesta tarda 0.9 segundos en llegar, para un tiempo de respuesta total de 2.7 segundos, entonces no habrá tiempo de espera.

entpnerd
fuente
3
Bueno. 1. Entonces, ¿podemos decir que SocketTimeout solo aparece cuando ya se ha establecido una conexión? 2. ¿Qué pasa si no hay flujo de datos por ejemplo 5 minutos después de que se hayan recibido los 3 paquetes? ¿Habrá una excepción SocketTimeout después de que se haya recibido el tercer paquete?
Saurabh Patil
2
@SaurabhPatil 1. Sí. Consulte la Descripción técnica general de Wikipedia del protocolo HTTP para confirmar. 2. Una vez que se envía el final del mensaje, no se necesitan más datos, por lo que no se producirá un tiempo de espera de socket. Vea esta respuesta sobre el tema.
entpnerd
77
Desearía que hubieran llamado "tiempo de espera de socket" como "tiempo de espera inactivo".
Manish Maheshwari