¿Necesito latir para mantener abierta una conexión TCP?

94

Tengo dos componentes que se comunican a través de TCP / IP. El componente A actúa como servidor / escucha 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 es aparte de esta pregunta). Un desarrollador senior de mi empresa ha dicho que necesito usar latidos de nivel de aplicación entre los dos componentes para asegurar que la conexión permanezca abierta.

Pensé que la conexión permanece abierta con TCP / IP, pero he leído varios blogs / sitios que dicen que es una práctica bastante estándar latir entre estas aplicaciones.

Sé que parte de la razón por la que el componente A late al componente B es para que pueda informar al soporte si hay problemas de comunicación con el componente B (el enlace está inactivo o el componente B no se está ejecutando). ¿Se necesitan los latidos del corazón por alguna otra razón? ¿Como para asegurarse de que con frecuencia hay algo "en la tubería" para mantenerla abierta?

El componente A actualmente late el componente B cada 20 segundos y cierra la conexión si no se recibe nada del componente B en 120 segundos. Luego reanuda la escucha de conexiones bajo el supuesto de que el componente B intentará periódicamente una reconexión si el enlace está roto. Esto funciona satisfactoriamente.

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

Rob Gray
fuente
1
¿Podría este comportamiento depender también 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
1
Es un detalle de implementación, diría yo, ya que no todos los protocolos basados ​​en TCP / IP implementan, por lo que queda totalmente en sus manos.
Lloyd
5
Sí, no debido a TCP / IP, pero debido a otro hardware o software por el que puede pasar la conexión, como firewalls y 'enrutadores' domésticos que tienden a eliminar las conexiones TCP inactivas, relacionado: stackoverflow.com/questions/3907537/…
markmnl

Respuestas:

54

La conexión debe permanecer abierta independientemente, pero sí, a menudo es común ver que los protocolos implementan un latido para ayudar a detectar conexiones muertas, IRC con el comando PING, por ejemplo.

Lloyd
fuente
34
Otra razón común para keepalives es mantener la conexión abierta a través de puertas de enlace nat. Si bien TCP en sí no necesita keepalives para funcionar, es común que las puertas de enlace nat "caigan" una conexión tcp después de un tiempo de espera determinado.
nos
4
¿Qué es un tiempo de espera normal? segundos, minutos, horas?
MiniGod
@Lloyd "Creo que" MiniGod quiso decir, "¿Cuánto tiempo sería un tiempo de espera normal ?" (la respuesta se da en segundos, minutos, horas,…)
jeromej
@JeromeJ Quién sabe, han pasado algunos años;)
Lloyd
Además, si su conexión pasa por un proxy, puede esperar que se interrumpa si se considera obsoleta. Sin embargo, no creo que mantener vivo ayude en este caso, porque este aspecto de tcp no se propaga a la aplicación.
Ghita
49

Como muchos otros han señalado, la conexión TCP se mantendrá activa si se deja en sus propios dispositivos. Sin embargo, si tiene un dispositivo en 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.

Gerald Combs
fuente
¿La conexión TCP dirá viva para siempre?
user7817808
22

Si sus componentes:

  • están en una red cableada convencional
  • no hay firewalls ni enrutadores NAT entre ellos
  • ninguno de ellos choca

entonces no necesita tener latidos.

Si alguna de estas suposiciones es falsa (¡te estoy mirando, GPRS!), Un latido se vuelve necesario con bastante rapidez.

Eero Aaltonen
fuente
1
Sin embargo, esto es trabajo en red en general. Considere las falacias de la informática distribuida de Peter Deutsch; sabemos que las redes son inherentemente poco confiables y, por lo tanto, deben tratarse como un punto casi seguro de falla en su aplicación. En este contexto, con una red cableada convencional o no, asuma que experimentará fallas en algún momento y diseñe su aplicación para manejar ese escenario.
Steven Bakhtiari
11

No es necesario que usted mismo envíe los latidos del corazón. La conexión TCP permanecerá abierta independientemente del uso.

Tenga en cuenta que TCP implementa un mecanismo keepalive opcional , que puede usarse para identificar una conexión cerrada de manera oportuna, en lugar de solicitarle que envíe datos en una fecha posterior y solo entonces descubra que la conexión está cerrada.

Brian Agnew
fuente
1
¿Cómo se supone que funciona en linux? ¿De hecho funciona? ¿Puedo programar el tiempo de espera para que sea inferior a 2 horas? por ejemplo, 30 segundos?
Itay Levin
Para que esto funcione, la aplicación debe ser compatible con keepalive. Solo habilitarlo en Linux no será suficiente.
Mike Vella
9

Si usa Windows, tenga cuidado con TCP Keep-Alive. De forma predeterminada, está deshabilitado a menos que lo encienda globalmente con el registro de Windows o mediante setsockopt.

El intervalo de tiempo de vida predeterminado es de 2 horas.

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

Es posible que deba implementar su propio latido del corazón y deshabilitar el mantenimiento de vida de TCP en Windows si no desea mantener vivo de 2 horas.

Andrew Keith
fuente
3

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

Son útiles para detectar cuándo se ha interrumpido una conexión.

ChrisW
fuente
3

TCP mantendrá viva la conexión. Los latidos de la aplicación se deben a consideraciones de nivel de aplicación, como la conmutación por error, el equilibrio de carga o la alerta a los administradores sobre problemas potenciales.

Pato
fuente
3

El latido del corazón es una buena manera de decirle al servidor que está vivo, por lo que me refiero a que, si el servidor está utilizando 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 haya detectado en actividad durante un período específico.
No tienen mandato para implementar ningún mecanismo de latidos.

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

Vivek Sharma
fuente
2

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

Sin embargo, todo esto depende mucho 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 propia aplicación, a veces en enrutadores NAT.

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

Desconocido
fuente
2

Básicamente, una conexión TCP crea estados de enlace almacenados en conmutadores a lo largo de la ruta. Para detectar conexiones rotas (como cuando una contraparte falla (sin enviar una desconexión adecuada)), estos estados deben ser desalojados 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 productores del dispositivo y / o de los proveedores de Internet. Recuerdo que mis sesiones de terminal SSH inactivas fueron cerradas rápidamente (menos de 15 minutos de tiempo inactivo) 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 manera de saber si una conexión sigue viva y coleando ...

Auxilio
fuente
1

Lo que llama un latido es útil cuando se intenta establecer tiempos de espera. Su enchufe puede parecer abierto, pero la persona en el otro extremo puede estar sufriendo un BSOD. Una de las formas más fáciles de detectar clientes / servidores inactivos es establecer un tiempo de espera y asegurarse de que se reciba un mensaje de vez en cuando.

Algunas personas los llaman NOOP (No Ops).

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

Kekoa
fuente
1

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

D. Patrick
fuente
1

Heartbeat 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 una manera no estándar (es decir, no ha pasado por el proceso de desmontaje).

Estrella oscura1
fuente
0

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


fuente
-2

Muchos protocolos implementan un latido del corazón o un tipo de estado de salud como dijo Lloyd. Solo para que sepa que la conexión aún está abierta y si es posible que se haya perdido algo

ist_lion
fuente