Featured image of post mininet拓扑创建的方法

mininet拓扑创建的方法

mininet创建拓扑可以使用命令行、Topo脚本、拓扑脚本方法

命令式

使用Mininet自带的最小化模型生成拓扑网络,网络中只有1个交换机,交换机下面连接2个主机

同时使用—mac设置MAC地址按顺序编址

1
sudo mn --controller=remote --switch=user --mac
1
ryu-manager --verbose simple_switch_13.py
  1. h1(d2:73)向全网发出ARP请求(ff:ff),请求获取h2的MAC地址
  2. h2(9a:03)接收到后,向h1进行回复
  3. h1向h2发送数据

因此全过程产生3次Packet-In消息,iperf过程正确

Mininet还支持多种预设的拓扑结构

1
2
3
4
sudo mn --topo=single,5 # 创建一个交换机连接5个主机的“单交换机”拓扑
sudo mn --topo=linear,3 # 创建一个线性拓扑,共3个交换机,每个交换机连接一个主机
sudo mn --topo=linear,3,2 # 创建一个线性拓扑,共3个交换机,每个交换机连接2个主机
sudo mn --topo=tree,3,2 # 创建一个树形拓扑,深度为3,每个节点分支数为2

使用Topo脚本创建拓扑

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
from mininet.topo import Topo

class MyTopo(Topo):
    "Simple topology example."

    def build( self ):
        "Create custom topo."
        aHost = self.addHost('h1')
        bHost = self.addHost('h2')
        cHost = self.addHost('h3')

        aSwitch = self.addSwitch('s4')
        bSwitch = self.addSwitch('s5')
        cSwitch = self.addSwitch('s6')

        self.addLink(aHost, aSwitch)
        self.addLink(bHost, bSwitch)
        self.addLink(cHost, cSwitch)
        self.addLink(aSwitch, bSwitch)
        self.addLink(bSwitch, cSwitch)

topos = {'mytopo':(lambda:MyTopo())}
1
sudo mn --controller=remote,ip=127.0.0.1,port=6653 --switch=user --custom ./mytopo.py --topo mytopo --mac

使用完全复写的拓扑脚本

使用该脚本出现了相同的问题——主机无法接收到数据包

Ps:该代码为使用Mininet自动化生成工具生成,具有一定的官方性,贴在此处以作备忘

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import sys
sys.path.append("/home/aspire/mininet")
from subprocess import call
from mininet.link import TCULink, Intf
from mininet.log import setLogLevel, info
from mininet.cli import CLI
from mininet.node import IVSSwitch
from mininet.node import OVSKernelSwitch, UserSwitch
from mininet.node import CPULimitedHost, Host, Node
from mininet.node import Controller, RemoteController, OVSController
from mininet.net import Mininet

def myNetwork(ip="127.0.0.1"):
    net = Mininet(topo=None,
                  build=False,
                  link=TCULink,
                  ipBase='10.0.0.0/8',
                  autoSetMacs=True)

    info('*** Adding controller\n')
    c0 = net.addController(name='c0',
                           controller=RemoteController,
                           protocol='tcp',
                           ip="127.0.0.1",
                           port=6653)

    info('*** Add switches\n')
    s1 = net.addSwitch('s1', cls=UserSwitch)
    s2 = net.addSwitch('s2', cls=UserSwitch)
    s3 = net.addSwitch('s3', cls=UserSwitch)

    info('*** Add hosts\n')
    h1 = net.addHost('h1', cls=Host, ip='10.0.0.1', defaultRoute=None)
    h2 = net.addHost('h2', cls=Host, ip='10.0.0.2', defaultRoute=None)
    h3 = net.addHost('h3', cls=Host, ip='10.0.0.3', defaultRoute=None)

    info('*** Add links\n')
    net.addLink(s1, h1)
    net.addLink(s2, h2)
    net.addLink(s3, h3)
    net.addLink(s1, s2)
    net.addLink(s2, s3)

    info('*** Starting network\n')
    net.build()

    info('*** Starting controllers\n')
    for controller in net.controllers:
        controller.start()

    info('*** Starting switches\n')
    net.get('s1').start([c0])
    net.get('s2').start([c0])
    net.get('s3').start([c0])

    info('*** Post configure switches and hosts\n')
    CLI(net)
    
    net.stop()

if __name__ == '__main__':
    setLogLevel('info')
    myNetwork()

查阅资料

Bad TCP SYN packets generated on veth interfaces in Ubuntu 16.04 · Issue #653 · mininet/mininet

在Mininet Github的问题反馈版板块中,存在类似问题的反馈,该问题被定义于UserSwitch在新版本Linux内核上运行时会出现的问题,问题表现为:

  1. UserSwitch的性能表现较差(相较于OVS)
  2. 在开启tx时,iperf完全无法运行

解决方案为关闭tx与rx

进一步解析Mininet代码,在Link.py中内置了关闭tx与rx的类TCULink,该类继承于TCLink

因此在创建拓扑的代码中,将link=TCLink更改为link=TCULink

在上述代码的基础上进行修改,iperf运行通过

Licensed under CC BY-NC-SA 4.0
皖ICP备2025083746号-1
公安备案 陕公网安备61019002003315号



使用 Hugo 构建
主题 StackJimmy 设计