本文主要是介绍Python脚本创建mininet网络拓扑与iperf测量,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
1.新建Python文件example.py,并保存在mininet/custom目录下
1.1 __init__()
1.2 addController
1.3 addSwitch
1.4 addHost设置主机CPU
1.5 addLink设置链路间的带宽、延迟、丢包率等
1.6 ping互通测试
1.6 iperf测试TCP吞吐量、UDP丢包和延迟抖动[2]
1.7 buildFromTopo()
2.修改文件example.py为可执行文件和可读写文件
3.运行脚本
参考文献
1.新建Python文件example.py,并保存在mininet/custom目录下
""" this file is a custom topology using Python.
reference link:
https://blog.csdn.net/weixin_39616367/article/details/111450445
"""from mininet.net import Mininet
from mininet.node import CPULimitedHost
from mininet.link import TCLink
from mininet.cli import CLInet = Mininet(host=CPULimitedHost, link=TCLink)#def addController( self, name='c0', controller=None, **params ):
c0 = net.addController()# def addSwitch( self, name, cls=None, **params ):
s1 = net.addSwitch('s1')#def addHost( self, name, cls=None, **params ):
h1 = net.addHost('h1')
h2 = net.addHost('h2', cpu=0.5)
h3 = net.addHost('h3', cpu=0.5)#def addLink( self, node1, node2, port1=None, port2=None, cls=None, **params ):
net.addLink(s1, h1, bw=10, delay='5ms', max_queue_size=1000, loss=10, use_htb=True)
net.addLink(s1, h2)
net.addLink(s1, h3)#def ping( self, hosts=None, timeout=None ):
net.pingAll()net.start()
CLI(net) #Waiting for command
其中,mininet.net中的Mininet类定义了一个网络的类,包括拓扑、交换机、主机、控制器、链路、接口等,具体定义如下:
1.1 __init__()
def __init__( self, topo=None, switch=OVSKernelSwitch, host=Host,controller=DefaultController, link=Link, intf=Intf,build=True, xterms=False, cleanup=False, ipBase='10.0.0.0/8',inNamespace=False,autoSetMacs=False, autoStaticArp=False, autoPinCpus=False,listenPort=None, waitConnected=False ):"""Create Mininet object.topo: Topo (topology) object or Noneswitch: default Switch classhost: default Host class/constructorcontroller: default Controller class/constructorlink: default Link class/constructorintf: default Intf class/constructoripBase: base IP address for hosts,build: build now from topo?xterms: if build now, spawn xterms?cleanup: if build now, cleanup before creating?inNamespace: spawn switches and controller in net namespaces?autoSetMacs: set MAC addrs automatically like IP addresses?autoStaticArp: set all-pairs static MAC addrs?autoPinCpus: pin hosts to (real) cores (requires CPULimitedHost)?listenPort: base listening port to open; will be incremented foreach additional switch in the net if inNamespace=FalsewaitConnected: wait for switches to Connect?(False; True/None=wait indefinitely; time(s)=timed wait)"""
1.2 addController
def addController( self, name='c0', controller=None, **params ):"""Add controller.controller: Controller class"""
1.3 addSwitch
def addSwitch( self, name, cls=None, **params ):"""Add switch.name: name of switch to addcls: custom switch class/constructor (optional)returns: added switchside effect: increments listenPort ivar ."""
1.4 addHost设置主机CPU
def addHost( self, name, cls=None, **params ):"""Add host.name: name of host to addcls: custom host class/constructor (optional)params: parameters for hostreturns: added host"""
如:h1 = net.addHost('h1', cpu=0.5) | |
name | 需要加入节点的名字 |
cls | custom host class,可选参数 |
params | 可选参数,具体见mininet/mininet/node.py中的config() |
cpu:desired overall system CPU fraction | |
cores: (real) core(s) this host can run on |
mininet/mininet/node.py中的config()
def config( self, cpu=-1, cores=None, **params ):"""cpu: desired overall system CPU fractioncores: (real) core(s) this host can run onparams: parameters for Node.config()"""
1.5 addLink设置链路间的带宽、延迟、丢包率等
def addLink( self, node1, node2, port1=None, port2=None, cls=None, **params ):""""Add a link from node1 to node2node1: source node (or name)node2: dest node (or name)port1: source port (optional)port2: dest port (optional)cls: link class (optional)params: additional link params (optional)returns: link object"""
如:self.addLink( node1, node2, bw=10, delay='5ms', max_queue_size=1000, loss=10, use_htb=True) 使用htb速率限制器和netem延迟/丢失模拟器,添加具有带宽、延迟和丢失特性,最大排队长度为1000的双向链路。 | |
node1,node2 | 节点1,2 |
port1 | source port源端口,可选参数 |
port2 | destination port目的端口,可选参数 |
cls | custom link class,可选参数 |
params | 可选参数,具体见mininet/mininet/link.py的config() |
bw: bandwidth in b/s (e.g. '10M')单位是Mbit | |
delay: transmit delay (e.g. '5ms', '100us', '1s') | |
jitter: jitter (e.g. '1ms') | |
loss: loss (e.g. '1%' )百分比 | |
内核队列调度算法: use_tbf: use TBF scheduling use_hfsc: use HFSC scheduling,HFSC:Hierarchical Fair Service Curve’s(层次公平服务曲线) use_htb: use HTB scheduling, HTB:Hierarchical Token Bucket(层级令牌桶) | |
max_queue_size: queue limit parameter for netem以数据包表示 |
mininet/mininet/link.py的config()
def config( self, bw=None, delay=None, jitter=None, loss=None,gro=False, txo=True, rxo=True,speedup=0, use_hfsc=False, use_tbf=False,latency_ms=None, enable_ecn=False, enable_red=False,max_queue_size=None, **params ):"""Configure the port and set its properties.bw: bandwidth in b/s (e.g. '10m')delay: transmit delay (e.g. '1ms' )jitter: jitter (e.g. '1ms')loss: loss (e.g. '1%' )gro: enable GRO (False)txo: enable transmit checksum offload (True)rxo: enable receive checksum offload (True)speedup: experimental switch-side bw optionuse_hfsc: use HFSC schedulinguse_tbf: use TBF schedulinglatency_ms: TBF latency parameterenable_ecn: enable ECN (False)enable_red: enable RED (False)max_queue_size: queue limit parameter for netem"""
1.6 ping互通测试
def ping( self, hosts=None, timeout=None ):"""Ping between all specified hosts.hosts: list of hoststimeout: time to wait for a response, as stringreturns: ploss packet loss percentage"""
1.6 iperf测试TCP吞吐量、UDP丢包和延迟抖动[2]
def iperf( self, hosts=None, l4Type='TCP', udpBw='10M', fmt=None,seconds=5, port=5001):"""Run iperf between two hosts.hosts: list of hosts; if None, uses first and last hostsl4Type: string, one of [ TCP, UDP ]udpBw: bandwidth target for UDP testfmt: iperf format argument if anyseconds: iperf time to transmitport: iperf portreturns: two-element array of [ server, client ] speedsnote: send() is buffered, so client rate can be much higher thanthe actual transmission rate; on an unloaded system, serverrate should be much closer to the actual receive rate"""
iperf是一款常用的网络带宽测试工具,分为客户端和服务端。服务端首先开启监听,客户端发送流量,最后测得带宽的大小。以h1为服务端,以h2为客户端。打开服务端和客户端终端命令为:
xterm h1 h2
1、Iperf测试TCP网络带宽利用率
h1服务端 | iperf -s |
h2客户端 | Iperf默认的运行时间在10秒左右,通过“-t”和“-i”参数来改变Iperf运行的时间和输出频率。如:iperf -c 10.0.0.1 -t 60 -i 10 |
通过“-n”参数指定要传输的数据量,指定“-n”参数后,“-t”参数失效,Iperf在传输完毕指定大小的数据包后,自动结束。如:iperf -c 10.0.0.1 -n 100M -i 10 | |
通过“-P”参数测试多线程TCP吞吐量。如:iperf -c 10.0.0.1 -n 100M -i 10 -P 2 |
2、Iperf测试UDP数据包丢包率和延迟指标
h1服务端 | 通过“-p”指定服务器端与客户端所连接的端口,iperf -s -u -p 6633 -t 60 -i 10 |
h2客户端 | 通过Iperf的“-u”参数即可测试UDP应用的传输性能,“-b”参数测试客户端传输100M的UDP数据包,如:iperf -c 10.0.0.1 -u -p 6633 -t 60 -i 10 -b 100M |
“Jitter”列表示抖动时间,也称为传输延迟。 “Lost/Total Datagrams”列表示丢失的数据包和数据包数量,0%是平均丢包率。 |
1.7 buildFromTopo()
Mininet类最主要的部分是 build() 函数,依次执行:根据拓扑创建网络,配置网络名字空间,配置主机的 IP、MAC 等信息,检查是否启动 xterm,是否配置自动静态 arp 等。
def buildFromTopo( self, topo=None ):"""Build mininet from a topology objectAt the end of this function, everything should be connectedand up."""
2.修改文件example.py为可执行文件和可读写文件
chmod +x example.py
chmod 666 example.py
3.运行脚本
sudo python3 example.py
参考文献
1.mininet搭建自定义网络拓扑.http://www.muzixing.com/pages/2013/12/06/yuan-chuang-mininetda-jian-zi-ding-yi-wang-luo-tuo-bu-by-muzi.html.
2.性能测试工具Iperf 验证SDN网络.https://www.sdnlab.com/15088.html.
这篇关于Python脚本创建mininet网络拓扑与iperf测量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!