0

很奇怪的行为...

我有3台机器:

------------ ------------ ------------
 | A (x86) |-----| B (x86) |-----| C(手臂)|
 | 发件人 | | 接收器 | | 发件人 |
 ------------ ------------ ------------
  • A和B是Linux(Ubuntu 12.04)机器,内核3.2;
  • C是android(ICS)机器,内核3.0.8;
  • 全部通过 RJ45 电缆连接;
  • 连接正常,网络设置正确;

问题是:当机器 C (ARM-android) 发送一个有效负载大小超过 1472 字节的 UDP 数据包(数据包被分片之前的最大有效负载)时,机器 B 上的服务器应用程序永远无法接收它,... 关于这一点:

  • 源/目标 IP 地址正确:如果我将有效负载大小设置为小于或等于 1472,我可以接收我发送的所有数据报;
  • 在机器 B(接收方)上,如果我用 Wireshark 转储网络流量,我可以看到每个片段,然后重新组装消息 => 从 Wireshark 的角度来看,一切都很好!
  • 将每个片段标头以及重新组装的消息与从机器 A 发送相同消息时我可以转储的消息进行比较(始终接收正常),一切似乎都很完美(唯一的区别是 IP 地址和校验和,因为 UDP 标头校验和考虑 IP 地址字段)。
  • 没有 MTU 问题,数据包按预期分段。
  • 机器之间没有路由器/交换机
  • ifconfig 既没有显示数据包丢失,也没有显示溢出,也没有任何其他经典错误!
  • ……这太奇怪了!!

我在互联网上花了一些时间,但从未找到任何像这样的话题。每当人们遇到 UDP 问题时,要么他们的 MTU 发现不正确,要么他们在测试过程中做了一些错误处理,或者他们无法将消息转储到接收器主机上,......这里不是这种情况!

当然,我知道问题出在发送端(机器 C),但也许更容易在接收端启用一些日志(在内核级别?)以了解为什么 UDP 数据报消失!?有什么建议吗?是否有我可以在 /proc/sys/net 中检查的特定文件,或者我应该启用的内核选项?

非常感谢。

4

1 回答 1

0

如果您的机器确实如图所示连接,即它们没有连接到交换机/集线器,那么您必须在 B 上有两个 NIC,因此它们将具有不同的地址,因此您用于从 A 发送到 B 的地址与从 C 发送到 B。即

您发送的地址可能是错误的吗?虽然这不能解释较小的数据报是如何通过的——你确定它们是吗?

注意:这些地址必须手动分配,因为您没有连接到 DHCP,此外,这些地址需要与 A 和 C 在同一子网中。您的所有地址(A、BA、BC 和 C)是否在同一子网?B 上的套接字绑定并监听的地址:端口是什么?B收到数据报后是否继续接收?请提供一些代码..

或者,即使您的机器连接到交换机/集线器,在从 C 发送的数据报上设置了“不分段”位,这可以解释为什么丢弃较大的而不是较小的。

于 2013-10-08T04:00:37.307 回答