分片的UDP数据包没有被应用程序接收

非常奇怪的行为

我有3台机器:

  ----------- ------------ -----------
  |  A(x86)| ----- |  B(x86)| ----- |  C(arm)|
  | 发件人|  | 接收器|  | 发件人|
  ----------- ------------ -----------
  • A和B是Linux(Ubuntu 12.04)机器,内核3.2;
  • C是一个android(ICS)机器,内核3.0.8;
  • 所有通过RJ45电缆连接;
  • 连接正常,networking设置正确;

问题是:当机器C(ARM-android)发送一个有效载荷大小超过1472字节(在数据包被分解之前的最大有效载荷)的UDP数据包时,机器B上的服务器应用程序永远不能接收它,

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

我花了一些时间在互联网上,但从来没有find像这样的话题。 每次有人遇到UDP的问题,他们的MTU发现是不正确的,或者他们在testing过程中做了一些错误的处理,或者他们不能在接收主机上转储消息,这里不是这种情况!

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

非常感谢。

如果您的机器确实按照描述连接 ,即它们没有连接到交换机/集线器,那么您必须在B上有两个NIC,因此它们将具有不同的地址,因此您用来从A发送到B的地址将不会与从C发送给B.

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

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

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