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脚本安装这两个系统,如下所示:

  1.  
    $ cd ~
  2.  
    $ git clone https://github.com/mininet/mininet # if it's not already there
  3.  
    $ mininet/util/install.sh -w

如果已安装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)。

对于突出显示的主机已经分离的网络状态,运行其它实例arproute在两个s1h1

可以将每个主机,交换机和控制器放置在其自己的隔离网络名称空间中,但是这样做并没有真正的优势,除非您要复制复杂的多控制器网络。Mininet确实支持这一点。见--innamespace选项。

请注意,只有网络才是虚拟的。每个主机进程都具有相同的进程和目录集。例如,从主机进程中打印进程列表:

mininet> h1 ps -a

这应该与根网络名称空间所看到的完全相同:

mininet> s1 ps -a

可以在Linux容器中使用单独的进程空间,但是当前Mininet并没有这样做。拥有一切运行中的“根”的过程命名为便于调试,因为它允许您使用的是看所有从控制台的过程中pskill

 

测试主机之间的连接

现在,确认您可以从主机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命令,包括作业控制(&jobskill,等。)

接下来,尝试在上启动一个简单的HTTP服务器h1,向发出请求h2,然后关闭Web服务器:

  1.  
    mininet> h1 python -m SimpleHTTPServer 80 &
  2.  
    mininet> h2 wget -O - h1
  3.  
    ...
  4.  
    mininet> h1 kill %python

退出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允许您设置链接参数,甚至可以从命令行自动设置这些参数:

  1.  
    $ sudo mn --link tc,bw=10,delay=10ms
  2.  
    mininet> iperf
  3.  
    ...
  4.  
    mininet> h1 ping -c10 h2

如果每个链路的延迟为10毫秒,则往返时间(RTT)应该约为40毫秒,因为ICMP请求遍历两个链路(一个到交换机,一个到目的地),并且ICMP答复遍历两个返回的链路。 。

您可以使用Mininet的Python API自定义每个链接 ,但现在您可能希望继续本演练。

可调详细度

默认的详细级别为info,它打印出Mininet在启动和拆卸期间的操作。将此与debug带有-v参数的完整输出进行比较:

  1.  
    $ sudo mn -v debug
  2.  
    ...
  3.  
    mininet> exit

许多额外的细节将打印出来。现在尝试output,该设置可以打印CLI输出,而其他几乎没有:

  1.  
    $ sudo mn -v output
  2.  
    mininet> exit

在CLI外部,可以使用其他详细级别,例如和warning,它与回归测试一起使用以隐藏不需要的函数输出。

自定义拓扑

还可以使用简单的Python API轻松定义自定义拓扑,并在中提供了一个示例custom/topo-2sw-2host.py。此示例直接连接两个交换机,每个交换机都关闭一台主机:

  1.  
    """Custom topology example
  2.  
     
  3.  
    Two directly connected switches plus a host for each switch:
  4.  
     
  5.  
    host --- switch --- switch --- host
  6.  
     
  7.  
    Adding the 'topos' dict with a key/value pair to generate our newly defined
  8.  
    topology enables one to pass in '--topo=mytopo' from the command line.
  9.  
    """
  10.  
     
  11.  
    from mininet.topo import Topo
  12.  
     
  13.  
    class MyTopo( Topo ):
  14.  
    "Simple topology example."
  15.  
     
  16.  
    def __init__( self ):
  17.  
    "Create custom topo."
  18.  
     
  19.  
    # Initialize topology
  20.  
    Topo.__init__( self )
  21.  
     
  22.  
    # Add hosts and switches
  23.  
    leftHost = self.addHost( 'h1' )
  24.  
    rightHost = self.addHost( 'h2' )
  25.  
    leftSwitch = self.addSwitch( 's3' )
  26.  
    rightSwitch = self.addSwitch( 's4' )
  27.  
     
  28.  
    # Add links
  29.  
    self.addLink( leftHost, leftSwitch )
  30.  
    self.addLink( leftSwitch, rightSwitch )
  31.  
    self.addLink( rightSwitch, rightHost )
  32.  
     
  33.  
     
  34.  
    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。

之前:

  1.  
    $ sudo mn
  2.  
    ...
  3.  
    mininet> h1 ifconfig
  4.  
    h1-eth0 Link encap:Ethernet HWaddr f6:9d:5a:7f:41:42
  5.  
    inet addr:10.0.0.1 Bcast:10.255.255.255 Mask:255.0.0.0
  6.  
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  7.  
    RX packets:6 errors:0 dropped:0 overruns:0 frame:0
  8.  
    TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
  9.  
    collisions:0 txqueuelen:1000
  10.  
    RX bytes:392 (392.0 B) TX bytes:392 (392.0 B)
  11.  
    mininet> exit

后:

  1.  
    $ sudo mn --mac
  2.  
    ...
  3.  
    mininet> h1 ifconfig
  4.  
    h1-eth0 Link encap:Ethernet HWaddr 00:00:00:00:00:01
  5.  
    inet addr:10.0.0.1 Bcast:10.255.255.255 Mask:255.0.0.0
  6.  
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  7.  
    RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  8.  
    TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  9.  
    collisions:0 txqueuelen:1000
  10.  
    RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
  11.  
    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

您现在应该看到多个流条目。另外(通常更方便),您可以使用dpctlMininet 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

 

posted @ 2020-12-26 10:15  常给自己加个油  阅读(630)  评论(0编辑  收藏  举报