谨以该文档开始自己源码阅读时光
How does it work?
Mininet creates virtual networks using process-based virtualization and network namespaces - features that are available in recent Linux kernels. In Mininet, hosts are emulated as bash processes running in a network namespace, so any code that would normally run on a Linux server (like a web server or client program) should run just fine within a Mininet "Host". The Mininet "Host" will have its own private network interface and can only see its own processes. Switches in Mininet are software-based switches like Open vSwitch or the OpenFlow reference switch. Links are virtual ethernet pairs, which live in the Linux kernel and connect our emulated switches to emulated hosts (processes).
- bin/mn 主运行文件,安装后执行 mn 即调用的本程序,是 Python 程序。
mnexec.c 执行一些快速命令,比如关闭文件描述符等,是 C 程序,编译后生成二进制文件 mnexec 被 Python 库调用。
mininet.link 模块
描述链路相关的接口和连接。包括 Intf 类、Link 类、TCIntf 类和 TCLink 类。
mininet.link.Intf
表示基本的网络接口,比如 h1-eth0 表示 host 1 上的 eth0 接口。 属性包括所在的节点,名称,所接的 link,mac/ip 信息等。 构造的时候会传入节点、端口等属性,并绑定接口到对应的节点的端口上。
def __init__( self, name, node=None, port=None, link=None,**params ):
"""name: interface name (e.g. h1-eth0)
node: owning node (where this intf most likely lives)
link: parent link if we're part of a link
other arguments are passed to config()"""
self.node = node
self.name = name
self.link = link
self.mac, self.ip, self.prefixLen = None, None, None
# Add to node (and move ourselves if necessary )
node.addIntf( self, port=port )
# Save params for future reference
self.params = params
self.config( **params )
所支持的方法包括配置 mac/ip 等配置方法,大都是通过 ifconfig 命令在对应节点上调用cmd方法来实现。 此外,还提供了 config() 方法来一次性配置所有的属性。
mininet.link.TCIntf
被 TC(Linux 下的 traffic control 的工具)自定义的接口,可以配置包括带宽、延迟、丢包率、最大队列长度等参数
拓展阅读:Linux 下的高级流控技术
https://www.ibm.com/developerworks/cn/linux/1412_xiehy_tc/
mininet.node 模块
节点模块表示网络中的基本元素(包括主机、交换机和控制器),十分关键。
其中,每个主机默认在一个单独的名字空间中,交换机和控制器都在 root 名字空间中。
- mnexec 通过参数 -n将process
re.py 模块
在程序中,都会加载 re 模块,该模块为正则表达式函数库,
可扩展学习 正则表达式
待学习 mark下
Mininet一个简单拓扑搭建过程
官网介绍mininet提供分析思路
网络命名空间概念和理解
利用linux命令行生成的网络
再结合上面的mininet拓扑搭建过程博文就可以清楚理解整个网络的搭建过程。
# 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-eth0 netns h1
ip link set h2-eth0 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
所有的设置在系统关闭后会自动释放。