从Node.js UDP发送大量小数据包并不发送所有这些小数据包

时间:2016-04-07 06:26:49

标签: javascript node.js sockets networking udp

我有一个我正在研究的项目,它需要向本地网络外的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 个答案:

答案 0 :(得分:0)

有很多关键字可以删除你的数据包:

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

  2. 放入内核tx队列。在linux上,您可以检查,例如/sys/class/net/eth0/statistics/,看看是否有任何丢弃计数器正在递增。

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

  4. 放入中间硬件(例如交换机/路由器)。这看起来比较棘手,因为它依赖于供应商而且可能是隐形的。您可以通过将机器直接连接到彼此来消除这种情况。

  5. 放入硬件rx队列。在远程端,检查所有相同的统计数据,以查看是否发生溢出。

相关问题