生成错误的stream量进行testing

我记得在Linux中(当做make menuconfig )有一个选项可以这样说:

只有当您想要生成networkingstream量,或者如果您想要创build错误的networkingstream量时,才使用它

不幸的是,我不记得这是什么,甚至不记得任何工具,让我真正创造这样的交通。

我所追求的是

  • 创build错误的ICMP数据包
  • 注入高延迟或丢包

在一个networking,否则完美的罚款。

目的是testing一些应用程序的行为,这些应用程序必须与欧盟和美国之间的链接一起工作。 我想“压力testing”应用程序将吞噬多less时间,或者可以处理多less数据包丢失。

您正在考虑的选项是CONFIG_NET_PKTGEN

在这里,Linux的装备不如FreeBSD 。 但是你可以用tc(package iproute)来试试Netem 。

加载Netem

 modprobe sch_netem

丢弃设备tap0上的一半数据包:

 tc qdisc add dev tap0 root netem delay 50ms loss 50% 

使用hping可以生成TCP,UDP,ICMP和RAW-IP协议数据包。

还有一个叫scapy的工具。 它可以生成几乎任何types的数据包。 正如作者所说:

Scapy是一个function强大的交互式数据包处理程序。 它能够伪造或解码大量协议的数据包,在线上发送,捕获,匹配请求和回复等等。 它可以很容易地处理大多数经典的任务,如扫描,tracerouting,探测,unit testing,攻击或networking发现(它可以取代hping,85%的nmap,arpspoof,arp-sk,arping,tcpdump,tethereal,p0f等)

关于丢包和延迟:

  • iptables有–probability选项
  • IIRC它可以将QUEUE包插入延迟

您也可以考虑使用以下组合:

将此与您的应用程序生成的预期stream量级别混合。

你也可以考虑使用PcapPlusPlus 。 它有一个支持ICMP的数据包创build引擎和一种将数据包发送到networking的方法。 以下是您想要的示例代码(发送高延迟的错误ICMP数据包):

 // open a pcap live device for interface with IP 10.0.0.1 (put your IP address instead) IPv4Address ipToSearch("10.0.0.1"); PcapLiveDevice* liveDev = PcapLiveDeviceList::getInstance().getPcapLiveDeviceByIp(ipToSearch);; liveDev->open(); int NUM_OF_ERRONEOUS_PACKETS_TO_GENERATE = 1000; // send NUM_OF_ERRONEOUS_PACKETS_TO_GENERATE echo request packets for (int i = 0; i < NUM_OF_ERRONEOUS_PACKETS_TO_GENERATE; i++) { // create an Eth layer with whatever MAC addresses you want MacAddress srcMac(std::string("11:22:33:44:55:66")); // put the MAC address you want here MacAddress destMac(std::string("66:55:44:33:22:11")); // put the MAC address you want here EthLayer ethLayer(srcMac, destMac, ETHERTYPE_IP); // create IPv4 layer with whatever IPs you want (put the IPs you want instead) IPv4Layer ipLayer(IPv4Address(std::string("1.1.1.1")), IPv4Address(std::string("2.2.2.2"))); // Create ICMP echo (ping) request layer IcmpLayer echoReqLayer; icmp_echo_request* echoReq = echoReqLayer.setEchoRequestData(100, 0, 0xe45104007dd6a751ULL, NULL, 0); // make the echo request erroneous. You can do whatever manipulation you want here echoReq->header->checksum = 0x1111; echoReq->header->code = 100; // create a packet with Eth, IPv4, ICMP echo layers; Packet echoRequestPacket(100); echoRequestPacket.addLayer(&ethLayer); echoRequestPacket.addLayer(&ipLayer); echoRequestPacket.addLayer(&echoReqLayer); // send the packet liveDev->sendPacket(&echoRequestPacket); } liveDev->close();