gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:32:14 24 4
gpt4 key购买 nike

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

在我的试验中,我从主机 (192.168.4.100) 向服务器 docker (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 等),但没有任何变化。如果我从虚拟网络的另一个 docker 发送相同的请求,一切正常。

知道问题出在哪里吗?

谢谢!

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

enter image description here

更新

我认为有趣的一件事是我进行了类似的捕获,但是当从 192.168.4.3 向 192.168.4.100 发送 HTTP 请求时。再次在 192.168.4.100 接口(interface)上进行捕获,并且 192.168.4.100 似乎再次忽略了它收到的数据包(例如查看三向握手)。我又找不到理由了。

enter image description here

最佳答案

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

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

ethtool -K IFACE_NAME tso off

它仅关闭 TSO,而校验和卸载保持打开状态。显然,这会产生一些问题,尽管 Wireshark 向我显示 TCP 校验和是正确的,但实际上并非如此。由于错误的 TCP 校验和,主机忽略了该数据包。

要关闭 TSO 和校验和,我只使用了命令:

ethtool --offload IFACE_NAME rx off tx off

现在一切正常。

关于http - TCP 接收数据包,但忽略它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26716722/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com