当前位置: 代码迷 >> 综合 >> Mininet教程(七)Mininet Walkthrough
  详细解决方案

Mininet教程(七)Mininet Walkthrough

热度:45   发布时间:2024-02-23 17:26:46.0

文章目录

  • 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包。
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一个非常实用和重要的特征。

(未完待续)