【发布时间】:2013-02-15 03:32:24
【问题描述】:
我比较了两个工具的发送数据包速度,hping 和packETHcli。 packETHcli 的命令行选项是
./packETHcli -i eth0 -m 2 -n 0 -d -1 -f icmpSample.pcap
而对于 hping 是
hping --flood 192.168.0.1
但是在iptraf中显示hping的发包速度比packETHcli快10倍左右。
这两种工具都使用原始套接字,但为什么会有如此大的差异?
这里是获取源代码的链接。
hping:http://wiki.hping.org/
packETHcli:http://sourceforge.net/projects/packeth/
编辑:
我注意到hping 使用 AF_INET 原始套接字,有效负载是 TCP。 packETHcli 使用 PF_PACKET 原始套接字,在我的示例中,有效负载是带有 ICMP 有效负载的 IP 数据包。
它会影响数据包发送速度吗?
EDIT2
这一次,我使用 ifconfig 来查找运行 hping3 和 packETHcli 之前和之后的 TX 数据包计数差异。并且发现这两个工具的数据包生成率接近。 hping3 大约是每秒 100000 个数据包,packETHcli 大约是每秒 80000 个数据包。
我还使用vnstat 来测量数据包的生成率。结果和我从ifconfig得到的数字一致。
所以,iptraf 似乎在撒谎。并且我使用iptraf 来监控TCP 数据包的重复重发,没有更新IP ID 号和TCP 序列号。 iptraf 认为我的数据包发送速率是每秒 0 个数据包。可能是iptraf不计算重复数据包?
【问题讨论】:
-
它们是否都在 CPU 使用率上达到极限?也许一个比另一个更有效地编码。 (作为一个专门的工具,hping 可能更精简)。
-
@nneonneo 他们都使用 sendto() 发送原始数据包,并包装在 for(;;) 或 while(1) 循环中。两者都在单线程中运行。
-
嗯,但是在那个循环中还有多少其他的垃圾?我所要求的只是对 CPU 使用率进行
top比较,看看它们是否都在最大限度地利用 CPU。您可能还想查看他们是否正在使用ntop最大化网络。 -
@nneonneo
packETHcli的 CPU 利用率约为 19%,hping3为 100%。hping3在用户空间中手动构建数据包,然后通过 sendto(2) 发送它,并在 while(1) 的每个循环中重复此过程。而packETHcli只是在for(;;)的循环中用相同的包数据调用sendto(2),包数据在程序启动时从icmpSample.pcap文件中读取一次,循环中不再重复。 -
所以这一定意味着
packETHcli阻塞了很多。我想知道hping3是否对套接字使用任何非阻塞选项。 (如果您想确切了解套接字的配置方式,可以使用strace)。
标签: c linux sockets raw-sockets packet-injection