很奇怪的行为...
我有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 中检查的特定文件,或者我应该启用的内核选项?
非常感谢。