文章目录
- Mininet教程(七)Mininet Walkthrough
-
- 日常使用指令
-
- 显示mininet开启选项
- 开启Wireshark
- 主机与路由器之间交互
- 测试主机之间连通性
- 运行一个简单的web服务器和客户端
- 清理缓存
- 高级命令
-
- 运行回归测试
- 改变拓扑大小和类型
- (未完待续)
Mininet教程(七)Mininet Walkthrough
官网mininet walkthrough不完全翻译,原文
本教程展示了大部分mininet命令,以及和Wireshark的交互应用。
日常使用指令
显示mininet开启选项
$ sudo mn -h
开启Wireshark
为了通过Wireshark查看控制流,首先打开Wireshark
$ sudo wireshark
在Wireshark过滤器中,输入openflow"of",点击"Apply"。在Wireshark界面中,点击"Capture",然后"Interfaces",随后选择loopback接口"lo"。当前没有openflow的包显示在界面中。
Wireshark在Mininet虚拟镜像中默认安装的。如果你的系统没有Wireshark以及openflow插件,可以通过Mininet的安装脚本进行安装,命令如下:
$ cd ~
$ git clone https://github.com/mininet/mininet # if it's not already there
$ mininet/util/install.sh -w
在运行Wireshark中遇到问题,譬如$DISPLAY not set,可以查看这里。
我个人Wireshark版本2.6.8,界面和上述稍有不同:点击"捕获",借口选择"Loopback:lo",过滤器输入"openflow_v1"。
主机与路由器之间交互
启动最小拓扑并进入命令行界面:
$ sudo mn
此时Wireshark窗口中,已经可以看到捕获的openflow包。
显示MIninet 命令行指令:
mininet> help
显示节点:
mininet> nodes
显示链路:
mininet> net
显示节点所有信息:
mininet> dump
如果命令行的第一个字符串是主机,交换机或者控制器的名字,那么后续的命令就是在该节点中执行。例如:
mininet> h1 ifconfig -a
便能看到主机的"h1-eth0"和"lo"接口。在早期Linux系统中,接口"h1-eth0"在执行ifconfig命令时不能被看到(网络命名空间从linux内核3.8开始支持)。相反的,交换机默认在根网络的命名空间内,因此执行switch的命令和跟平常终端结果一样:
mininet> s1 ifconfig -a
其他例子还有执行"arp"和"route"指令在"s1"和"h1"上。
为每个主机,交换机和控制器都设置一个独立的命名空间也是可以的,但这样没多大好处,除非是在一个复杂的多个控制器网络中。Mininet也支持这样,详情见–innamespace选项。
在Mininet中,只有网络是虚拟的,每个节点其实都有一样的进程和目录。譬如查看主机下的进程目录:
mininet> h1 ps -a
这和交换机下的进程是完全一样的(当然除了ps):
mininet> s1 ps -a
在Linux 容器中设置不同的进程空间也是可以的,但目前Mininet不这么做。将每个进程都置于主进程命名空间会使得调试比较方便,因为你可以看到所有的进程。
测试主机之间连通性
执行命令:
mininet> h1 ping -c 1 h2
在wireshark中抓包可以看到:
h1主机根据地址解析协议(ARP)分析h2的MAC地址,因为当前并不知道谁是h2,因此发送一个packet_in消息给控制器。控制器随后发送packet_out命令将这条指令广播泛洪向交换机的其他接口。当h2看到这条地址解析请求后会发送一个答复给控制器,控制器将它返回给h1并推送一个流表记录(flow entry)。当h1知道了h2的地址之后,就会通过一个报文控制协议(ICMP)的echo request来ping。这个echo request以及它的答复都会经过控制器并导致流表推送。
再次执行:
mininet> h1 ping -c 1 h2
这次用的ping时间更短。因为这次报文控制已经在上一次的ping中被推送到交换机了。所以这次不会有控制流产生,数据包直接经过交换机,速度更快。
一个更简单的方式实在命令行界面执行"pingall",测试所有主机对的通信:
mininet> pingall
运行一个简单的web服务器和客户端
Mininet的主机可以运行任何底层Linux系统/虚拟机以及文件系统支持的命令和应用。也可以运行任意的bash命令,包括任务控制的"&",“jobs”,"kill"等等。
接下来,在h1上启动一个简单的HTTP服务器,并从h2发送一个请求,最后关闭这个服务器。
mininet> h1 python -m SimpleHTTPServer 80 &
mininet> h2 wget -O - h1
mininet> h1 kill %python
退出命令行界面:
mininet> exit
清理缓存
如果Mininet因为某些原因崩溃了,可以清理:
$ sudo mn -c
高级命令
运行回归测试
有的时候不必进入命令行界面,Mininet也可以运行自带的回归测试:
$ sudo mn --test pingpair
该命令创建了一个最小拓扑,开启openflow控制器,对所有的主机对进行ping测试,最后删除拓扑和控制器。
另外一个常用的测试命令是"iperf"(大概需要10秒左右完成):
$ sudo mn --test iperf
这条命令同样创建了一个一样的Mininet环境,在一台主机上运行iperf服务器,另一台主机上运行iperf客户端,进行带宽解析。
改变拓扑大小和类型
默认的拓扑是一个交换机连接俩主机,可以通过"–topo"选项改变拓扑并设置不同参数。例如,生成一个一个交换机带三主机的拓扑并进行"pingall"回归测试:
sudo mn --test pingall --topo single,3
另一个例子线型拓扑,每个主机都有一个对应的交换机,所有交换机连成一条线:
sudo mn --test pingall --topo linear,4
参数化拓扑是Mininet一个非常实用和重要的特征。