Mininet的原理和应用
2025-09-15 17:25:10

Mininet可以创建一个含有主机交换机控制器链路的虚拟网络,其交换机支持OpenFlow,具有高度灵活的自定义软件定义网络;同时也可将此进程虚拟化的平台下代码迁移到真实的环境中。

Mininet的由来

Mininet是由斯坦福大学基于Linux Container架构开发的一个进程虚拟化网络仿真工具。它采用轻量级的虚拟化技术使一个单一的系统看起来像一个完整的网络运行想过的内核系统和用户代码,也可简单理解为 SDN 网络系统中的一种基于进程虚拟化平台,它支持OpenFlow、OpenvSwith 等各种协议。

其最早的论文发表于2010年的SIGCOMM会议上,作者是斯坦福大学的B Lantz、Nick McKeown等人,后者是也是OpenFlow协议的主要设计者。

Mininet的原理和架构

Linux Container

从Linux 2.6.24版的内核开始,Linux 逐渐支持6种不同类型的命名空间。其中,最重要的三种分别是用户命名空间、进程命名空间和网络命名空间。

  • 用户命名空间:它是最基本的命名空间,它使得一个进程只能访问属于自己的资源,包括用户ID、组ID、文件系统、网络接口、进程列表等。
  • 进程命名空间:允许一个进程创建自己的进程树,每个进程都有自己的PID,并且只能访问属于自己的资源。
  • 网络命名空间:允许一个进程创建自己的网络栈,包括网络设备、路由表、防火墙规则等。

在每个命名空间中,都可以创建自己的文件系统、进程列表、网络接口等资源,但这些资源只能在该命名空间内使用。

每个Namespace下的资源对于其他Namespace下的资源都是透明,不可见的。因此在操作系统层面上看,就会出现多个相同pid的进程。而在用户层面上只能看到属于用户自己Namespace下的资源,例如使用ps命令只能列出自己Namespace下的进程。这样每个Namespace看上去就像一个单独的Linux系统。

在Mininet开源项目提供的教学案例中,有提到具体的Linux Container的实现原理。

最简单的网络实现最简单的网络实现

使用两个namespace,分别为h1和h2,用于模拟host1和host2。

通过虚拟化实现对主机和网络通信的模拟通过虚拟化实现对主机和网络通信的模拟

两个namespace之间通过veth pair(virtual ethernet pair)连接,veth pair是一种虚拟设备,它可以用来在两个命名空间之间传输数据。更加复杂的网络环境,可以使用Linux bridge、Open vSwitch等虚拟交换机。

轻量化模拟轻量化模拟

通过下面的的一系列Linux指令,就可以使用Linux Container创建多个虚拟网络环境,实现对最简单网络环境的模拟。

Mininet正是使用这种Linux Container技术实现的虚拟网络环境。使用python语言编写的Mininet代码,通过调用Linux系统的命名空间和网络管理工具,可以创建多个虚拟网络环境,并在这些环境中模拟真实网络环境的各种功能。

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
sudo bash
# Create host namespaces
ip netns add h1
ip netns add h2
# Create switch
ovs-vsctl add-br s1
# Create links
ip link add h1-eth0 type veth peer name s1-eth1
ip link add h2-eth0 type veth peer name s1-eth2
ip link show
# Move host ports into namespaces
ip link set h1-etho netns h1
ip link set h2-etho netns h2
ip netns exec h1 ip link show
ip netns exec h2 ip link show
# Connect switch ports to ovS
ovs-vsctl add-port s1 s1-eth1
ovs-vsctl add-port s1 s1-eth2
ovs-vsctl show
# Set up OpenFlow controller
ovs-vsctl set-controller s1 tcp:127.0.0.1
ovs-controller ptcp:&
ovs-vsctl show
# Configure network
ip netns exec h1 ifconfig h1-eth0 10.1
ip netns exec h1 ifconfig lo up
ip netns exec h2 ifconfig h2-eth0 10.2
ip netns exec h1 ifconfig lo up
ifconfig s1-eth1 up
ifconfig s1-eth2 up
# Test network
ip netns exec h1 ping -c1 10.2

Mininet的架构

在一个laptop中的模拟器mininet在一个laptop中的模拟器mininet

Mininet的架构是按照SDN的架构来设计的,分为虚拟化层和控制层。

虚拟化层:创建虚拟的网络设备,包括主机、交换机、链路等,对应SDN中的数据平面。

控制层:管理虚拟网络,包括启动、停止、配置、监控虚拟网络等,对应SDN中的控制平面。

  1. Mininet的主要组件包括:控制器、主机、交换机、链路。
  2. 控制器:控制器是Mininet的核心组件,它负责管理网络中的主机、交换机、链路,并提供网络服务。
  3. 主机:主机是Mininet的网络实体,它可以是物理机也可以是虚拟机。
  4. 交换机:交换机是Mininet的网络实体,它可以是物理交换机也可以是虚拟交换机。
  5. 链路:链路是Mininet的网络实体,它可以是物理链路也可以是虚拟链路。
  6. Mininet的架构可以分为两层,第一层是虚拟化层,它负责创建虚拟网络环境,包括创建主机、交换机、链路等;第二层是控制层,它负责管理虚拟网络环境,包括启动、停止、配置、监控虚拟网络等。

Mininet可以做什么

Mininet是一种仿真器,和模拟器最大的不同在于,它可以创建真实的网络环境,并在虚拟环境中运行各种网络服务。

Mininet可以做以下事情:

  • 为OpenFlow应用程序提供一个简单、便宜的网络测试平台
  • 启用复杂的拓扑测试,无需连接物理网络
  • 具有拓扑感知和OpenFlow感知的CLI,用于调试或运行网络范围的测试
  • 支持任意自定义拓扑,主机数可达4096,并包括一组基本的参数化拓扑
  • 提供用于网络创建和实验的可扩展Python API

Mininet的安装

由于使用Linux Container技术,Mininet需要安装Linux操作系统,并配置好相关的环境。
具体安装方式可查看Mininet安装文档

Mininet的使用

Mininet提供了一系列的命令行工具,用于创建、配置、运行、监控虚拟网络。

mininet命令树mininet命令树

网络构建参数

  • --topo:指定拓扑类型,如lineartreesingletorus等。
  • --controller:指定要使用的控制器类型,如remoteryuODL等。
  • --switch:指定交换机类型,默认使用OVSK,如ovskuser等。
  • --custom:指定自定义拓扑文件。
  • --mac:按顺序而非随机分配主机的MAC地址。设置简单唯一,肉眼也能看出mac地址对应的主机。

内部交互命令

使用sudo mn启动Mininet的命令行界面,可以输入内部命令,包括:

  • net:查看当前网络状态。

  • nodes:查看当前网络中的主机、交换机、控制器。

  • links:查看当前网络中的链路的状态。

  • intfs:查看当前网络中的接口的状态。

  • pingall:所有的主机之间互相ping,测试网络是否通畅。

  • xterm:对一个主机打开一个新的xterm窗口,用于运行主机上的命令。

  • ovs-ofctl:对OpenFlow交换机进行操作。

  • ovs-vsctl:对OpenFlow控制器进行操作。

  • mnexec:在所有主机上执行命令。

  • dpctl:对OpenFlow交换机进行流表的操作。

  • iperf:测试主机之间的TCP流量带宽。

  • iperfudp:测试主机之间的UDP流量带宽。

Mininet的应用

  • TODO

参考