出现一些网络故障后,我的客户端无法连接到我的协议端口(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 选项并且尚未准备好接受连接,则可能会发生这种情况。