【问题标题】:SENDTO sends packet, but sniffer does not see itSENDTO 发送数据包,但嗅探器看不到它
【发布时间】:2013-11-07 18:23:23
【问题描述】:

我有 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% 空闲,并且链接是点对点的。

【问题讨论】:

  • 您的问题是什么?数据包是否会在以太网中丢失?是的,它可以。该怎么办?使用超时、重传和类似的方法(提示:阅读 TCP 的工作原理)。
  • 同意以上海报。此外,如果您不从“两台 Linux 机器之间的 UDP 连接”开始,您可能会对您的问题更感兴趣...... UDP 是无连接的。

标签: linux network-programming udp


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    sendto 是干净的,也没有错误。 但这给了我查看界面统计信息的提示: 猫 /proc/net/dev 从现在开始,一切都变得非常简单——“coll”计数器与丢失回复包的数量完全相同。

    显然是硬件问题。

    非常感谢社区的帮助。

    【讨论】:

    • "显然是一些硬件问题。"其实是网络问题。如果您使用的是现代以太网设备,则所有链路都应由交换机处理,运行全双工链路。在全双工交换网络中,您永远不会看到冲突。所以可能是缺少交换网络(2013 年?哦不),或者缺少适当的自动协商,导致半双工链路。
    猜你喜欢
    • 2013-07-01
    • 1970-01-01
    • 2015-04-02
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多