从Node.js UDP发送大量小数据包;Don’不要全部寄出去

Sending lots of small packets out of Node.js UDP doesn't send all of them

本文关键字:Don 全部 数据包 UDP js Node 小数      更新时间:2024-02-06

我正在处理一个项目,该项目需要向本地网络外的7000个不同主机发送一个9字节的小数据包,然后在同一端口上等待它们的回复并处理响应。

我遇到的问题是Node.js dgram(udp4)似乎没有发送所有的数据包。我没有以任何方式限制利率,所以可能存在问题。

我正在循环,创建数据包,然后使用.send()直接将它们发射出去。在Wireshark打开的情况下,我可以看到在7000个被"发送"的数据包中,只有1300个似乎击中了电线并离开了。

脚本本身报告所有数据包发送时没有错误,Wireshark显示了不同的结果,而另一端的主机反映了Wireshark所说的,他们没有收到数据包。我正在使用以下内容进行发送和验证,数据包是一个缓冲区。

udpServer.send(packet, 0, packet.length, port, address, function(error) {
  if (!error) {
    successes++;
    console.log(successes + "/" + total);
  } else {
    console.log(error);
  }
});

关于我在这里做错了什么,或者被忽视了什么,有什么想法吗?

有许多时刻可以丢弃数据包:

  1. 发送到内核时丢弃。你在linux上吗?尝试使用strace查找系统调用(可能是send、sendmsg或sendto)的返回值。如果系统调用返回错误,我希望Node在"error"中报告。

  2. 已在内核tx队列中删除。在linux上,您可以检查,例如/sys/class/net/eth0/statistics/,并查看是否有任何下降计数器正在增加。

  3. 已在硬件tx队列中丢弃。如果使用Intel NIC,则可以运行ethtool -S eth0以查看是否有任何丢弃计数器递增。

  4. 插入式中间硬件(如交换机/路由器)。这更难理解,因为它依赖于供应商,而且可能是不可见的。您可以通过将机器直接相互连接来消除这种情况。

  5. 已在硬件rx队列中删除。在远程端,检查所有相同的统计数据,看看那里是否发生了溢出。