0

我有 2 台 Linux 机器之间的 UDP 连接。大约 40-50 毫秒后,A 方发送一个编号的请求并等待 B 方的回复。在回复到达之前,什么都不能发送,除了 2s 的超时。B准备回复并发送它大约需要10-15ms。连接是点对点的。

问题是,在 300-400 次交换中,A 方没有收到 B 的任何回复。

出于测试和调查的目的,我将所有东西都连接到集线器并在连接的 PC 上运行 wireshark。我看到的是,当A方看不到回复时,wireshark也看不到。然而,B 方认为数据包已发送,因为位于 sendto(...) 之后的日志打印总是打印“丢失的”数据包编号。

问题是:数据包在从应用程序(sendto(...))到线路的过程中丢失的原因可能是什么。考虑到绝对没有负载 - B 侧的 CPU 有 95% 空闲,并且链接是点对点的。

4

2 回答 2

0

UDP 不可靠。数据报很可能在到达 A 之前就丢失了。

你能分享在 B 上运行的 Wireshark 的 Wireshark 文件吗?可能你会在那里看到丢失的数据报。其他可能性: -您有缓冲区溢出并破坏了已发送数据中的某些内容。-sendto 在发送丢失的数据报时收到错误。您是否正在检查小于 0 和 errno 的返回码?

但如果没有wireshark 文件,就很难猜到。共享代码也很有帮助。

于 2013-11-05T15:19:49.430 回答
0

感谢rodolk的提示。不知道为什么我没有早点这样做...... :)

Wireshark 打印输出将没有用,因为它根本不显示丢失的数据包 - 无需调查。

sendto 很干净,也没有错误。但这给了我查看接口统计信息的提示: cat /proc/net/dev 从现在开始,一切都非常简单 - 'coll' 计数器与丢失回复包的数量完全相同。

显然是硬件问题。

非常感谢社区的帮助。

于 2013-11-07T10:23:23.657 回答