尽管收到了 ACK,TCP 连接仍停留在 SYN_RECV 状态,Linux 2.6.18,嵌入式,ARM

尽管收到了 ACK,TCP 连接仍停留在 SYN_RECV 状态,Linux 2.6.18,嵌入式,ARM

出现一些网络故障后,我的客户端无法连接到我的协议端口(TCP),即使所有其他协议(telnet/HTTP/FTP)都正常工作。

netstat 显示我的服务器正在监听,服务器上的 tcpdump 显示所有 3 个数据包都已交换:

18:29:16.578964 IP 10.9.59.10.3355 > 10.9.43.131.5084:S 2602965897:2602965897(0)win 65535 <mss 1460,nop,nop,sackOK>

18:29:16.579107 IP 10.9.43.131.5084 > 10.9.59.10.3355:S 3464857909:3464857909(0)ack 2602965898 win 5840 <mss 1460,nop,nop,sackOK>

18:29:16.579284 IP 10.9.59.10.3355 > 10.9.43.131.5084:.确认 1 获胜 65535

但不知何故,netstat -t 显示连接仍处于 SYN_RECV 状态,好像 TCP 状态机未看到确认。我必须重新启动服务器才能使其正常工作。

syncookie 未启用,并且我从客户端代码行为和 tcpdump 中知道没有 SYN 泛洪。

非常感谢您的帮助。

答案1

连接处于SYN_RECV状态,因为内核已经收到了处于LISTENING模式的端口的SYN数据包,但是另一端没有回复ACK。

通过在服务器上运行捕获来检查服务器是否收到了 ACK。捕获是在客户端还是在服务器上进行的?

答案2

如果侦听器在套接字上设置了 DEFER_ACCEPT 选项并且尚未准备好接受连接,则可能会发生这种情况。

相关内容