【问题标题】:Significantly different LAN transmit speed局域网传输速度明显不同
【发布时间】:2021-03-16 11:52:29
【问题描述】:

我有两台机器,一台 Mac 和一台 Linux,在同一个本地网络中。我尝试使用其中一个作为 HTTP 服务器来传输文件,结果发现下载速度因服务器而异。如果我使用 Mac 作为服务器,下载速度在 3MB/s 左右,反之则在 12MB/s 左右。然后我用iperf3测试了它们之间的速度,得到了类似的结果:

当 Mac 是服务器,Linux 是客户端时:

[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  28.7 MBytes  2942 KBytes/sec  1905             sender
[  5]   0.00-10.00  sec  28.4 MBytes  2913 KBytes/sec                  receiver

当 Linux 是服务器,Mac 是客户端时:

[ ID] Interval           Transfer     Bandwidth        
[  4]   0.00-10.00  sec  162 MBytes  16572 KBytes/sec                  sender
[  4]   0.00-10.00  sec  161 MBytes  16526 KBytes/sec                  receiver

我请朋友帮我做下载测试,他告诉我他的两台 Mac 上的速度都在 1MB/s 左右,这与路由器的容量相差甚远。怎么会这样?

【问题讨论】:

  • 丢包。 “Retr”向您显示重新传输的段数。 github.com/esnet/iperf/issues/343
  • 只是为了量化它,28.7 MB /(1500 字节/段)~= 19,000 段。 1905 个重传段意味着约 10% 的丢包率,即使 RTT 为 0 毫秒,这也会对 TCP 吞吐量产生巨大影响。
  • @JimD。谢谢回复,真的很有帮助。但是为什么丢包总是在一个方向而不是另一个方向发生呢?
  • 不知道。告诉我们更多关于您的局域网的信息。无线还是有线?电缆类型或 WIFI 频段....
  • @JimD。好的,所以这不是一个普遍的问题。我将尝试探索我的网络出了什么问题,因为我认为这是一个非常简单的网络,只有两台机器通过 wifi 连接到路由器。非常感谢您的帮助!

标签: performance http tcp lan


【解决方案1】:

这不会是一个太多的答案,但它可能会足够长,以至于它不适合评论。

您对“虚假 TCP 标头长度”的观察非常有趣;我以前从未在捕获中看到过它,所以我想确切地检查一下它的含义。 Here 你可以看到这意味着wireshark TCP协议解析器无法对该段进行任何意义,因为TCP头长度小于最小TCP头长度。

看来您的 TCP 段无效。我只知道两个原因是它以某种方式错误地构建(即错误或入侵尝试)或它已损坏。

在使用原始套接字时,我确实创建了很多无效段,并且我看到很多不符合标准的伪造段,但在您的情况下似乎不太可能出现这种情况。

所以,根据我的经验,它似乎很可能已经被某种方式损坏了。尽管如果它是捕获中的传输数据包,那么您实际上是在发送无效段。所以在接下来的内容中,我假设它是一个收到的片段。

那么它可能在哪里被破坏了?第一个谜团是你在捕捉中看到了它。如果它在网络中被损坏,则帧校验序列(FCS,CRC)不应该匹配,它应该被丢弃。

但是,可以将您的 NIC/驱动程序配置为交付具有无效 FCS 的段。在 linux 上,您可以使用 ethtool 检查/配置这些设置,相关参数是 rx-fcsrx-all(对不起,我不知道如何在 Mac 上执行此操作)。如果它们都“关闭”,则您的 NIC/驱动程序不应向您发送带有无效 FCS 的段,因此它们不会出现在捕获中。

由于您在捕获中看到具有无效 TCP 标头长度的段,并且假设您的 NIC/驱动程序配置为丢弃具有无效 FCS 的段,那么您的 NIC 在线路上看到一个有效的段,并且该段是要么在发送器计算 FCS 之前损坏(通常在 NIC 中完成),要么在接收 NIC 验证 FCS 之后损坏。

在这两种情况下,CPU 内存和 NIC 之间都会通过总线(例如 PCI-e)进行 DMA 传输。我猜这里有一个硬件问题导致了损坏,但我对这个猜测不太有信心,因为我没有多少信息可以继续。

您可以尝试在两端进行捕获,以比较传输的内容和接收的内容(尤其是在 TCP 标头长度无效的段的情况下)。您可以使用 IP 标头中的 ID 字段匹配捕获中的段(假设它也没有损坏)。

祝你好运!

【讨论】:

    猜你喜欢
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多