Mininet的内部实现原理简介
原文发表在我的博客主页,转载请注明出处.
前言
之前模拟仿真网络一直用的是Mininet,包括写了一些关于Mininet安装,和真实网络相连接,Mininet简历拓扑的博客,但是大多数都是局限于具体步骤的使用,直到今天,被问了一句:你知道Mininet的内部实现原理吗?瞬间懵比,所以找找资料搞明白这个问题。
实现原理
要了解Mininet的内部实现,需要了解Linux容器———网络命名空间。网络命名空间允许创建虚拟的网络域,这个网络域拥有自己的接口,IP地址,路由表等。网络命名空间通过虚拟的以太网链路连接到外面的网络,虚拟以太网链路有两个端,一端位于本地命名空间,另一个位于全局命名空间,网络命名空间在Docker和OpenStack中也同样不可或缺,在OpenStack的Neutron网络管理模块中,网络命名空间将租户独立,并且可以让他们拥有重叠的IP地址。
Mininet是如何实现呢?
- 网络命名空间用于实现主机或者端,每个主机拥有自己的接口,IP地址和路由表
- OVS或者Linux交换机用于实现交换机,默认使用的是OVS,OpenFlow用于对数据平面编程,ovsdb用来设置配置文件
- 控制链路的特性比如带宽,延时等用的是Linux的tc工具
- Mininet使用python将上面的工具以及其他的比如perf进行了包装。
现在欲创建一个最基本的网络:两个主机,一个交换机,两个主机分别连在交换机上面,这个拓扑是Mininet默认的,所以直接使用Mininet的启动命令"mn"就可以了,但是这个拓扑的创建在Linux系统中有哪些等价命令呢?
# 1. 创建两个命名空间,分别命名为h1,h2
ip netns add h1
ip netns add h2
# 2. 创建拓扑所需的交换机s1
ovs-vsctl add-br s1
# 3. 创建以太网链路来连接两个主机和交换机
ip link add h1-eth1 type veth peer name s1-eth1
ip link add h2-eth1 type veth peer name s1-eth2
# 4. 把主机的端口移到对应命名空间
ip link set h1-eth1 netns h1
ip link set h2-eth1 netns h2
# 5. 把交换机端口连接到OVS上
ovs-vsctl add-port s1 s1-eth1
ovs-vsctl add-port s1 s1-eth2
# 6. 连接控制器
ovs-vsctl set-controller s1 tcp:127.0.0.1
# 7. 设置IP
ip netns exec h1 ifconfig h1-eth1 10.0.0.1
ip netns exec h1 ifconfig lo up
ip netns exec h2 ifconfig h2-eth1 10.0.0.2
ip netns exec h2 ifconfig lo up
ifconfig s1-eth1 up
ifconfig s1-eth2 up
总结
虽然不想重复造轮子,但是Mininet的设计思路和理念还是比较常用的,所以了解其大概的思路还是必须的。
不向静中参妙理,纵然颖悟也虚浮
立乎其大 和而不同
古之成大事者,不惟有超世之才,亦必有坚韧不拔之志
分类:
Mininet
标签:
mininet
, network namespace
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?