fs是一个网络仿真工具,由Joel Sommers用Python编写的,它与传统的仿真工具不同,例如ns-2,传统的仿真工具是基于包层次的,而fs是基于流层次的,听说效率更高。
po主是第一次接触该工具,一些配置还不太清楚,都是根据关于fs的infocom论文来理解的,网上资源太少了。下面通过一个例子讲述一下fs配置文件的属性。
graph test {
// 3 nodes: a, b, and c
flowexport=text
a [
autoack="False"
ipdests="10.1.0.0/16 10.10.0.0/16 10.128.0.0/9"
traffic="m1"
// basic harpoon setup
// build up and withdrawal of harpoon sources; 10 sources for duration
// of 60 sec, followed by 20 sources for 60 sec, etc.
// m1="modulator start=0.0 generator=s1 profile=((60,),(10,20,30,30,20,10))"
m1="modulator start=0.0 generator=s1 profile=((3600,),(1,))"
s1="harpoon ipsrc=10.1.0.0/16 ipdst=10.3.1.0/24 flowsize=pareto(10000,1.2) flowstart=exponential(100.0) ipproto=randomchoice(6) sport=randomchoice(22,80,443) dport=randomunifint(1025,65535) lossrate=randomchoice(0.001)"
];
b [
autoack="False"
ipdests="10.2.0.0/16"
];
c [
autoack="False"
ipdests="10.3.0.0/16 10.4.0.0/16 10.0.0.0/8"
];
// links
a -- b [weight=10, capacity=100000000, delay=0.043];
b -- c [weight=10, capacity=100000000, delay=0.031];
a -- c [weight=30, capacity=100000000, delay=0.123];
}
fs的配置文件可以是dot或者是json格式的,以上的是dot格式。配置文件中,首先定义了拓扑图的名字,然后用大括号包围拓扑图的详细信息。然后拓扑嘛,只有两个元素,节点和链路。
例子中节点数量是3个,a,b,c,每个节点都有可到达的ip以及是否自动ack,其中a节点是网络流量的发起者,因此a节点需要定义流量模块,其流量模块为m1,start属性表示什么时候开始发起流量,profile属性由两个列表组成,都是Python的tuple元组,第一个列表表示流量发起周期,第二个列表表示有几个流同时从源节点处被激活,逗号结尾表示循环。generator属性表示流量的发生器。例子中引用s1,每个发生器都有一个类型,例如s1的类型是harpoon,然后还有源节点和目的节点,注意这两个属性可以是单个元素,也可以是元组,flowsize属性表示流的大小,这里使用服从帕累托分布的随机变量;flowstart属性表示流开始的时间间隔,sport和dport代表源端口和目的端口,lossrate代表流的丢包率。
例子中一共有三条link,a到b,b到c,a到c,其中每条link中weight属性代表dijkstra算法中的边的权重,capacity代表链路带宽,delay代表链路延迟。