前言
很多论文的SDN实验中通常用到公用数据集作为背景流量,而这些数据集通常由tcpdump、wireshark等抓包生成,格式为.pcap。
本文介绍在SDN模拟环境mininet中重放.pcap数据集的方法。
数据
本文中采用的数据集为tcpreplay的示例数据集bigFlows系列:Sample Captures
该数据集的详细信息:
This is a capture of real network traffic on a busy private network’s access point to the Internet.
The capture is much larger and has a smaller average packet size than the previous capture.
It also has many more flows and different applications.
If the large size of this file isn’t a problem, you may want to select it for your tests.
Size: 368 MB
Packets: 791615
Flows: 40686
Average packet size: 449 bytes
Duration: 5 minutes
Number Applications: 132
目前为止博主测试了很多其他的公用数据集,但是出于一些原因无法使用,下面也将它们列出:
WIDE系列:MAWI Working Group Traffic Archive
IMC系列:Data Set for IMC 2010 Data Center Measurement
这两个数据集的.pcap出于保护隐私,去掉了所有的负载,也就是data字段,抓取的时候是以包头部快照的形式进行,因此在重写数据包时可能存在数据包过短报错的问题,问题大概是:
Fatal Error: Error rewriting packets: From tcpedit.c:tcpedit_packet() line 172:
Packet length 60 is to short to contain a layer 52 byte IP header for DLT 0x0001
这个该问题的解决请参考我的另一篇博客:
python scapy填充公共pcap数据集负载实现流量重放_裕东方的博客-CSDN博客_python tcpreplay
对于匿名数据集,请确保负载已经正常填充,再用tcpreplay、tcprewrite修改、重放,否则一定会出现包损坏问题,无法重放!!
以及:
CAIDA Anonymized Internet Traces系列:The CAIDA Anonymized Internet Traces Dataset (April 2008 - January 2019) - CAIDA
这个数据集不可用的原因是国外出口限制,已经难以申请到。
工具
首先使用tcprewrite改写数据集,使用tcpreplay进行.pcap格式的重放,安装参考:tcpreplay的安装使用_zhaomax的博客-CSDN博客_tcpreplay
tcpreplay是一种pcap包的重放工具, 它可以将用ethreal, wireshark工具抓下来的包原样或经过任意修改后重放回去. 它允许你对报文做任意的修改,指定重放报文的速度等。
tcpreplay本身包含了几个辅助工具(tcpprep、tcprewrite、tcpreplay和tcpbridge)
其中: tcpprep 是简单的说就是划分哪些包是client的, 哪些是server的, 一会发包的时候client的包从一个网卡发, server的包可能从另一个网卡发。即区分pcap数据包的流向,即区分出客户端和服务器。
tcprewrite 修改报文头部,即MAC地址、IP地址和PORT等。
tcpreplay 回放pcap文件中的数据包。
方法
1、准备好下载好的.pcap文件,本文是bigFlows.pcap
2、重写bigFlows.pcap的源和目的地址。通常而言,如果mininet拓扑中只有一台host作为背景流量发生者,那么需要修改整个pcap的源IP为该host的IP,且修改整个pcap的目的IP为接收者的IP,命令如下:
(如果需要改mac地址,则选项为“--enet-smac、--enet-dmac”,类似操作)
tcprewrite --infile=bigFlows.pcap --outfile=test.pcap --srcipmap=0.0.0.0/0:10.0.0.11 --dstipmap=0.0.0.0/0:10.0.0.13
//指定输出文件名称,这里是test.pcap
//10.0.0.11和13为重写的源和目的,根据自己的mininet拓扑配置决定
3、使用tcprewrite重新计算校验和,命令如下:
tcprewrite --infile=test.pcap --outfile=test1.pcap --fixcsum
以上的两步可以合并为一条tcprewrite命令,即将所有的选项和参数合并输入,如下:
tcprewrite --infile=XXX.pcap --outfile=XX.pcap --enet-smac=00:00:00:00:00:01 --enet-dmac=00:00:00:00:00:04 --srcipmap=0.0.0.0/0:10.0.0.11 --dstipmap=0.0.0.0/0:10.0.0.13 --fixcsum
// MAC、IP源和目的地址由自己的拓扑决定
// 本处仅为一个示例
4、xterm打开mininet的host终端
5、在终端上运行tcpreplay进行数据包重放,命令示例为:
tcpreplay -i h1-eth0 -x 1.0 -K 文件路径/test1.pcap
//-i选项制定发包的网卡,在host上用ifconfig查看
//-x选项是倍速播放,这里的1.0是按照原速度播放
//-K是将pcap预加载到内存中,提高速度,如果需要重放很多个pcap,不建议使用该选项(内存占用过大)
tcpreplay -i h1-eth0 -p 300 -K 文件路径/test1.pcap
//除了-x倍速,还可以通过-p调节发包速度
//-p是每秒多少包的意思,这里是300pkt/s
注意事项
部分数据集的数据包第二层(物理层)的结构会多出一个4字节的IEEE 802.1q:VLAN连接介质访问控制层。
此时使用tcprewrite,需要增加选项“--enet-vlan”。
目前已发现上述的IMC-10数据集存在该字段。使用该数据集时应注意。
参考资料
官方文档:tcprewrite、tcpreplay
腾讯云:Linux下Pcap包重放工具Tcpreplay的简单使用 - 云+社区 - 腾讯云
pcap - Generate dataset traffic in mininet - Stack Overflow
mininet - use tcpreplay for real trace internet dataset - Stack Overflow