我遇到了一个我无法解决的networking问题。 在几台运行Windows 8.1的计算机上,并与Windows的HTTP服务器TCP连接进行通信,而不是正确closures。
在响应之后[分成less数,由windows确认,tcp数据包] linux server – 10.14.11.59 – 发送一个包含FIN和ACK标志集的tcp数据包。 
这是窗口机器确认 – 10.14.10.195 – 数据包只有ACK标志设置。 
linux几次重新发送FIN和ACK标志的数据包,而Windows机器 – 由于某种原因,仍然保持连接打开; 带有RST标志的数据包永远不会被Windows机器发送。 
如果发生这种情况,Windows应用程序将等待并最终超时。 这发生在10-50%的尝试之间。
两台机器之间的stream量未经过滤; 基于主机的防火墙closures了。 以避免潜在的问题,我已经禁用TCP卸载在Linux和Windows。 另外在Windows上运行以下代码并重启机器:
netsh int tcp set global chimney=disabled netsh int tcp set global autotuninglevel=disabled netsh int tcp set global rss=disabled
数据包捕获: 在这里 。
任何想法将不胜感激!
我们发现在客户端机器上运行的eset端点安全是罪魁祸首。
禁用防火墙function是不够的; 但卸载完全解决了这个问题。
我的同事在这里发现了类似的问题的描述; 显然升级到最新版本的eset也解决了这个问题。
我假设您的tcpdump中的第一个段在客户端之前有一个FIN 。
我相信这是正确的客户端行为,正如原始RFC的ASCII图所示
closures的客户端在收到来自服务器的FIN,ACK ,套接字从FIN-WAIT1转换到TIME-WAIT并保持这种状态2倍于networking中的最大段寿命,此时它发送FIN返回closures连接。
Windows将使用registry值名称TcpTimedWaitDelay覆盖TIME-WAIT持续时间,最初使用默认值240秒(MSL默认值为120秒)实现。 在Windows XP / Server 2003及更高版本中,默认值降低到120秒。
我相信你可以在服务器响应的时候closures服务器上的底层套接字来解决这个问题,但是一定要阅读这个答案 ,大概是相同的问题,但是从服务器的angular度来看