我记得在Linux中(当做make menuconfig )有一个选项可以这样说:
只有当您想要生成networkingstream量,或者如果您想要创build错误的networkingstream量时,才使用它
不幸的是,我不记得这是什么,甚至不记得任何工具,让我真正创造这样的交通。
我所追求的是
在一个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等)
关于丢包和延迟:
您也可以考虑使用以下组合:
将此与您的应用程序生成的预期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(ðLayer); echoRequestPacket.addLayer(&ipLayer); echoRequestPacket.addLayer(&echoReqLayer); // send the packet liveDev->sendPacket(&echoRequestPacket); } liveDev->close();