Linux应用程序不会确认FIN数据包并发生重新传输

时间:2013-11-21 09:36:47

标签: linux windows sockets networking tcp

我有一台运行在linux(内核3.0.35)上的服务器和一台运行在Windows 7上的客户端。每次客户端连接到服务器时都会发生TCP重传: 这是来自wireshark的流量: http://oi39.tinypic.com/ngsnyb.jpg

我认为发生的是:

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

在第二个连接建立的那一刻,我没有收到客户端正在发送的数据(长度为16字节的数据包),我只在RST数据包之后收到这些字节。

在服务器端,我使用poll()函数检查POLLIN事件,在RST数据包到达之前,我没有收到任何数据的通知。

所以有人知道为什么会出现这种情况吗?

1 个答案:

答案 0 :(得分:0)

您的数据字节不会在该52687连接上发送,而是在以下52690连接上发送。我猜服务器应用程序一次只接受一个连接(内核会提前接受它们并且只保留数据),因此在第一个连接断开之前它不会从第二个连接看到数据并继续下一个。

这并不能解释为什么你的FIN没有被确认。这应该。也许内核中有些东西不喜欢open-then-close-with-no-data连接?也许某种攻击缓解?防火墙规则?