¿Cuál es la diferencia entre conexión y tiempo de espera de lectura para sockets?

3 preguntas:

  1. ¿Cuál es la diferencia entre conexión y tiempo de espera de lectura para sockets?

  2. ¿Qué significa el tiempo de espera de conexión establecido en “infinito”? ¿En qué situación puede permanecer en un bucle infinitivo? y ¿qué puede provocar que el bucle infinito muera?

  3. ¿Qué significa el tiempo de espera de lectura establecido en “infinito”? ¿En qué situación puede permanecer en un bucle infinitivo? y ¿qué puede provocar que el bucle infinito muera?

1) ¿Cuál es la diferencia entre la conexión y el tiempo de espera de lectura para los sockets?

El tiempo de espera de conexión es el tiempo de espera para realizar la conexión inicial; es decir, completando el enlace de conexión TCP. El tiempo de espera de lectura es el tiempo de espera agotado para leer datos 1 . Específicamente, si el servidor no puede enviar un byte segundos después del último byte, se generará un error de tiempo de espera de lectura.

2) ¿Qué significa el tiempo de espera de conexión establecido en “infinito”? ¿En qué situación puede permanecer en un bucle infinitivo? y ¿qué puede provocar que el bucle infinito muera?

Significa que el bash de conexión puede bloquear para siempre. No existe un ciclo infinito, pero el bash de conexión se puede desbloquear mediante otro hilo que cierre el socket. (Una llamada Thread.interrupt() también puede hacer el truco … no estoy seguro).

3) ¿Qué significa el tiempo de espera de lectura establecido en “infinito”? ¿En qué situación puede permanecer en un ciclo infinito? ¿Qué puede provocar que el bucle infinito termine?

Significa que una llamada para read en la secuencia de socket puede bloquearse para siempre. Una vez más, no existe un bucle infinito, pero la read puede desbloquearse mediante una llamada Thread.interrupt() , cerrando el socket y (por supuesto) el otro extremo enviando datos o cerrando la conexión.


1 – No es … como un comentarista pensó … el tiempo de espera sobre cuánto tiempo puede estar abierto un socket, o inactivo.

Estos son valores de tiempo de espera impuestos por JVM para el establecimiento de la conexión TCP y la espera de la lectura de datos del socket.

Si el valor está establecido en infinito, no esperará por siempre. Simplemente significa que JVM no tiene tiempo de espera y OS será responsable de todos los tiempos de espera. Sin embargo, los tiempos de espera en el sistema operativo pueden ser realmente largos. En una red lenta, he visto tiempos de espera de hasta 6 minutos.

Incluso si configura el valor de tiempo de espera para el socket, es posible que no funcione si el tiempo de espera pasa en el código nativo. Podemos reproducir el problema en Linux conectándose a un host bloqueado por un firewall o desconectando el cable del switch.

El único enfoque seguro para manejar el tiempo de espera de TCP es ejecutar el código de conexión en un hilo diferente e interrumpir el hilo cuando demora demasiado.