应用程序未收到碎片UDP数据包

时间:2013-10-07 17:28:16

标签: android linux debugging udp kernel

很奇怪的行为......

我有3台机器:

 -----------     ------------     -----------
 | A (x86) |-----| B (x86)  |-----| C (arm) |
 | sender  |     | receiver |     | sender  |
 -----------     ------------     -----------
  • 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转储网络流量,我可以看到每个片段,然后重新组装message =>从Wireshark的角度来看,这一切都很好!
  • 比较每个片段标题以及重新组合的消息与从机器A发送相同消息时可以转储的内容(总是收到OK),一切看起来都很完美(只有差异是IP地址和校验和,因为UDP头校验和包含帐户IP地址字段。)
  • 没有MTU问题,数据包按预期分段。
  • 机器之间没有路由器/开关
  • ifconfig既不显示丢包,也不显示溢出,也不显示任何其他经典错误!
  • ......这太奇怪了!!

我花了一些时间在互联网上,但从来没有找到像这样的话题。每次人们遇到UDP故障时,他们的MTU发现都不正确,或者他们在测试过程中做了一些误操作,或者他们无法在接收器主机上转储消息,......这不是这里的情况!!

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

非常感谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

或者,即使您的计算机已连接到交换机/集线器,也是从C发送的数据报上设置的“请勿分段”位,这可以解释为什么会删除较大的数据报较小的。