TCP接收数据包,但忽略它们

我有一个非常奇怪的networking问题。 实际的networkingconfiguration相当复杂,因为我使用Openstack和Docker来构build虚拟networking。 然而,问题不在这里,因为我正在捕获我的主机接口,并以正确的方式看到所有的数据包….但由于某些原因,我不知道,似乎TCP忽略了它们,尽pipe它们有已收到:它不会发送ACK,并且不会将数据发送到应用程序。

在我的试验中,我从主机(192.168.4.100)向服务器jetty(IP 192.168.4.3)发送了一个HTML页面的HTTP GET请求。

我看到用Wireshark在192.168.4.100上捕获的是:

192.168.4.100 -> SYN -> 192.168.4.3 192.168.4.3 -> SYN, ACK -> 192.168.4.100 192.168.4.100 -> ACK -> 192.168.4.3 192.168.4.100 -> GET / HTTP/1.1 -> 192.168.4.3 192.168.4.3 -> ACK -> 192.168.4.100 192.168.4.3 -> Fragment 1 of HTTP 200 OK response -> 192.168.4.100 192.168.4.3 -> Fragment 2 of HTTP 200 OK response -> 192.168.4.100 192.168.4.3 -> Fragment 3 of HTTP 200 OK response (PSH) -> 192.168.4.100 192.168.4.3 -> Retransmission of Fragment 3 of HTTP 200 OK response (PSH) -> 192.168.4.100 192.168.4.3 -> Retransmission of Fragment 1 of HTTP 200 OK response -> 192.168.4.100 192.168.4.3 -> Retransmission of Fragment 1 of HTTP 200 OK response -> 192.168.4.100 192.168.4.3 -> Retransmission of Fragment 1 of HTTP 200 OK response -> 192.168.4.100 192.168.4.3 -> Retransmission of Fragment 1 of HTTP 200 OK response -> 192.168.4.100 192.168.4.3 -> Retransmission of Fragment 1 of HTTP 200 OK response -> 192.168.4.100 192.168.4.3 -> Retransmission of Fragment 1 of HTTP 200 OK response -> 192.168.4.100 192.168.4.100 -> ACK of Fragment 1 -> 192.168.4.3 192.168.4.3 -> Retransmission of Fragment 2 of HTTP 200 OK response -> 192.168.4.100 192.168.4.3 -> Retransmission of Fragment 3 of HTTP 200 OK response (PSH) -> 192.168.4.100 192.168.4.3 -> Retransmission of Fragment 2 of HTTP 200 OK response -> 192.168.4.100 192.168.4.3 -> Retransmission of Fragment 2 of HTTP 200 OK response -> 192.168.4.100 192.168.4.3 -> Retransmission of Fragment 2 of HTTP 200 OK response -> 192.168.4.100 192.168.4.3 -> Retransmission of Fragment 2 of HTTP 200 OK response -> 192.168.4.100 192.168.4.3 -> Retransmission of Fragment 2 of HTTP 200 OK response -> 192.168.4.100 192.168.4.3 -> Retransmission of Fragment 2 of HTTP 200 OK response -> 192.168.4.100 192.168.4.100 -> ACK of Fragment 2 -> 192.168.4.3 192.168.4.3 -> Retransmission of Fragment 3 of HTTP 200 OK response (PSH) -> 192.168.4.100 192.168.4.3 -> Retransmission of Fragment 3 of HTTP 200 OK response (PSH) -> 192.168.4.100 192.168.4.3 -> Retransmission of Fragment 3 of HTTP 200 OK response (PSH) -> 192.168.4.100 192.168.4.3 -> Retransmission of Fragment 3 of HTTP 200 OK response (PSH) -> 192.168.4.100 192.168.4.3 -> Retransmission of Fragment 3 of HTTP 200 OK response (PSH) -> 192.168.4.100 192.168.4.3 -> Retransmission of Fragment 3 of HTTP 200 OK response (PSH) -> 192.168.4.100 192.168.4.100 -> ACK of Fragment 3 -> 192.168.4.3 

这实际上是一个很大的问题,因为GET请求和最后一个ACK之间有大约40秒的时间,这与应用程序(本例中是telnet)获取数据的时刻一致。

我已经检查了所有的校验和,他们是正确的…

所以我其实不知道为什么会发生这种情况,该怎么办! 我曾尝试用不同的操作系统作为主机(Windows 8手机,MAC OSX,Ubuntu 14.04,…),但没有任何变化。 如果我从虚拟networking的另一个泊坞窗发送相同的请求,一切工作正常。

任何想法可能是什么问题?

谢谢!

PS在这里你可以看到截图的截图:

在这里输入图像说明

更新

有一件事我觉得很有意思,那就是我做了一个类似的捕获,但是当一个HTTP请求从192.168.4.3发送到192.168.4.100。 在192.168.4.100接口上再次捕获捕获,似乎192.168.4.100又忽略了它接收到的数据包(例如,看三次握手)。 我发现没有理由再次。

在这里输入图像说明

我设法解决了我的问题。 我在这里发布解决scheme,如果有人有我的同样的问题可以是有用的。

问题是我禁用了Docker连接的虚拟网桥上的TSO(tcp-segmentation-offload):

 ethtool -K IFACE_NAME tso off 

它仅closuresTSO,而校验和卸载保持打开状态。 显然,这会产生一些问题,尽pipeWireshark向我展示了TCP校验和是确定的,但实际上并不是这样。 所以主机由于错误的TCP校验和而忽略了数据包。

为了closuresTSO和校验和,我只是使用了这个命令:

 ethtool --offload IFACE_NAME rx off tx off 

现在一切正常。