2009-05-14 15 views
78

Tengo dos componentes que se comunican a través de TCP/IP. El Componente A actúa como servidor/oyente y el Componente B es el cliente. Los dos deben comunicarse lo más rápido posible. Solo puede haber una conexión en cualquier momento (aunque eso queda aparte de esta pregunta). Un desarrollador sénior de mi empresa ha dicho que necesito utilizar los latidos del corazón de la aplicación entre los dos componentes para garantizar que la conexión permanezca abierta.¿Necesito latir para mantener abierta una conexión TCP?

Pensé que la conexión se mantiene abierta con TCP/IP, pero he leído una serie de blogs/sitios que dicen que es una práctica bastante común para el latido del corazón entre estas aplicaciones.

Conozco parte del componente de razón Un componente de heartbeats B es para que pueda informar al soporte si hay problemas de comunicación con el componente B (o el enlace está inactivo o el componente B no está ejecutándose). ¿Se necesitan latidos cardíacos por cualquier otra razón? ¿Tal como para asegurar que frecuentemente haya algo "en la tubería" para mantenerlo abierto?

Componente A actualiza el componente B cada 20 segundos y cierra la conexión si no se recibe nada del componente B en 120 segundos. A continuación, reanuda la escucha de conexiones bajo la suposición de que el componente B intentará periódicamente una reconexión si el enlace está roto. Esto funciona con éxito.

Para reiterar mi pregunta: ¿Son necesarios los latidos del corazón para mantener viva una conexión TCP/IP?

+1

¿Este comportamiento también podría ser dependiente de la implementación? ¿Es esto algo especificado en el estándar TCP, o se deja como un detalle de implementación? Ojalá alguien más pueda responder eso también. – dss539

+0

Es un detalle de implementación, diría yo, ya que no todos los protocolos basados ​​en TCP/IP implementan, ya que es de su exclusiva responsabilidad. – Lloyd

+3

Sí, no debido a TCP/IP, sino debido a otro hardware o software que su conexión puede atravesar, como cortafuegos y 'enrutadores' que tienden a desconectar las conexiones TCP inactivas, relacionadas con: http://stackoverflow.com/questions/ 3907537/keep-alive-tcp-ip-connected-sockets-over-the-internet-when-how-how-much/5149662 # 5149662 – markmnl

Respuesta

45

La conexión debe permanecerá abierta pero sin tener en sí, es común ver a menudo protocolos implementan un latido del corazón con el fin de ayudar a detectar conexiones inactivas, IRC con el comando PING por ejemplo.

+31

Otra razón común para keepalives es o mantener la conexión abierta a través de gateways nat. Si bien TCP no necesita keepalives para funcionar, es común que las puertas de enlace nativas "desconecten" una conexión de tcp luego de un tiempo de espera determinado. – nos

+2

¿Qué es un tiempo de espera normal? segundos, minutos, horas? – MiniGod

+2

Segundos por lo general. – Lloyd

1

Lo que usted llama un latido del corazón es útil cuando intenta establecer los tiempos de espera. Su zócalo puede aparecer abierto, pero la persona en el otro extremo puede estar sufriendo un BSOD. Una de las maneras más fáciles de detectar clientes/servidores difuntos es establecer un tiempo de espera y asegurarse de que se reciba un mensaje cada cierto tiempo.

Algunas personas los llaman NOOP (No Ops).

Pero no, no son necesarios para mantener la conexión activa, solo es útil saber cuál es el estado.

+1

Creo que FTP tiene específicamente un comando de NOOP también – Lloyd

0

La conexión permanecerá abierta; no es necesario implementar un latido del corazón, y la mayoría de las aplicaciones que usan sockets no lo hacen.

3

¿Son necesarios los latidos del corazón para mantener viva una conexión TCP/IP?

Son útiles para detectar cuando una conexión ha muerto.

10

No necesita enviar latidos del corazón usted mismo. La conexión TCP permanecerá abierta independientemente del uso.

Tenga en cuenta que TCP implementa un mecanismo opcional keepalive, que se puede utilizar para identificar una conexión cerrada de manera oportuna, en lugar de requerir el envío de datos en una fecha posterior y descubrir que la conexión está cerrada.

+0

¿Cómo se supone que debe funcionar en Linux? ¿de hecho funciona? ¿Puedo programar el tiempo de espera para que sea de menos de 2 horas? por ejemplo 30 segundos? –

+0

Para que esto funcione, la aplicación debe admitir keepalive. Simplemente habilitarlo en Linux no será suficiente. –

-2

Muchos protocolos implementan un latido del corazón o un estado de salud como Lloyd dijo. Para que sepa que la conexión todavía está abierta y si se ha perdido algo

1

Yo diría que si no tiene latido, no importa si su conexión TCP/IP está abierta o no.

1

El latido del corazón no es una necesidad para los protocolos TCP. Su implementación está ahí para detectar si el otro lado ha terminado la conexión de forma no estándar (es decir, no ha pasado por el proceso de destrucción).

2

TCP mantendrá la conexión activa. Los latidos de la aplicación son para las consideraciones de nivel de la aplicación, como la migración tras error, el equilibrio de carga o alertar a los administradores sobre posibles problemas.

44

Como muchos otros han notado, la conexión TCP permanecerá activa si se deja en sus propios dispositivos. Sin embargo, si tiene un dispositivo en el medio de la conexión que rastrea su estado (como un firewall), es posible que necesite keepalives para evitar que la entrada de la tabla de estado expire.

+0

¿La conexión TCP dirá viva para siempre? – user7817808

1

TCP/IP como protocolo se especifica como no cerrado hasta que envíe un paquete de cierre. He tenido enchufes que permanecen abiertos incluso después de conexiones inalámbricas o de Internet irregulares.

Sin embargo, todo esto es muy dependiente de las implementaciones. Lo más probable es que haya un "tiempo de espera", que significa la cantidad máxima de tiempo para esperar una respuesta antes de considerar que la conexión está "muerta". A veces, esto se basa en la aplicación en sí, a veces en enrutadores NAT.

Por lo tanto, le recomiendo que mantenga un "latido" para detectar conexiones defectuosas y mantenerlas abiertas.

3

El latido del corazón es una buena manera de decirle al servidor que está vivo, lo que significa que, si el servidor utiliza sistemas de prevención de ataques DoS, (el servidor) puede eliminar todos los recursos asignados para esa conexión en particular, después de que detectó actividad en un período especificado.
No tienen el mandato de implementar ningún mecanismo de latido.

Pero es bueno si está diseñando una aplicación, donde el criterio principal es la capacidad de respuesta. No le gustará perder tiempo en configuraciones de conexión, búsquedas de DNS y descubrimientos de rutas. Simplemente mantiene una conexión activa todo el tiempo, sigue enviando latidos, y la aplicación sabe que la conexión está activa y no se requiere configuración de conexión. Simplemente envíe y reciba.

9

si el uso de ventanas, sean cautelosos sobre el TCP keep-alive. De manera predeterminada, está deshabilitado a menos que lo active globalmente con el registro de Windows o mediante setsockopt.

El intervalo de mantenimiento predeterminado es de 2 horas.

http://msdn.microsoft.com/en-us/library/ms819735.aspx

Es posible que necesite implementar su propio latido del corazón y desactivar TCP keep-alive en las ventanas si el mantenimiento de conexión 2 horas con vida no es deseable.

2

Básicamente, una conexión TCP crea estados de enlace almacenados en conmutadores a lo largo de la ruta. Con el fin de detectar las conexiones rotas (como cuando se estrella contrapartida (sin enviar una desconexión adecuada)), estos estados tienen que ser desalojado después de un período de inactividad. Y cuando esto sucede, su conexión TCP se ha cerrado. Aunque no puedo decir exactamente cuánto duran estos tiempos de espera, parecen depender de los fabricantes de dispositivos y/o de los proveedores de Internet. Recuerdo que mis sesiones inactivas de terminal SSH fueron rápidamente (menos de 15 minutos de inactividad) cerradas por mi antiguo proveedor de Internet 1 & 1 mientras permanecían abiertas durante varias horas cuando usaban una conexión proporcionada por Kabel-BW ...

Finalmente, Concluyo con mis oradores anteriores: un latido del corazón es una buena forma de saber si una conexión todavía está viva y coleando ...

17

Si sus componentes:

  • están en una red cableada convencional
  • no hay cortafuegos o routers NAT entre ellos
  • ninguno de ellos se estrella

entonces no es necesario tener un latido del corazón.

Si cualquiera de estas suposiciones es falsa (¡te estoy mirando a ti, GPRS!), Un latido se vuelve más rápido.

Cuestiones relacionadas