Tcp Linux没有';在已建立的连接上不响应SYN

Tcp Linux没有';在已建立的连接上不响应SYN,tcp,linux-kernel,Tcp,Linux Kernel,所以我有一个远程设备,使用Lantronics XPort模块连接到VPS。他们建立了TCP连接,一切都很好。服务器会确认所有内容 在某个时刻,远程设备停止传输数据。30秒过去了 然后,设备开始发送SYN数据包,就像试图建立新连接一样。设备配置为保持与服务器的连接,并且始终使用相同的源端口。(我意识到这很糟糕,但我很难改变) 服务器看到来自同一个(源ip、源端口)的SYN数据包,因此服务器认为连接已建立。服务器不响应SYN数据包 为什么服务器不响应RFC 793中图10所示的ACK?() 如何让

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

在某个时刻,远程设备停止传输数据。30秒过去了

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

服务器看到来自同一个(源ip、源端口)的SYN数据包,因此服务器认为连接已建立。服务器不响应SYN数据包

  • 为什么服务器不响应RFC 793中图10所示的ACK?()

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

  • 可能是这样的,在30秒的静默期间,设备正在等待来自服务器的ACK,并且ACK被丢弃在线路的某个地方。在这种情况下,我认为它应该重新传输

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


    谢谢你的帮助

    我的第一个建议是将客户端更改为使用相同的连接,或者在重新打开之前优雅地关闭连接

    由于您无法控制客户端,只能在服务器上进行操作,所以可以尝试以下方法:

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

    net.ipv4.tcp\u keepalive\u intvl=10

    net.ipv4.tcp_keepalive_probe=1

    ======


    另外,关于您在问题中提到的缺少ack,TCP会处理这些事情。30秒对于发送方的第一次重新传输来说太长。如果客户端/设备在30秒后未收到ack,则它将/不应尝试打开新连接。如果您看到了这一点,那么它在客户端是一个疯狂的TCP堆栈。该设备是什么?它使用的是哪个OS/TCP堆栈

    如果内核版本有不同的行为,请忽略内核3.12.9-x86_64中的任何syn数据包。但是服务器确认一个ack数据包,客户端接收ack重新发送rst,并在内核4.9.0中发送新的syn。


    谢谢。我在这里遗漏的部分是,keep-alive行为不是默认行为。在创建套接字时,必须使用setsockopt来启用它。