【问题标题】:How can hping be so fast to send packets?hping怎么能这么快发包呢?
【发布时间】:2013-02-15 03:32:24
【问题描述】:

我比较了两个工具的发送数据包速度,hpingpackETHcli。 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 来查找运行 hping3packETHcli 之前和之后的 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


【解决方案1】:

*.pcap 文件中包含每个数据包的时间戳信息。而且我认为packETHcli工具是在解析*.pcap文件,利用时间戳信息来模拟捕获*.pcap文件的网络环境,这意味着它必须根据时间戳在数据包之间添加一些延迟。

虽然 hping 没有。

我认为这就是区别。

如果是这样,packETHcli 工具中是否有支持加快数据包发送速度的选项?

【讨论】:

    猜你喜欢
    • 2016-03-19
    • 2010-09-13
    • 1970-01-01
    • 2013-07-14
    • 2014-05-23
    • 2020-12-19
    • 2011-06-02
    • 2012-03-18
    • 2014-02-21
    相关资源
    最近更新 更多