我有一个非常奇怪的网络问题。实际的网络配置相当复杂,因为我正在使用Openstack和Docker来构建虚拟网络。然而,这个问题不在那里,因为我正在捕获我的主机接口上的数据包,并且我以正确的方式看到所有数据包...但是由于某种我不知道的原因,似乎TCP忽略了它们,尽管它们已经被接收:它不会发送ACK,并且不会将数据发送到应用程序。
在我的测试中,我从主机(192.168.4.100)向服务器jetty(IP 192.168.4.3)发送了HTTP GET请求以获取html页面。
在使用Wireshark捕获192.168.4.100时,我看到的是:
在我的测试中,我从主机(192.168.4.100)向服务器jetty(IP 192.168.4.3)发送了HTTP GET请求以获取html页面。
在使用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等)作为主机,但仍旧没有改变。如果我从虚拟网络的另一个docker发送相同的请求,一切正常。
有什么关于问题的想法吗?
谢谢!
PS,在这里你可以看到捕获的截图:
更新
我认为有一件有趣的事情是,我进行了类似的捕获,但是当从192.168.4.3发送HTTP请求到192.168.4.100时。捕获再次在192.168.4.100接口上进行,似乎再次显示192.168.4.100忽略它接收到的数据包(例如看三次握手)。我还是找不到原因。