Mininet--node.py源码解析

算法逻辑详解

1. 核心类结构

代码通过面向对象的方式定义了网络模拟中的各类节点,继承关系如下:

复制代码
Node
├── Host
│   └── CPULimitedHost
├── Switch
│   ├── UserSwitch
│   ├── OVSSwitch
│   ├── OVSBridge
│   └── IVSSwitch
└── Controller
    ├── OVSController
    ├── NOX
    ├── Ryu
    └── RemoteController
2. 核心功能模块
  1. Node(基类)

    • 功能:所有网络节点的基类,提供基础功能(如启动shell、管理接口、执行命令)。
    • 关键方法
      • startShell():通过pty创建伪终端,启动交互式shell。
      • addIntf():添加网络接口到节点。
      • cmd():在节点上执行命令并等待输出。
      • cleanup():清理资源(如关闭进程、卸载目录)。
  2. Host

    • 功能 :普通虚拟主机,继承自Node,无额外功能扩展。
  3. CPULimitedHost

    • 功能:通过cgroups限制CPU资源。
    • 关键方法
      • setCPUFrac():设置CPU使用率上限。
      • initCgroups():初始化cgroup配置。
  4. Switch

    • 功能:交换机基类,支持OpenFlow协议。
    • 关键方法
      • start():启动交换机进程(需子类实现)。
      • stop():终止进程并清理接口。
  5. OVSSwitch

    • 功能:基于Open vSwitch的交换机。
    • 关键方法
      • start():通过ovs-vsctlovs-ofctl配置OVS实例。
      • attach()/detach():动态添加/移除接口。
  6. Controller

    • 功能:OpenFlow控制器基类。
    • 关键方法
      • start():启动控制器进程(如controllerovs-controller)。
  7. RemoteController

    • 功能:外部控制器代理,不启动本地进程,仅管理远程连接。

程序流程图

1. 节点初始化流程
plaintext 复制代码
开始
│
├─ 创建Node实例
│   ├─ 初始化名称、命名空间、私有目录
│   ├─ 调用startShell()启动shell进程
│   └─ 挂载私有目录(mountPrivateDirs)
│
├─ Host/Switch/Controller子类初始化
│   └─ 扩展父类功能(如OVSSwitch设置dpid)
│
└─ 返回节点实例
2. 接口管理流程(以OVSSwitch为例)
plaintext 复制代码
开始
│
├─ 调用addIntf(intf)
│   ├─ 分配端口号(newPort())
│   ├─ 将接口加入intfs和ports字典
│   └─ 调用ovs-vsctl添加端口
│
├─ 接口配置(TCIntf或OVSIntf)
│   └─ 设置带宽、延迟等参数
│
└─ 接口就绪
3. 命令执行流程(以cmd()为例)
plaintext 复制代码
开始
│
├─ 调用sendCmd(command)
│   ├─ 通过伪终端写入命令
│   └─ 返回异步句柄
│
├─ 调用waitOutput()
│   ├─ 循环读取输出,直到遇到终止符(ASCII 127)
│   └─ 返回完整输出
│
└─ 命令执行完成
4. CPU限制流程(CPULimitedHost)
plaintext 复制代码
开始
│
├─ 调用setCPUFrac(f)
│   ├─ 初始化cgroup(initCgroups)
│   ├─ 根据调度策略(CFS/RT)设置period和quota
│   └─ 通过cgset写入cgroup参数
│
└─ CPU限制生效

程序嵌套关系

1. 类继承与方法覆盖
  • Node 提供基础方法,子类通过重写扩展:
    • Switch 重写 start()stop()
    • CPULimitedHost 扩展 config() 以支持CPU限制。
2. 模块依赖
  • Linux内核功能 :通过mnexec管理命名空间,依赖cgroupstc(流量控制)。
  • 外部工具ovs-vsctl(配置OVS)、ryu-manager(Ryu控制器)。
3. 关键交互
  • 交换机与控制器OVSSwitchstart()中通过ovs-vsctl设置控制器地址。
  • 主机与网络Host通过setIP()配置IP,setDefaultRoute()设置路由。

总结

  • 代码逻辑:通过分层设计实现网络节点的虚拟化,利用Linux内核特性(命名空间、cgroups)和外部工具(OVS、Ryu)完成功能扩展。
  • 扩展性 :新增交换机或控制器类型只需继承基类并实现关键方法(如start())。
  • 性能控制:通过cgroups限制CPU,通过tc限制带宽,实现细粒度的资源管理。
相关推荐
漫谈网络1 个月前
智能资源管理机制-重传机制
网络·滑动窗口·sdn·数据通信·重传
Yant2242 个月前
Django REST Framework 请求封装源码解析与实现流程
django·sqlite·drf·request·源码解析
漫谈网络2 个月前
Mininet--moduledeps.py源码解析
网络·network·sdn·mininet
漫谈网络2 个月前
从连接到交互:SDN 架构下 OpenFlow 协议的流程与报文剖析
sdn·openflow
伊灵eLing3 个月前
【HUSTOJ 判题机源码解读系列01】判题机架构、判题流程浅析
c语言·系统编程·源码解析·hustoj·online judge·在线判题系统
别NULL5 个月前
《现代网络技术》读书笔记:网络虚拟化
linux·网络·sdn·nfv
查士丁尼·绵6 个月前
SDN在云计算中的应用与实践
云计算·sdn·vxlan·evpn
别NULL6 个月前
《现代网络技术》读书笔记:SDN应用平面
linux·网络·sdn
别NULL6 个月前
《现代网络技术》读书笔记:SDN数据平面和OpenFlow
linux·网络·平面·sdn