我有一个我正在研究的项目,它需要向本地网络外的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);
}
});
关于我在这里做错了什么,或者被忽视了什么的想法?
答案 0 :(得分:0)
有很多关键字可以删除你的数据包:
发送到内核时丢弃。你在linux上吗?尝试使用strace查找系统调用(可能是send,sendmsg或sendto)返回值。如果系统调用返回错误,我希望Node会在“错误”中报告。
放入内核tx队列。在linux上,您可以检查,例如/sys/class/net/eth0/statistics/
,看看是否有任何丢弃计数器正在递增。
放入硬件tx队列。如果使用Intel NIC,您可以运行ethtool -S eth0
以查看是否有任何丢弃计数器递增。
放入中间硬件(例如交换机/路由器)。这看起来比较棘手,因为它依赖于供应商而且可能是隐形的。您可以通过将机器直接连接到彼此来消除这种情况。
放入硬件rx队列。在远程端,检查所有相同的统计数据,以查看是否发生溢出。