c - existing - que es un keep alive
¿TCP Keepalive es el único mecanismo para determinar un enlace roto? (5)
Incluso sin el conjunto SO_KEEPALIVE, si intenta enviar datos a lo largo de una conexión muerta de tcp, por lo general se restablece, o eventualmente se extingue, cualquiera de estos envía un error a la aplicación con el tiempo.
SO_KEEPALIVE significa que esto se puede detectar antes en una conexión que de otro modo estaría inactiva. Eso es todo.
Recientemente me encontré con un problema donde el enlace intermedio entre un servidor TCP y un cliente estaba inactivo. El cliente tiene el requisito de conectarse a un servidor secundario si el servidor principal está inactivo. Cuando se compra el servidor primario (Ej. Haciendo ^ C en el terminal), se produce una secuencia de apagado TCP y el cliente detecta con éxito el enlace roto y prueba el secundario. Sin embargo, si el enlace intermedio baja, el cliente y el servidor no lo notarían. La única forma en que el cliente puede detectar es cuando sus bufferes TCP se llenan con operaciones fallidas de ''envío''.
Como solución a esto, se ha utilizado el mecanismo ''TCP Keepalive''. Esto funciona satisfactoriamente.
Mi pregunta es ''TCP Keepalive'' la única solución?
-Prabhu
Keepalive fue diseñado para hacer frente a las denominadas conexiones a medio abrir, cuando uno de los lados (por lo general, el servidor que recibe las solicitudes) desconoce que la conexión se rompió. El cliente generalmente lo sabe porque el intento de enviar una solicitud al servidor le devolverá el error.
Otra opción es mantener la escucha en funcionamiento: cuando el cliente detecta problemas de comunicación, intenta volver a conectarse al servidor. El servidor recibe la conexión entrante, verifica si proviene de la misma dirección IP, y si es el caso, cierra la conexión abierta y establece una nueva.
Pero si el cliente no sabe que la conexión se cayó y el servidor necesita enviar algo, no hay forma de que el servidor vuelva a establecer la conexión, sino TCP keepalive.
Si no desea utilizar keepalive, puede usar keepalive a nivel de aplicación, por ejemplo, enviando algo así como mensajes de eco específicos de la aplicación.
Podrías inventar e implementar tu propio keep-alive usando la función fuera de banda de TCP, pero ni siquiera lo consideraría a menos que tengas un problema importante con el que ya está hecho para ti.
Siempre manejé esto a nivel de aplicación extendiendo el protocolo hablado vía TCP entre el cliente y los servidores con "Keep Alive" -Mensajes del servidor y el cliente enviaron este mensaje, por ejemplo, cada segundo y si no tenían "Keep Alive" -Mensaje en 2 segundos , la conexión probablemente esté cerrada.
El mecanismo Keep-Alive de TCP está bien, pero es difícil de usar, especialmente cuando se trabaja en diferentes plataformas.
Otra solución es usar un latido en un socket separado. De esta forma, sabrá casi de inmediato si la conexión no funciona. Esto es útil cuando su conexión principal está enviando datos de transmisión sin límites de mensajes.