ECONNRESET: el error que cierra conexiones TCP abruptamente

Fuentes: The occasional ECONNRESET (part 1/2)
ECONNRESET: el error que cierra conexiones TCP abruptamente
Imagen generada con IA

El artículo explica el error ECONNRESET (Connection reset by peer), un problema común en comunicaciones TCP que ocurre cuando un extremo de la conexión cierra el socket de manera abrupta. El autor presenta un caso detallado: dos servicios en la misma máquina, donde el servidor envía 600.000 bytes al cliente y, en determinadas condiciones, el cliente recibe este error en lugar de completar la lectura correctamente. El problema surge específicamente cuando el cliente envía datos al servidor antes de intentar recibir (flag --spam), lo que altera el comportamiento del cierre del socket. El análisis con strace revela que el servidor usa sendto() para enviar los datos y luego close() inmediatamente, pero si quedan datos pendientes en el buffer de lectura del servidor, TCP genera un RST (reset) en lugar de un FIN orderly. Este comportamiento se debe al mecanismo interno de TCP: cuando se cierra un socket con datos sin leer, el protocolo envía un reset para informar al otro extremo que no todos los datos fueron procesados. El autor también documenta un caso real en producción con Gunicorn sirviendo una aplicación Flask detrás de Nginx como proxy reverso. Ocasionalmente, Nginx recibía ECONNRESET de Gunicorn porque la aplicación no leía el cuerpo completo de las solicitudes HTTP antes de responder y cerrar el socket. La solución temporal fue realizar una operación ficticia sobre el cuerpo de la petición para forzar su lectura completa. Este es un problema sutil pero importante en sistemas distribuidos, ya que puede causar fallos intermitentes difíciles de diagnosticar si no se comprende cómo TCP gestiona el cierre de conexiones con buffers pendientes.