如何debuggingTCP数据包中失败的校验和/翻转位?

我们最近维护的Web应用程序遇到了一个非常奇怪的问题:两台物理主机上的四台虚拟机中有三台通过HTTPS连接到我们的支付提供商的服务器。 debugging这个问题让我对OSI堆栈进行了一次有趣的介绍:

  1. 在应用程序级别,HTTPS请求看起来像是超时了。
  2. 使用openssl s_client ,我发现SSL握手失败
  3. 使用tcpdump转储stream量并使用Wireshark检查stream量,我注意到对于失败的握手,初始SYN / ACK之后来自服务器的所有数据包都有无效的TCP校验和。 比较数据包的内容和成功的握手,我发现至less有一位被翻转了。 然后服务器尝试重新传输数据包(再次使用无效校验和)并在60秒后closures连接。

我们的支付提供商和我们的托pipe公司都没有很好的诊断这个问题。 幸运的是,几个小时后问题就消失了。

然而,这个“解决scheme”让我非常不高兴。 我想知道:

  1. 这种行为有什么可能的原因?
  2. 如果将来再次出现这个问题怎么能够被诊断呢?

虚拟机在KVM上运行Debian 7。