计算机网络 lab2 使用 Mininet 创建网络拓扑

一、Miniset 简介

Miniset 是一个开源的网络仿真器,是一个轻量级软件定义网络和测试平台,支持 OpenFlow 和 OpenSwitch 等协议。
Miniset 上运行的代码可以轻松移植到支持 OpenFlow 的硬件设备上。
Mininet 提供 python API,简单易用

二、环境搭建

安装 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
$ su root
$ apt-get install git
$ git clone http://github.com/mininet/mininet.git
$ cd mininet/util
#./install.sh n3v
//n:安装 mininet 的依赖和核心文件
//3:安装 Openflow 1.3 版本
//v:安装 Open Switch
$ mn // 创建默认最小的网络拓扑,测试 mininet 是否安装成功
miniset> pingall // 查看连通性
miniset> exit // 退出 miniset
#### 安装 ryu
$ wget https://bootstrap.pypa.io/get-pip.py//pip 是一个通用的 python 包管理工具
//wget 是从指定的 url 下载文件
$ python get-pip.py
$ git clone https://github.com/osrg/ryu.git
$ cd ryu
$ pip install -r tools/pip-requires// 安装 ryu 之前先安装 ryu 的依赖
// 这一步要按照的依赖比较多,可能因为下载不全而出现报错,这时就重新执行一遍
// 报错 2
$ python setup.py install
$ cd ryu/app// 验证 ryu 是否按照成功
$ ryu-manager example_switch_13.py// 先不要点击 enter,先打开另一个终端运行
//su root
//mn --controller=remote
// 创建完网络拓扑之后,可以执行 ryu-manager

https://joechang0113.github.io/2020/02/18/mininet-ryu-install.html
尝试打开可视化界面:

1
2
$ cd /mininet/mininet/examples
$ ./miniedit.py

报错 1:运行 miniedit.py 时报错 ImportError: No module named mininet.log
是 python 版本的问题
http://shangdixinxi.com/detail-1528015.html
报错 2:pip install,Error:Cannot uninstall ‘PyYAML’.
原因:从 pip 10 开始就不支持卸载 distutils 的包了
解决方法:pip install —ignore-installed PyYAML
https://www.twblogs.net/a/5e50e655bd9eee2117bff2c9
报错 3:
有些错误是因为 ubuntu 的 python 默认版本是 2.7 导致的
所以按照以下方式改变 python 的默认版本
1
2
3
4
5
6
7
8
9
10
11
$ update-alternatives --list python // 列出所有可用的 python 替代版本信息
$ update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
$ update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2
$ update-alternatives --install /usr/bin/python python /usr/bin/python3.7 3
$ update-alternatives --config python
# 第一个参数: --install 表示向 update-alternatives 注册服务名。
# 第二个参数:注册最终地址,成功后将会把命令在这个固定的目的地址做真实命令的软链,以后管理就是管理这个软链;
# 第三个参数:服务名,以后管理时以它为关联依据。
# 第四个参数:被管理的命令绝对路径。
# 第五个参数:优先级,数字越大优先级越高。
https://www.jianshu.com/p/3d8304f4fb4a

报错 4:terminal 打不开
https://blog.csdn.net/u011622434/article/details/103121262
首先,按 ctrl+alt+F1(我是 ctrl+alt+F5)进入命令行模式,也就是无图形界面,这时候会让你输入用户名和密码
1
$ gnome-terminal

该指令是查看出现的终端错误,我有两处错误
错误一:No module named “apt_pkg”,解决方法如下
1
2
3
4
$ sudo apt-get remove --purge python-apt
$ sudo apt-get install python-apt -f
$ cd /usr/lib/python3/dist-packages/
$ sudo cp apt_pkg.cpython-35m-x86_64-linux-gnu.so apt_pkg.cpython-36m-x86_64-linux-gnu.so

错误二:cannot import name ‘_gi’,解决方法如下
1
2
3
cd /usr/lib/python3/dist-packages/gi/
sudo cp _gi.cpython-35m-x86_64-linux-gnu.so _gi.cpython-36m-x86_64-linux-gnu.so
sudo cp _gi_cairo.cpython-35m-x86_64-linux-gnu.so _gi_cairo.cpython-36m-x86_64-linux-gnu.so

三、Mininet 常用指令

Mininet 安装与使用教程

四、熟悉常用指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ su root
$ cd mininet/mininet
$ cd examples
// 里面有很多 python 脚本,可以随便选择一个执行,熟悉
// 在执行之前,要在另一个终端将 ryu 控制器打开
//$ su root
//$ cd
//$ cd ryu/app
//$ ryumanager simple_switch.py
$ python 427.py
miniset> nodes // 显示节点列表
miniset> pingall // 查看连通性
miniset> net // 查看网络拓扑
miniset> links // 查看网阔健壮性
miniset> dump // 节点的接口设置和进程 PID
miniset> iperf h1 h2 // 网络带宽设置
miniset> help // 帮助
miniset> exit // 退出 miniset

五、Mini 搭建网络拓扑的三种方式

1. 通过命令行 terminal

单一拓扑 (Single)
1
sudo mn --topo=single,3

线性拓扑
1
sudo mn --topo=linear,3

树形拓扑
1
2
sudo mn --topo=tree,depth=2,fanout=3
//depth=2 表示交换机有两层,fanout=3 表示每台交换机均下挂 3 台设备

自定义拓扑

通过 python 文件

py net.addSwitch (‘s3’) // 添加交换机 23
py net.addHost (‘h3’) // 添加主机 h3
py net.addLink (s1, net.get (‘h3’)) // 添加 s1 和 h3 之间的链接
py s1.attach (‘s1-eth3’) //s1 上添加 eth3 接口 (端口)
py net.get (‘h3’).cmd (‘ifconfig h3-eth0 10.3’) // 给 h3 配置 ip 地址为 10.0.0.3

通过可视化界面

1
2
$ cd /mininet/mininet/examples
$ ./miniedit.py


Edit 设置网段,host 的 IP 地址要和网段对应
右键设置控制器、交换机、主机的 property
设置好之后,开启另一个终端,开启 ryu,然后再回到可视化界面点选 run
(开启 ryu:cd/ryu/ryu/app 然后 ryu-maneger simple_switch.py)
可以将这个拓扑存成 python 文件:点击 stop,点选 File-Export Level 2 Script

六、lab2

问题 1

Simulate the following topology in Mininet. Set the link bandwidth for (s1,s2) and (s1,s3) as 10Mbps. Use iperf3 to test the TCP throughput between h1 to h2, h3, h4.(30 points)
知识点:带宽设置

1
2
#10 Mbps, 5ms 延迟,0% 丢包,1000 字节的大小  
self.addLink (host, switch, bw=10, delay='5ms', loss=0, max_queue_size=1000, use_htb=True)

Mininet 系列实验(五):Mininet 设置带宽之简单性能测试

报错:mininet 中运行网络拓扑时
Exception:Error creating interface pair (s1-eth1,s2-eth1): RTNETLINK answers: File exists
这是因为重复构建了相同的拓扑,没有清除,所以若在.py 中构建相同的拓扑图时需要先清除掉先前的拓扑结构:

1
$ sudo mn -c

https://blog.csdn.net/weixin_46490821/article/details/109065097

计算机网络系列

计算机网络 lab1
计算机网络 lab2 使用 Mininet 创建网络拓扑
计算机网络 lab3 使用 Socket 完成多人聊天室 — 原理
计算机网络 lab3 使用 Socket 完成多人聊天室 — 实作
计算机网络 lab4 Overlay Network 和 VXLAN