2013-11-21 20 views
0

我有一台服务器上运行Linux(内核3.0.35),并在Windows 7上运行的客户端每次客户端连接到TCP重发发生在该服务器: 这里是Wireshark的交通: http://oi39.tinypic.com/ngsnyb.jpgLinux应用程序不响应FIN数据包重传时

我觉得情况是这样的:

客户端(192.168.1.100)连接到服务器(192.168.1.103),连接成功。在某些时候客户端决定关闭连接(FIN,ACK),服务器不会确认FIN。 然后客户端启动一个新的连接,该连接是ACK,并且是成功的。与此同时,Windows内核继续重新发送FIN,ACK数据包,并最终决定进行重置。

在第二连接被建立我没有收到客户端所发送的数据在服务器侧(16个字节长度的数据包)的那一刻,我只RST分组后收到这些字节。

在我使用的民意调查()函数来检查POLLIN事件的服务器端,并直到RST包到达我没有通知的任何数据。

因此,有谁知道为什么会发生这种情况?

+0

所以...的结果是,服务器堆栈不处理来自客户端的关闭请求以合规的TCP时尚? –

+0

问题是,在我的服务器应用程序中,我收不到客户端发送的16个字节,直到我收到RST数据包,这是一个很长的时间。 – Diurpaneus

回答

0

你的数据字节不发送对52687连接,而是以下52690连接。我猜测服务器应用程序一次只接受一个连接(内核将提前接受它们并仅保存数据),因此在第一个连接失效前不会看到来自第二个连接的数据,并且它将继续下一个。

这并不能解释为什么你的FIN没有被ACK'd。这应该。也许内核中有些东西不喜欢开放,然后关闭无数据连接?也许某种攻击缓解?防火墙规则?

+0

感谢您在正确的路径上引导我,它实际上是导致FIN不被确认的防火墙。我禁用了防火墙,连接没有问题。 – Diurpaneus

相关问题