介绍
Mininet 作为一个轻量级软定义网络研发和测试平台,其主要特性包括:
- 支持 Openflow、OpenvSwitch 等软定义网络部件
- 方便多人协同开发
- 支持系统级的还原测试支持复杂拓扑、自定义拓扑
- 提供 Python API
- 很好的硬件移植性(Linux 兼容),结果有更好的说服力
- 高扩展性,支持超过 4096 台主机的网络结构
.如果想要对某个节点的虚拟机单独进行命令操作,也十分简单,命令格式为 node cmd
。例如查看交换机 s1 上的网络信息,我们只需要在执行的 ifconfig 命令前加上 s1 主机标志即可,即 s1 ifconfig
,同样,如果我们想用 ping 3 个包的方法来测试 h2 跟 h3 之间连通情况,只需要执行 h2 ping -c 3 h3
即可。
mininet> h2 ping -c 3 h3
PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
64 bytes from 10.0.0.3: icmp_seq=1 ttl=64 time=7.19 ms
64 bytes from 10.0.0.3: icmp_seq=2 ttl=64 time=0.239 ms
64 bytes from 10.0.0.3: icmp_seq=3 ttl=64 time=0.136 ms
— 10.0.0.3 ping statistics —
3 packets transmitted, 3 received, 0% packet loss, time 2006ms
rtt min/avg/max/mdev = 0.136/2.523/7.194/3.303 ms
自定义拓扑
Mininet 提供了 Python API,可以用来方便的自定义拓扑结构。
在 mininet/custom 目录下给出了几个例子。例如在 topo-2sw-2host.py 文件中定义了一个 mytopo,则可以通过 --topo
选项来指定使用这一拓扑,命令为 sudo mn --custom ~/mininet/custom/topo-2sw-2host.py --topo mytopo --test pingall
。
同样的,我们可以通过下面的 Python 脚本来完成对一个2 层 tree 拓扑网络的测试。
from mininet.net import Mininet
from mininet.topolib import TreeTopo
tree4 = TreeTopo(depth=2,fanout=2)
net = Mininet(topo=tree4)
net.start()
h1, h4 = net.hosts[0], net.hosts[3]
print h1.cmd('ping -c1 %s' % h4.IP())
net.stop()
链路操作
在 Mininet cli 中,使用 link
命令,禁用或启用某条链路,格式为
link node1 node2 up/down
例如临时禁用 s1 跟 h2 之间的链路,可以用
link s1 h2 down
启动参数总结
-h, --help
打印帮助信息--switch=SWITCH
交换机类型,包括 [kernel user ovsk]--host=HOST
模拟主机类型,包括 [process]--controller=CONTROLLER
控制器类型,包括 [nox_dump none ref remote nox_pysw]--topo=TOPO,arg1,arg2,...argN
指定自带拓扑,包括 [tree reversed single linear minimal]-c, --clean
清理环境--custom=CUSTOM
使用自定义拓扑和节点参数--test=TEST
测试命令,包括 [cli build pingall pingpair iperf all iperfudp none]-x, --xterms
在每个节点上打开 xterm--mac
让MAC 地址跟 DP ID 相同--arp
配置所有 ARP 项-v VERBOSITY, --verbosity=VERBOSITY [info warning critical error debug output]
输出日志级别--ip=IP
远端控制器的IP地址--port=PORT
远端控制器监听端口--innamespace
在独立的名字空间内--listenport=LISTENPORT
被动监听的起始端口--nolistenport
不使用被动监听端口--pre=PRE
测试前运行的 CLI 脚本--post=POST
测试后运行的 CLI 脚本
常用命令总结
help
默认列出所有命令文档,后面加命令名将介绍该命令用法dump
打印节点信息gterm
给定节点上开启 gnome-terminal。注:可能导致 Mininet 崩溃xterm
给定节点上开启 xtermintfs
列出所有的网络接口iperf
两个节点之间进行简单的 iperf TCP测试iperfudp
两个节点之间用指定带宽 udp 进行测试net
显示网络链接情况noecho
运行交互式窗口,关闭回应(echoing)pingpair
在前两个主机之间互 ping 测试source
从外部文件中读入命令dpctl
在所有交换机上用 dptcl 执行相关命令,本地为tcp 127.0.0.1:6634
link
禁用或启用两个节点之间的链路nodes
列出所有的节点信息pingall
所有 host 节点之间互 pingpy
执行 Python 表达式sh
运行外部 shell 命令quit/exit
退出
其他操作
执行 sudo mn -c
会进行清理配置操作,适合故障后恢复。 执行 exit
会退出 Mininet 的 CLI,同时给出运行时间统计。 py cmd
使用 Python 来执行 cmd。 测试 Mininet 启动后立刻关闭的时间可以用 sudo mn --test none
。
使用 dpctl
dpctl 程序是一个命令行工具用来检测和管理 OpenFlow 数据通路,它能够显示当前的状态数据通路,包括功能配置和表中的条目,以及合适使用 OpenFlow 的内核模块,可以用来添加,删除,修改和监视 datapaths。
查看交换机端口信息基本情况(TCP 端口 6634 是默认交换机监听端口)。
# dpctl show tcp:9.123.137.25:6634
features_reply (xid=0x94af8117): ver:0x1, dpid:1
n_tables:255, n_buffers:256
features: capabilities:0xc7, actions:0xfff
1(s1-eth1): addr:2e:d1:ca:aa:af:67, config: 0, state:0
current: 10GB-FD COPPER
2(s1-eth2): addr:66:93:32:1e:9b:9e, config: 0, state:0
current: 10GB-FD COPPER
LOCAL(s1): addr:5e:bc:ab:cc:dc:43, config: 0x1, state:0x1
get_config_reply (xid=0x92fc9e48): miss_send_len=0
查看流表信息:
# dpctl dump-flows tcp:9.123.137.25:6634
stats_reply (xid=0xe2c7ea1e): flags=none type=1(flow)
此时,流表为空,执行 h1 ping h2 无法得到响应。因此我们需要通过 dpctl 手动添加流表项,实现转发。
手动添加流表项:
# dpctl add-flow tcp:9.123.137.25:6634 in_port=1,actions=output:2
# dpctl add-flow tcp:9.123.137.25:6634 in_port=2,actions=output:1
# dpctl dump-flows tcp:9.123.137.25:6634
stats_reply (xid=0x131ed782): flags=none type=1(flow)
cookie=0, duration_sec=13s, duration_nsec=401000000s, table_id=0, priority=32768, \
n_packets=0, n_bytes=0,idle_timeout=60,hard_timeout=0,in_port=1,actions=output:2
cookie=0, duration_sec=5s, duration_nsec=908000000s, table_id=0, priority=32768, \
n_packets=0, n_bytes=0,idle_timeout=60,hard_timeout=0,in_port=2,actions=output:1
此时查看流表可以看到新的转发信息,同时可以在 h1 和 h2 之间可以相互连通。执行
dpctl 其他常用操作
创建 datapath 编号为 0
#dpctl adddp n1:0
增加两个网络设备到新的 datapath
#dpctl adddp n1:0 eth0
#dpctl adddp n1:0 eth1
检测数据通路接收的流量
#dpctl monitor n1:0
在数据通路中删除网络设备
#dpctl delif nl:0 eth0
执行
dpctl show tcp:127.0.0.1:6634
可以查看到交换机的端口等基本情况,其中 tcp 端口 6634 是默认的交换机监听端口。
执行
dpctl dump-flows tcp:127.0.0.1:6634
可以看到更详细的流表信息。 此时,流表为空,执行 h2 ping h3
无法得到响应。因此我们需要通过 dpctl 手动添加流表项,实现转发。 命令为
dpctl add-flow tcp:127.0.0.1:6634 in_port=1,actions=output:2
dpctl add-flow tcp:127.0.0.1:6634 in_port=2,actions=output:1
此时查看流表可以看到新的转发信息,同时可以在 h2 和 h3 之间 ping 通。
控制器
通过执行
sudo mn --controller=remote --ip=[controller IP] --port=[controller listening port]
可以连接到控制器。
交换机与控制器交互
我们可以启动一个简单的控制器,默认没有任何流表项,仅仅作为一台带学习功能的交换机。控制器默认监听端口是 6633。
以下控制器与交换机之间的消息交互过程,可以通过 wireshark,配置 of 过滤器观察到交换机跟控制器之间的交互消息。 参见下面的表格。
消息 | 类型 | 描述 |
---|---|---|
Hello | Controller->Switch | 跟着 TCP 握手,控制器发送它的版本号到交换机。 |
Hello | Switch->Controller | 交换机回复它支持的版本。 |
Features Request | Controller->Switch | 控制器询问可用端口。 |
Set Config | Controller->Switch | 控制器让交换机发送流超时消息。 |
Features Reply | Switch->Controller | 交换机回复端口、端口速度、支持的表和行动。 |
同样,我们可以用 wireshark 观察到当第一次有 ping 包从 h2 发到 h3 时,控制器如何自动添加相应的表项到交换机。wireshark 相应的过滤器为 of && (of.type != 3) && (of.type != 2)
。
相关的消息过程参考下面的表格。 | 消息 | 类型 | 描述 | | -- | -- | -- | | Packet-In | Switch->Controller | 网包到达交换机,没有发生匹配,发送到控制器。| | Packet-Out | Controller->Switch | 从交换机端口发出包。| | Flow-Mod | Controller->Switch | 添加指定流。| | Flow-Expired | Switch->Controller | 流超时。
外部读取配置命令
可以写到一个文件中,用 Mininet 直接调用。例如脚本文件名为 my_cli_script,则可以执行
mininet> source my_cli_script
或者
# mn --pre my_cli_script
Mininet的基本操作就先介绍到这里,后续会有Mininet源码的分析,请小伙伴关注一下我,以后一起交流、学习。万分感谢,转载请标明原处。https://blog.csdn.net/qq_31667705/article/details/79882620
.