Mininet--node.py源码解析
算法逻辑详解
1. 核心类结构
代码通过面向对象的方式定义了网络模拟中的各类节点,继承关系如下:
Node
├── Host
│ └── CPULimitedHost
├── Switch
│ ├── UserSwitch
│ ├── OVSSwitch
│ ├── OVSBridge
│ └── IVSSwitch
└── Controller├── OVSController├── NOX├── Ryu└── RemoteController
2. 核心功能模块
-
Node(基类)
- 功能:所有网络节点的基类,提供基础功能(如启动shell、管理接口、执行命令)。
- 关键方法:
startShell()
:通过pty
创建伪终端,启动交互式shell。addIntf()
:添加网络接口到节点。cmd()
:在节点上执行命令并等待输出。cleanup()
:清理资源(如关闭进程、卸载目录)。
-
Host
- 功能:普通虚拟主机,继承自
Node
,无额外功能扩展。
- 功能:普通虚拟主机,继承自
-
CPULimitedHost
- 功能:通过cgroups限制CPU资源。
- 关键方法:
setCPUFrac()
:设置CPU使用率上限。initCgroups()
:初始化cgroup配置。
-
Switch
- 功能:交换机基类,支持OpenFlow协议。
- 关键方法:
start()
:启动交换机进程(需子类实现)。stop()
:终止进程并清理接口。
-
OVSSwitch
- 功能:基于Open vSwitch的交换机。
- 关键方法:
start()
:通过ovs-vsctl
和ovs-ofctl
配置OVS实例。attach()
/detach()
:动态添加/移除接口。
-
Controller
- 功能:OpenFlow控制器基类。
- 关键方法:
start()
:启动控制器进程(如controller
或ovs-controller
)。
-
RemoteController
- 功能:外部控制器代理,不启动本地进程,仅管理远程连接。
程序流程图
1. 节点初始化流程
开始
│
├─ 创建Node实例
│ ├─ 初始化名称、命名空间、私有目录
│ ├─ 调用startShell()启动shell进程
│ └─ 挂载私有目录(mountPrivateDirs)
│
├─ Host/Switch/Controller子类初始化
│ └─ 扩展父类功能(如OVSSwitch设置dpid)
│
└─ 返回节点实例
2. 接口管理流程(以OVSSwitch为例)
开始
│
├─ 调用addIntf(intf)
│ ├─ 分配端口号(newPort())
│ ├─ 将接口加入intfs和ports字典
│ └─ 调用ovs-vsctl添加端口
│
├─ 接口配置(TCIntf或OVSIntf)
│ └─ 设置带宽、延迟等参数
│
└─ 接口就绪
3. 命令执行流程(以cmd()为例)
开始
│
├─ 调用sendCmd(command)
│ ├─ 通过伪终端写入命令
│ └─ 返回异步句柄
│
├─ 调用waitOutput()
│ ├─ 循环读取输出,直到遇到终止符(ASCII 127)
│ └─ 返回完整输出
│
└─ 命令执行完成
4. CPU限制流程(CPULimitedHost)
开始
│
├─ 调用setCPUFrac(f)
│ ├─ 初始化cgroup(initCgroups)
│ ├─ 根据调度策略(CFS/RT)设置period和quota
│ └─ 通过cgset写入cgroup参数
│
└─ CPU限制生效
程序嵌套关系
1. 类继承与方法覆盖
- Node 提供基础方法,子类通过重写扩展:
Switch
重写start()
和stop()
。CPULimitedHost
扩展config()
以支持CPU限制。
2. 模块依赖
- Linux内核功能:通过
mnexec
管理命名空间,依赖cgroups
和tc
(流量控制)。 - 外部工具:
ovs-vsctl
(配置OVS)、ryu-manager
(Ryu控制器)。
3. 关键交互
- 交换机与控制器:
OVSSwitch
在start()
中通过ovs-vsctl
设置控制器地址。 - 主机与网络:
Host
通过setIP()
配置IP,setDefaultRoute()
设置路由。
总结
- 代码逻辑:通过分层设计实现网络节点的虚拟化,利用Linux内核特性(命名空间、cgroups)和外部工具(OVS、Ryu)完成功能扩展。
- 扩展性:新增交换机或控制器类型只需继承基类并实现关键方法(如
start()
)。 - 性能控制:通过cgroups限制CPU,通过tc限制带宽,实现细粒度的资源管理。