简而言之: 服务器成功调用:: send(),但数据没有在电缆上传出。客户端在几秒钟后发送其退出命令,因为它没有收到任何内容,并且服务器正确接收了该命令。
详情: 服务器每1/10秒向其客户端发送一个命令,每秒钟发送一次心跳。客户端只返回心跳的确认。我们修改了服务器应用程序以记录发送和接收的每个命令,我们用Wireshark记录了pc的流量。我们可以将每个记录的命令与TCP数据包匹配,直到问题出现。问题一次只影响一个客户端。数据继续与其他客户端正常流动。在遇到麻烦之前,连接通常会工作几分钟。连接应该从客户端启动到关闭(即几天)的那一刻起作用。
发生问题时,日志文件包含预期的命令,但Wireshark转储不包含任何内容。下图显示了一个客户端的流量。红线是交通停止时,但服务器继续成功调用:: send()。 大约4秒后,客户端超时并关闭连接。它发送一个quit命令,服务器正常接收它。
更令我困惑的是,包含quit命令的数据包未通过TCP ACK数据包进行确认。好像TCP连接在发送端完全卡住了。重传是这种阻塞的结果,但即使TCP SYN建立新连接也没有得到正确处理,也没有得到简单的TCP ACK。
大约30秒后,问题消失,最终接受SYN数据包,并继续与新连接进行通信。
这是在各种Windows版本上测试的。在测试期间,使用了远程桌面会话,它从未因同一问题而断开连接。它保持连接数小时没有任何问题。当客户端通过无线网桥时,问题更加频繁。我们在无线端点的两侧使用Wireshark,我们看不到可以解释更高断开率的重传或丢包。
当许多客户端连接到同一个网桥时,它们不会同时发生故障。一次只有一个。所以无线噪音似乎并不是一个解释。我们可以在Wireshark转储中看到一些重传,但通信继续照常进行,并且在问题发生之前没有重传。接入点连接到服务器的交换机。客户端PC和服务器pc不使用无线网卡。
很长一段时间,我们很难偶尔断线是由网络造成的,但是越来越多的安装都是无线的,现在连接断开频繁,导致用户出现问题。
我们尝试使用和不启用Windows防火墙。即使禁用防火墙,我们也添加了端口例外。客户端或服务器都没有防病毒软件。