当前位置: 首页 > news >正文

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. 节点初始化流程
开始
│
├─ 创建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管理命名空间,依赖cgroupstc(流量控制)。
  • 外部工具ovs-vsctl(配置OVS)、ryu-manager(Ryu控制器)。
3. 关键交互
  • 交换机与控制器OVSSwitchstart()中通过ovs-vsctl设置控制器地址。
  • 主机与网络Host通过setIP()配置IP,setDefaultRoute()设置路由。

总结

  • 代码逻辑:通过分层设计实现网络节点的虚拟化,利用Linux内核特性(命名空间、cgroups)和外部工具(OVS、Ryu)完成功能扩展。
  • 扩展性:新增交换机或控制器类型只需继承基类并实现关键方法(如start())。
  • 性能控制:通过cgroups限制CPU,通过tc限制带宽,实现细粒度的资源管理。

相关文章:

  • ViViT: 一种视频视觉Transformer
  • Cline 之Plan和Act模式
  • [大模型]AI Agent入门01——AI Agent概念梳理
  • Ollama 实战手册
  • 植被参数遥感反演技术革命!AI+Python支持向量机/随机森林/神经网络/CNN/LSTM/迁移学习在植被参数反演中的实战应用与优化
  • spark jar依赖顺序
  • SpringBoot原生实现分布式MapReduce计算
  • 进阶篇 第 6 篇:时间序列遇见机器学习与深度学习
  • Elasticsearch 使用reindex进行数据同步或索引重构
  • TockOS,一种新安全软件架构的RTOS介绍
  • 激活函数:神经网络的 “魔法开关”,开启智能之门(三)
  • 【Linux运维涉及的基础命令与排查方法大全】
  • Anaconda、conda和PyCharm在Python开发中各自扮演的角色
  • 机器学习06-RNN
  • EasyRTC打造无人机低延迟高清实时通信监控全场景解决方案
  • 电气动调节单座V型球阀带阀杆节流套沟槽孔板的作用-耀圣
  • 【Web API系列】Web Shared Storage API 深度解析:WindowSharedStorage 接口实战指南
  • RK3588 ubuntu20禁用自带的TF卡挂载,并设置udev自动挂载
  • JDBC对数据的增删改查操作:从Statement到PrepareStatement
  • Jupyter Notebook 中切换/使用 conda 虚拟环境的方式(解决jupyter notebook 环境默认在base下面的问题)
  • 再放宽!新版市场准入负面清单发布,无人驾驶航空器、电子烟等新业态被纳入
  • 宁夏中卫深化公立医院机构编制改革:市人民医院机构规格升为正处级
  • 融入长三角一体化发展,苏南名城镇江的优势和机遇何在
  • 男粉丝咬伤女主播嘴后写的条子引争议:赔偿“十万元”还是“十5元”?
  • 导演汪俊:与孙俪默契合作,还原“蛮好的人生”
  • 《国语汇校集注》:以1900余条注解,揭示隐微,提供思考