Linux不响应ESTABLISHED连接上的SYN

时间:2014-02-11 22:24:21

标签: tcp linux-kernel

所以我有一台使用Lantronics XPort模块连接到VPS的远程设备。他们建立了TCP连接,一切都很棒。服务器确认一切。

远程设备在某些时候停止传输数据。 30秒过去了。

然后,设备开始发送SYN数据包,就像尝试建立新连接一样。设备配置为维护与服务器的连接,并始终使用相同的源端口。 (我意识到这很糟糕,但我很难改变)

服务器看到来自相同的源数据包(源IP,源端口),因此服务器认为连接是ESTABLISHED。服务器不响应SYN数据包。

  1. 为什么服务器没有响应ACK,如RFC 793中的图10所示? (https://www.ietf.org/rfc/rfc793.txt

  2. 如何让服务器终止连接或使用ACK进行响应?

  3. 可能是在30秒静音期间,设备正在等待来自服务器的ACK,并且该ACK在该线的某处被丢弃。在这种情况下,我认为它应该重新发送。

    服务器运行Ubuntu,内核为3.12.9-x86_64-linode37

    感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我的第一个建议是更改客户端以使用相同的连接或在重新打开之前正常关闭连接。

由于您无法控制客户端,所有可以执行的操作都在服务器上,您可以尝试:

配置keep-alive在10秒静默后发送,仅探测一次。如果客户端没有响应,服务器将关闭连接。通过这样做,服务器应该在沉默10秒内再次处于监听模式,而无需客户端响应。您可以使用以下sysctl并获得最佳值。

net.ipv4.tcp_keepalive_intvl = 10

net.ipv4.tcp_keepalive_probes = 1

==

另外,关于你在问题中提到的缺失ack,TCP会处理这些事情。从发送方首次重新传输30秒的时间太长。如果客户端/设备在30秒后没有获得确认,它将/不应该尝试打开新连接。如果你看到它,它是客户端的疯狂TCP堆栈。该设备是什么以及它使用的OS / TCP堆栈是什么?

答案 1 :(得分:0)

它是内核版本,具有不同的行为,请忽略内核3.12.9-x86_64中的任何syn数据包。但是服务器会确认一个ack数据包,客户端会首先收到ack确认消息,然后在内核4.9.0中发送新的syn。 incoming-tcp-syns-possibilities

TCP packets ignored on ESTABLISHED connection