【问题标题】:What are the reasons for UDP packets to be dropped by the network stackUDP数据包被网络堆栈丢弃的原因是什么
【发布时间】:2014-03-24 12:53:36
【问题描述】:

我看到 UDP 数据包到达我的 Linux 机器(通过 tcpdump),目标端口设置为 25555。但是:

nc -l -u 25555

显示没有流量。

我已经检查过了:

  1. iptables 已关闭
  2. 目标 MAC 地址与传入接口匹配
  3. 目标 IP 地址与传入接口匹配
  4. IP 校验和正常
  5. UDP 校验和正常

另外,所有数据包都被丢弃了,因此这不是 rx 缓冲区过低的问题。

还有什么可能导致数据包被丢弃的想法吗?

【问题讨论】:

  • 目标 IP 地址是什么?
  • 您确定没有其他程序正在从该端口读取数据吗?执行cat /proc/net/udp 并向我们展示它打印的内容(当 nc 未运行时)。
  • 我希望 nc 在这种情况下会失败(EADDRINUSE),不是吗?
  • 它没有。有趣的。尽管如此,没有其他应用程序正在侦听该端口。 netstat -antelupa | grep 25555 没有结果。
  • 我不确定。如果您向我们展示您的udp 表,我们可以看到更多详细信息。如果您不想发布它,至少尝试使用 grep 来获取端口号的十六进制表示。

标签: linux udp iptables packet


【解决方案1】:

您的机器上有另一个进程正在读取到达端口 25555 的数据报。我们可以从您的/proc/net/udp 看到它:

sl   local_address rem_address   st tx_queue rx_queue tr rexmits  tm->when uid timeout inode ref pointer   drops
104: 00000000:63D3 00000000:0000 07 00000000:00000000 00:00000000 00000000 0   0       1779298 2 fff810266fe0c 0

因此,“窃取”您想要的数据报的进程归 root (uid=0) 所有。而socket的inode是1779298,可以在/proc/PID/fd下搜索root拥有的PID。一旦你弄清楚那里正在监听哪个进程,你需要决定是否终止它,以便nc 可以改为监听。

单播 UDP 数据报最终只会发送到 Linux 系统上的单个进程,即使有多个进程试图从同一个地址读取。

【讨论】:

  • 不。那是我在 25555 上监听的 nc 进程。当我杀死它时,该行从 udp 表中消失。
  • 我想当我说“当 nc 不运行时”时我并不清楚。哦,好吧,祝你好运。
【解决方案2】:

最后,数据包被 RPF 过滤丢弃了。请参阅 Linux 中的 net.ipv4.all.rp_filter 设置。

【讨论】:

    猜你喜欢
    • 2013-02-08
    • 2011-08-20
    • 2011-12-19
    • 1970-01-01
    • 2011-12-13
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    相关资源
    最近更新 更多