2014-02-11 37 views
0

所以我有一个远程设备使用连接到VPS的Lantronics XPort模块。他们建立了TCP连接,一切都很好。服务器确认一切。Linux在ESTABLISHED连接上不响应SYN

在某一点远程设备停止传输数据。 30秒过去。

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

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

  1. 为什么服务器没有按照RFC 793中的图10所述的方式响应ACK? (https://www.ietf.org/rfc/rfc793.txt

  2. 如何让服务器终止连接或用ACK作出响应?

可能出现的情况是,在30秒的静默期间,设备正在等待来自服务器的ACK,并且该ACK已被丢弃。在这种情况下,我认为它应该重发。

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

感谢您的帮助!

回答

0

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

当你没有对客户端的控制和一切所能做的就是在服务器上,你可以试试这个:

配置保持活动只进行一次之后的沉默和探头10秒发送。如果客户端没有响应,服务器关闭连接。通过这样做,服务器应在静默10秒内再次处于监听模式,无需客户端响应。你可以使用下面的sysctl来达到最佳值。

net.ipv4.tcp_keepalive_intvl = 10个

net.ipv4.tcp_keepalive_probes = 1

======

此外,关于失踪-ACK,你在你的问题中提到, TCP负责这些事情。发件人第一次重新发送时间太长,30秒。如果客户端/设备在30秒后没有得到确认,它将会/不应该尝试打开新的连接。如果你看到了这一点,那就是客户端的一个疯狂的TCP堆栈。什么是该设备以及它使用的是哪个OS/TCP堆栈?

+0

谢谢。我在这里错过的部分是保持活动行为不是默认行为。在创建套接字时,您必须使用setsockopt来启用它。 –

相关问题