Estoy tratando de averiguar por qué la conexión TCP / IP de mi aplicación sigue fallando cada 10 minutos (exactamente, en 1-2 segundos). Ejecuté Wireshark y descubrí que después de 10 minutos de inactividad, el otro extremo está enviando un paquete con el indicador de reinicio (RST) configurado. Una búsqueda en Google me dice que "la bandera RESET significa que el receptor se ha confundido y, por lo tanto, quiere cancelar la conexión", pero eso es un poco menos que el detalle que necesito. ¿Qué podría estar causando esto? ¿Y es posible que algún enrutador en el camino sea responsable de ello o esto siempre vendría del otro punto final?
Editar: Hay un enrutador (específicamente un Linksys WRT-54G) entre mi computadora y el otro punto final.¿Hay algo que deba buscar en la configuración del enrutador?
fuente
Respuestas:
Un 'enrutador' podría estar haciendo cualquier cosa, particularmente NAT, que podría involucrar cualquier cantidad de errores en el tráfico ...
Una razón por la que un dispositivo enviará un RST es en respuesta a recibir un paquete para un socket cerrado.
Es difícil dar una respuesta firme pero general, porque todas las posibles perversiones han sido visitadas en TCP desde sus inicios, y todo tipo de personas podrían estar insertando RST en un intento de bloquear el tráfico. (Algunos 'firewalls nacionales' funcionan así, por ejemplo).
fuente
Ejecute un rastreador de paquetes (por ejemplo, Wireshark) también en el par para ver si es el par quien envía el RST o alguien en el medio.
fuente
Acabo de pasar bastante tiempo solucionando este mismo problema. Ninguna de las soluciones propuestas funcionó. Resultó que nuestro administrador de sistemas asignó por error la misma IP estática a dos servidores no relacionados que pertenecen a diferentes grupos, pero que se encuentran en la misma red. Los resultados finales fueron conexiones vnc interrumpidas de forma intermitente, navegador que tuvo que actualizarse varias veces para recuperar la página web y otras cosas extrañas.
fuente
Algunos cortafuegos hacen eso si una conexión está inactiva durante x minutos. Algunos ISP configuran sus enrutadores para hacerlo también por varias razones.
En esta época, deberá manejar con elegancia (restablecer según sea necesario) esa condición.
fuente
RST es enviado por el lado que realiza el cierre activo porque es el lado que envía el último ACK. Entonces, si recibe FIN del lado que realiza el cierre pasivo en un estado incorrecto, envía un paquete RST que indica al otro lado que ha ocurrido un error.
fuente
Si hay un enrutador que hace NAT, especialmente un enrutador de gama baja con pocos recursos, envejecerá primero las sesiones TCP más antiguas. Para hacer esto, establece la
RST
bandera en el paquete que efectivamente le dice a la estación receptora que cierre la conexión (de manera muy poco elegante). esto se hace para ahorrar recursos.fuente
Una cosa a tener en cuenta es que muchos firewalls netfilter de Linux están mal configurados.
Si tienes algo como:
-A FORWARD -m estado --state RELACIONADO, ESTABLECIDO -j ACEPTAR
-A ADELANTE -p tcp -j REJECT --reject-with tcp-reset
luego, el reordenamiento de paquetes puede hacer que el cortafuegos considere que los paquetes no son válidos y, por lo tanto, genere reinicios que romperán las conexiones que de otro modo serían saludables.
El reordenamiento es particularmente probable con una red inalámbrica.
En cambio, esto debería ser:
-A FORWARD -m estado --state RELACIONADO, ESTABLECIDO -j ACEPTAR
-A FORWARD -m estado --state INVALID -j DROP
-A ADELANTE -p tcp -j REJECT --reject-with tcp-reset
Básicamente en cualquier momento que tenga:
... -m estado --estado RELACIONADO, ESTABLECIDO -j ACEPTAR
debe ser seguido inmediatamente por:
... -m estado --state INVALID -j DROP
Es mejor eliminar un paquete y luego generar un protocolo que pueda interrumpir el restablecimiento de tcp. Los restablecimientos son mejores cuando se demuestra que son lo correcto para enviar ... ya que esto elimina los tiempos de espera. Pero si existe la posibilidad de que no sean válidos, pueden causar este tipo de dolor.
fuente
Esto se debe a que hay otro proceso en la red que envía RST a su conexión TCP.
Normalmente, RST se enviaría en el siguiente caso
En su caso, parece que un proceso está conectando su conexión (puerto IP +) y sigue enviando RST después de establecer la conexión.
fuente