¿Por qué no más TCP mantiene vivo el envío de la sonda después de enviar algunos datos a Send-Q?

tcp_keepalive_time
el intervalo entre el último paquete de datos enviado (los ACK simples no se consideran datos) y la primera sonda keepalive; después de que la conexión esté marcada para necesitar keepalive, este contador ya no se usa.

De acuerdo con esto, significa que los paquetes de mantener vivo no se envían cuando se envían datos repetidamente (incluso si el cliente no está disponible).
Suponiendo la situación en la que su cliente se pierde y el servidor no tiene datos para enviar, el servidor después de 60 segundos desde la hora de envío del último paquete de datos (keepalive_time) envía un paquete de mantener vivo, y luego continúa enviando sondas de mantener vivo hasta los no_of_probes se completan, luego se llega a saber que el cliente está perdido.

En su caso, el servidor tiene datos e intenta enviar. Por lo tanto, no se generarán paquetes de mantener vivo hasta que el servidor deje de enviar datos. El servidor aquí envía 10 veces y se da por vencido, concluyendo que el cliente está caído. No es importante mantener vivo el hecho de saber que el cliente está inactivo, sino la no recepción de Ack para los paquetes enviados desde el servidor.

Ref: Uso de TCP keepalive en Linux

La variable relevante que controla el número de reintentos para datos pendientes es net.ipv4.tcp.retries2, que se establece en 15 (el valor predeterminado) en su configuración. Usando el algoritmo de retroceso exponencial, cada retransmisión (hasta 15) espera más y más. Una configuración de 15 mantendrá la conexión en modo ESTABLECIDO durante aproximadamente 15-30 minutos, dependiendo del RTT promedio antes de que su dispositivo móvil entre en modo avión.

No ve las sondas KEEP_ALIVE porque solo se usan cuando no hay datos en espera de ser transmitidos. Como hay datos en la cola, se utiliza el algoritmo de retransmisión de datos.

Puede reducir el número para obtener desconexiones más rápidas con el riesgo correspondiente de perder una conexión válida si la red se vuelve lenta.

Si la aplicación móvil se ejecuta en Android, la aplicación puede detectar cuándo el modo avión está habilitado / deshabilitado al escuchar android.intent.action.AIRPLANE_MODE
intención de transmisión. No puede enviar nada en ese punto, pero podría saber cuándo restablecer la conexión cuando finalice el modo avión, o podría salir con gracia cuando comience el modo avión.

Mientras los datos fluyan, no es necesario que el keepalive active y envíe paquetes para determinar el estado de la conexión porque es evidente que la conexión está establecida.

Keepalive se activará después de que el flujo de datos se detenga por un tiempo, este valor es configurable en el servidor. No estoy seguro de qué temporizador realmente controla eso.

En su número de reintentos, está controlado por

/ proc / sys / net / ipv4 / tcp_retries1
/ proc / sys / net / ipv4 / tcp_retries2

Lea sobre estos para obtener más información.

Si desea cerrar la conexión, debe hacerlo desde el lado del cliente, ya que tiene información de que la red se está cayendo.