Mininet日常使用一(官网)
第1部分:日常Mininet使用
首先,此演练的命令语法(可能很明显):
$
先于应在shell提示符下键入的Linux命令mininet>
先于应在Mininet的CLI上键入的Mininet命令,#
先于在root shell提示符下键入的Linux命令
在每种情况下,您只应在提示符右侧键入命令(然后按return
,当然!)。
显示启动选项
让我们开始使用Mininet的启动选项。
键入以下命令以显示描述Mininet的启动选项的帮助消息:
$ sudo mn -h
本演练将涵盖列出的大多数选项的典型用法。
启动Wireshark
要使用OpenFlow Wireshark解剖器查看控制流量,请首先在后台打开Wireshark:
$ sudo wireshark &
在“ Wireshark”过滤器框中,输入此过滤器,然后单击Apply
:
of
在Wireshark中,单击“捕获”,然后单击“接口”,然后在回送接口(lo
)上选择“启动” 。
目前,主窗口中不应显示任何OpenFlow数据包。
注意:默认情况下,Wireshark安装在Mininet VM映像中。如果您使用的系统没有安装Wireshark和OpenFlow插件,则可以使用Mininet的install.sh
脚本安装这两个系统,如下所示:
如果已安装Wireshark,但您无法运行它(例如,出现诸如的错误 $DISPLAY not set
,请查阅FAQ:https : //github.com/mininet/mininet/wiki/FAQ#wiki-x11-forwarding。)
正确设置X11将使您能够运行其他GUI程序和xterm
终端仿真器,这些功能将在本演练的稍后部分中使用。
与主机和交换机交互
启动最小拓扑并输入CLI:
$ sudo mn
默认拓扑是minimal
拓扑,它包括一个连接到两台主机的OpenFlow内核交换机,以及OpenFlow参考控制器。也可以在命令行上使用指定此拓扑--topo=minimal
。其他拓扑也可以直接使用。请参阅的--topo
输出部分mn -h
。
现在,所有四个实体(2个主机进程,1个交换进程,1个基本控制器)都在VM中运行。控制器可以在VM外部,其说明在底部。
如果没有通过特定的测试作为参数,则会显示Mininet CLI。
在Wireshark窗口中,您应该看到内核交换机已连接到参考控制器。
显示Mininet CLI命令:
mininet> help
显示节点:
mininet> nodes
显示链接:
mininet> net
转储有关所有节点的信息:
mininet> dump
您应该看到列出了交换机和两台主机。
如果在Mininet CLI中键入的第一个字符串是主机名,交换机名或控制器名,则命令将在该节点上执行。在主机进程上运行命令:
mininet> h1 ifconfig -a
您应该看到主机h1-eth0
和loopback(lo
)接口。请注意,h1-eth0
主Linux系统在ifconfig
运行时看不到该接口(),因为它特定于主机进程的网络名称空间。
相反,默认情况下,交换机在根网络名称空间中运行,因此在“交换机”上运行命令与从常规终端运行命令相同:
mininet> s1 ifconfig -a
这将显示交换机接口,以及VM的连接输出(eth0
)。
对于突出显示的主机已经分离的网络状态,运行其它实例arp
和route
在两个s1
和h1
。
可以将每个主机,交换机和控制器放置在其自己的隔离网络名称空间中,但是这样做并没有真正的优势,除非您要复制复杂的多控制器网络。Mininet确实支持这一点。见--innamespace
选项。
请注意,只有网络才是虚拟的。每个主机进程都具有相同的进程和目录集。例如,从主机进程中打印进程列表:
mininet> h1 ps -a
这应该与根网络名称空间所看到的完全相同:
mininet> s1 ps -a
可以在Linux容器中使用单独的进程空间,但是当前Mininet并没有这样做。拥有一切运行中的“根”的过程命名为便于调试,因为它允许您使用的是看所有从控制台的过程中ps
,kill
等
测试主机之间的连接
现在,确认您可以从主机0 ping到主机1:
mininet> h1 ping -c 1 h2
如果稍后在命令中出现带有节点名称的字符串,则该节点名称将被其IP地址替换;这发生在h2。
您应该看到OpenFlow控制流量。第一个主机的ARP为第二个主机的MAC地址,这导致packet_in
消息发送到控制器。然后,控制器发送一条packet_out
消息,将广播数据包泛洪到交换机上的其他端口(在此示例中,是唯一的其他数据端口)。第二台主机看到ARP请求并发送答复。该答复到达控制器,控制器将其发送到第一台主机并下推流条目。
现在,第一个主机知道第二个主机的MAC地址,并可以通过ICMP回显请求发送其ping。该请求及其来自第二个主机的相应答复都进入控制器,并导致流条目被下推(以及实际的数据包被发送出去)。
重复最后一个ping
:
mininet> h1 ping -c 1 h2
ping
第二次尝试的时间应该更少(<100us)。ping
先前在交换机中安装了覆盖ICMP流量的流条目,因此没有生成控制流量,并且数据包立即通过交换机。
运行此测试的一种更简单的方法是使用Mininet CLI内置pingall
命令,该命令执行全对操作ping
:
mininet> pingall
运行一个简单的Web服务器和客户端
请记住,这ping
不是您可以在主机上运行的唯一命令!Mininet主机可以运行基础Linux系统(或VM)及其文件系统可用的任何命令或应用程序。您也可以输入任何bash
命令,包括作业控制(&
,jobs
,kill
,等。)
接下来,尝试在上启动一个简单的HTTP服务器h1
,向发出请求h2
,然后关闭Web服务器:
-
-
-
...
-
退出CLI:
mininet> exit
清理
如果Mininet由于某些原因崩溃,请清理它:
$ sudo mn -c
第2部分:高级启动选项
运行回归测试
您无需进入CLI;Mininet也可以用于运行自包含的回归测试。
运行回归测试:
$ sudo mn --test pingpair
该命令创建了最小的拓扑,启动了OpenFlow参考控制器,进行了全对ping
测试,并拆除了拓扑和控制器。
另一个有用的测试是iperf
(大约需要10秒才能完成):
$ sudo mn --test iperf
此命令创建相同的Mininet,在一台主机上运行一台iperf服务器,在第二台主机上运行一台iperf客户端,并解析所获得的带宽。
更改拓扑的大小和类型
默认拓扑是连接到两个主机的单个交换机。您可以使用将其更改为其他拓扑--topo
,并为该拓扑的创建传递参数。例如,要验证一台交换机和三台主机的所有对ping连接,请执行以下操作:
运行回归测试:
$ sudo mn --test pingall --topo single,3
另一个示例,具有线性拓扑(每个交换机有一个主机,并且所有交换机都在一条线上连接):
$ sudo mn --test pingall --topo linear,4
参数化拓扑是Mininet最有用和最强大的功能之一。
链接变体
Mininet 2.0允许您设置链接参数,甚至可以从命令行自动设置这些参数:
-
-
-
...
-
如果每个链路的延迟为10毫秒,则往返时间(RTT)应该约为40毫秒,因为ICMP请求遍历两个链路(一个到交换机,一个到目的地),并且ICMP答复遍历两个返回的链路。 。
您可以使用Mininet的Python API自定义每个链接 ,但现在您可能希望继续本演练。
可调详细度
默认的详细级别为info
,它打印出Mininet在启动和拆卸期间的操作。将此与debug
带有-v
参数的完整输出进行比较:
-
-
...
-
许多额外的细节将打印出来。现在尝试output
,该设置可以打印CLI输出,而其他几乎没有:
在CLI外部,可以使用其他详细级别,例如和warning
,它与回归测试一起使用以隐藏不需要的函数输出。
自定义拓扑
还可以使用简单的Python API轻松定义自定义拓扑,并在中提供了一个示例custom/topo-2sw-2host.py
。此示例直接连接两个交换机,每个交换机都关闭一台主机:
-
"""Custom topology example
-
-
Two directly connected switches plus a host for each switch:
-
-
host --- switch --- switch --- host
-
-
Adding the 'topos' dict with a key/value pair to generate our newly defined
-
topology enables one to pass in '--topo=mytopo' from the command line.
-
"""
-
-
from mininet.topo import Topo
-
-
class MyTopo( Topo ):
-
"Simple topology example."
-
-
def __init__( self ):
-
"Create custom topo."
-
-
# Initialize topology
-
Topo.__init__( self )
-
-
# Add hosts and switches
-
leftHost = self.addHost( 'h1' )
-
rightHost = self.addHost( 'h2' )
-
leftSwitch = self.addSwitch( 's3' )
-
rightSwitch = self.addSwitch( 's4' )
-
-
# Add links
-
self.addLink( leftHost, leftSwitch )
-
self.addLink( leftSwitch, rightSwitch )
-
self.addLink( rightSwitch, rightHost )
-
-
-
topos = { 'mytopo': ( lambda: MyTopo() ) }
提供自定义的mininet文件后,它可以向命令行添加新的拓扑,交换机类型和测试。例如:
$ sudo mn --custom ~/mininet/custom/topo-2sw-2host.py --topo mytopo --test pingall
ID = MAC
默认情况下,主机以随机分配的MAC地址开头。这会使调试变得很困难,因为每次创建Mininet时,MAC都会改变,因此很难将控制流量与特定主机相关联。
该--mac
选项超级有用,并将主机MAC和IP地址设置为小的,唯一的,易于读取的ID。
之前:
-
$ sudo mn
-
...
-
mininet> h1 ifconfig
-
h1-eth0 Link encap:Ethernet HWaddr f6:9d:5a:7f:41:42
-
inet addr:10.0.0.1 Bcast:10.255.255.255 Mask:255.0.0.0
-
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
-
RX packets:6 errors:0 dropped:0 overruns:0 frame:0
-
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
-
collisions:0 txqueuelen:1000
-
RX bytes:392 (392.0 B) TX bytes:392 (392.0 B)
-
mininet> exit
后:
-
$ sudo mn --mac
-
...
-
mininet> h1 ifconfig
-
h1-eth0 Link encap:Ethernet HWaddr 00:00:00:00:00:01
-
inet addr:10.0.0.1 Bcast:10.255.255.255 Mask:255.0.0.0
-
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
-
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
-
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
-
collisions:0 txqueuelen:1000
-
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
-
mininet> exit
相反,Linux报告的交换机数据端口的MAC将保持随机。这是因为您可以使用FAQ中提到的OpenFlow将MAC“分配”到数据端口。这是一个微妙的点,您现在可能可以忽略。
XTerm显示
要进行更复杂的调试,您可以启动Mininet,以便产生一个或多个xterm。
要xterm
为每个主机启动一个并进行切换,请传递以下-x
选项:
$ sudo mn -x
一秒钟后,将弹出xterms,并自动设置窗口名称。
或者,您可以显示其他xterm,如下所示。
默认情况下,仅将主机放置在单独的名称空间中。每个交换机的窗口都是不必要的(即相当于常规终端),但是可以方便地运行和保留交换机调试命令,例如流计数器转储。
Xterms对于运行可能需要取消的交互式命令也很有用,您需要查看这些交互式命令的输出。
例如:
在标有“ switch:s1(root)”的xterm中,运行:
# dpctl dump-flows tcp:127.0.0.1:6634
什么都不会打印出来;交换机没有添加流量。要dpctl
与其他交换机一起使用,请以详细模式启动mininet,并在创建交换机时查看其被动侦听端口。
现在,在标有“ host:h1”的xterm中,运行:
# ping 10.0.0.2
返回s1
并转储流:#dpctl dump-flows tcp:127.0.0.1:6634
您现在应该看到多个流条目。另外(通常更方便),您可以使用dpctl
Mininet CLI内置的命令,而无需任何xterm或手动指定交换机的IP和端口。
您可以通过检查ifconfig来判断xterm是否在根名称空间中。如果显示了所有接口(包括eth0
),则该接口位于根名称空间中。此外,其标题应包含“(root)”。
从Mininet CLI关闭设置:
mininet> exit
xterms应该自动关闭。
其他开关类型
可以使用其他开关类型。例如,运行用户空间开关:
$ sudo mn --switch user --test iperf
请注意,TCP iperf报告的带宽比以前使用内核交换机看到的要低得多。
如果您执行前面显示的ping测试,您应该注意到会有更大的延迟,因为现在数据包必须承受额外的内核到用户空间的转换。由于OS可以安排代表主机的用户空间进程,因此ping时间将更具可变性。
另一方面,用户空间开关可能是实现新功能的良好起点,尤其是在软件性能不是很关键的情况下。
另一个示例交换机类型是Open vSwitch(OVS),它已预先安装在Mininet VM上。iperf报告的TCP带宽应类似于OpenFlow内核模块,并且可能更快:
$ sudo mn --switch ovsk --test iperf
小型网络基准
要记录建立和拆除拓扑的时间,请使用测试“无”:
$ sudo mn --test none
一切都在自己的命名空间中(仅限用户切换)
默认情况下,主机位于自己的名称空间中,而交换机和控制器位于根名称空间中。要将开关放在自己的名称空间中,请传递以下--innamespace
选项:
$ sudo mn --innamespace --switch user
交换机将不使用环回,而是通过单独的桥接控制连接与控制器通信。就其本身而言,该选项并不是非常有用,但是确实提供了一个示例,说明如何隔离不同的开关。
请注意,此选项(自11/19/12起)不适用于Open vSwitch。
mininet> exit
转发自:http://mininet.org/walkthrough/#run-a-simple-web-server-and-client