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的设计思路和理念还是比较常用的,所以了解其大概的思路还是必须的。

posted @   cotyb  阅读(3414)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
AmazingCounters.com
点击右上角即可分享
微信分享提示