2014-11-03 97 views
5

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

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

我看到捕捉上192.168.4.100使用Wireshark的是:

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,...),但没有任何变化。 如果我从虚拟网络的另一个泊坞窗发送相同的请求,一切工作正常。

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

谢谢!

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

enter image description here

更新

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

enter image description here

+0

1.您在哪里拍摄?在服务器还是客户端? 2.机器之间的MTU是多少? 3.每个片段的大小是多少? 4.响应的大小是多少? – Malt 2014-11-03 14:57:09

+0

1 - 正如我所说,我捕获主机192.168.4.100的接口; 2 - MTU是1454,因为它们之间有一个GRE隧道;这些片段的长度是1454,但是最后的长度是327字节。 – mgaido 2014-11-03 15:05:42

+0

你可以将整个捕捉发布在某个地方吗?我想看看时间和一些TCP/IP标头......如果它包含任何专有的东西,您可以删除HTTP负载。只是捕获看起来很奇怪,如果它真的被捕获在客户端。 – Malt 2014-11-03 15:11:27

回答

1

我设法解决了我的问题。我在这里发布解决方案,如果有人遇到同样的问题,这个解决方案很有用

问题是,我禁用了TSO(TCP-分割的卸载)上的虚拟桥到我的码头工人附接有该命令:

ethtool -K IFACE_NAME tso off 

它关闭只TSO,而校验和卸载仍然存在。很明显,这会产生一些问题,尽管Wireshark向我展示了TCP校验和是确定的,但事实上并非如此。所以主机由于错误的TCP校验和而忽略了数据包。

要关闭TSO和校验过,我只是用命令:

ethtool --offload IFACE_NAME rx off tx off 

现在一切正常。

相关问题