embedded network_error ai_generated partial

lwIP: TCP connection reset by peer during SYN-SENT state, remote port 8080

ID: embedded/lwip-tcp-connection-reset-during-handshake

Also available as: JSON · Markdown · 中文
75%Fix Rate
82%Confidence
1Evidence
2024-08-22First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
lwIP 2.1.3 active
FreeRTOS+TCP 2.0.0 active
ESP-IDF 5.1.2 active

Root Cause

Remote host sends RST packet during TCP handshake due to firewall rules, port closed, or mismatched TCP window scale options.

generic

中文

远程主机在 TCP 握手期间发送 RST 包,原因包括防火墙规则、端口关闭或 TCP 窗口缩放选项不匹配。

Official Documentation

https://www.nongnu.org/lwip/2_1_x/tcp.html

Workarounds

  1. 85% success Verify remote port is open using a separate tool (e.g., telnet or nmap from host PC). If port is closed, reconfigure server or firewall rules. For embedded device, add retry logic with exponential backoff in application code.
    Verify remote port is open using a separate tool (e.g., telnet or nmap from host PC). If port is closed, reconfigure server or firewall rules. For embedded device, add retry logic with exponential backoff in application code.
  2. 70% success Enable lwIP debug output for TCP events: set LWIP_DBG_ON in lwipopts.h and call tcp_debug_print(TCP_EVENT_CONNECT) to capture RST packet details, then adjust TCP_MSS or TCP_SND_BUF to match server expectations.
    Enable lwIP debug output for TCP events: set LWIP_DBG_ON in lwipopts.h and call tcp_debug_print(TCP_EVENT_CONNECT) to capture RST packet details, then adjust TCP_MSS or TCP_SND_BUF to match server expectations.

中文步骤

  1. Verify remote port is open using a separate tool (e.g., telnet or nmap from host PC). If port is closed, reconfigure server or firewall rules. For embedded device, add retry logic with exponential backoff in application code.
  2. Enable lwIP debug output for TCP events: set LWIP_DBG_ON in lwipopts.h and call tcp_debug_print(TCP_EVENT_CONNECT) to capture RST packet details, then adjust TCP_MSS or TCP_SND_BUF to match server expectations.

Dead Ends

Common approaches that don't work:

  1. Increase TCP SYN timeout in lwIPopts.h (e.g., TCP_SYNMAXRTX = 12) 90% fail

    Timeout increase does not prevent RST; RST is sent by remote host immediately, not a local timeout issue.

  2. Disable TCP window scaling by setting TCP_WND to small value 75% fail

    Window scaling mismatch is rarely the cause; disabling it may degrade performance without fixing the RST.