基于Linux Network Namespace的Mininet架构分析

Mininet作为一个轻量级的SDN仿真工具,在其系统实现架构中充分利用了Linux命名空间内核技术,其中Linux Network Namespace机制更是Mininet软件架构的基石,对网络资源的模拟发挥着重要作用。其实Linux Network Namespace在OpenStack和Docker等开源项目中也广泛应用。

什么是Linux Network Namespace?
从Linux 2.6.24版的内核开始,Linux 逐渐支持6种不同类型的命名空间。这其中包括进程间通信(IPC)的命名空间、进程命名空间、网络命名空间、挂载命名空间、UTS 命名空间、 用户命名空间。通过命名空间技术使得用户创建的进程能够与系统分离得更加彻底,从而不需要使用更多的底层虚拟化技术。Linux Namespaces机制提供一种资源隔离方案,使得PID、Network、IPC等系统资源不再具有全局性,而是属于某个特定的Namespace。每个Namespace下的资源对于其他Namespace下的资源都是透明,不可见的。因此在操作系统层面上看,就会出现多个相同pid的进程。而在用户层面上只能看到属于用户自己Namespace下的资源,例如使用ps命令只能列出自己Namespace下的进程。这样每个Namespace看上去就像一个单独的Linux系统。Linux的命名空间技术架构如下图所示:

基于Linux Network Namespace的Mininet架构分析 图片1

Network namespace主要提供了网络资源的隔离能力,包括网络设备、IPv4和IPv6协议栈、IP路由表、防火墙、/proc/net目录、/sys/class/net目录、端口(socket)等等。从网络命名空间的角度看,它代表着分配给一个或多个进程的私有网络资源集合。其主要特性集中在虚拟化和隔离。每个Linux container拥有其自己的网络设备(虚拟的)和用于绑定自己网络端口号的应用程序。主机上合适的路由规则可以将网络数据包和特定container相关的网络设备关联。网络命名空间的主要应用场景包括:1、多个网络命名空间可以拥有eth0和lo等网络设备;2、多个Apache服务器进程可以在不同网络命名空间的80端口上进行监听;3、一个进程不能嗅探其他网络命名空间的流量;4、一个进程不能关闭其他网络命名空间的接口。

后台进程可以运行在不同网络命名空间内的相同端口上,用户还可以自己虚拟出网卡。一个物理的网络设备最多存在于一个Network namespace中,你可以通过创建veth pair(虚拟网络设备对)在不同的Network namespace间创建通道进行通信。veth pair是用于不同Network namespace间进行通信的方式,veth pair将一个Network namespace数据发往另一个Network namespace的veth。

基于Linux Network Namespace的Mininet架构分析 图片2

简单veth pair通信机制

基于Linux Network Namespace的Mininet架构分析 图片3

多Network namespace借助bridge进行通信

Mininet如何使用网络命名空间技术?
Mininet使用Linux Network Namespaces来创建虚拟节点,默认情况下,在仿真网络中Mininet会为每一个host创建一个新的网络命名空间,同时在root Namespace(根进程命名空间)运行交换机和控制器的进程,因此这两个进程就共享同一个网络命名空间。由于每个主机都有各自独立的网络命名空间,我们就可以进行个性化的网络配置和网络程序部署。由于命名空间的虚拟技术没有提供类似于虚拟机的持久化能力,所以在Mininet关闭时不能保存所有的配置。

Mininet使用网络命名空间来让不同的Host进程拥有独立的网络上下文。在如下的示例中,两个虚拟主机H1和H2连接到交换机S1,通过Bash来模拟H1和H2,交换机S1运行在Linux内核运行的root namespace。H1和H2就拥有自己的网络命名空间以及私有网络接口h1-eth0和h2-eth0。交换机S1有两个端口s1-eth0和s1-eth1,通过veth pair与对应的主机接口相连,这样H1和H2就可以通过S1进行通信。s1-eth0和s1-eth1间的数据包转发通过软件交换机完成,它运行在root namespace并使用物理接口eth0,等待控制器的指令。

基于Linux Network Namespace的Mininet架构分析 图片4

其实基于Linux Network Namespace就可以原生支持操作系统层级的虚拟化,就可以被用来进行网络仿真。而Mininet工具使用Python语言对网络仿真过程所涉及的节点、拓扑、链路等进行了封装抽象,便于科研人员迅速开展仿真工作。Mininet创建的Network namespace是nameless的,所以通过ip netns list命令是查看不到的,而通过ip netns add命令创建的namespace是带name的,这是两者最明显的区别之处。这其中ip命令是iproute2软件包里面的一个强大的网络配置工具,它能够替代一些传统的网络管理工具,例如ifconfig、route等,使用权限为超级用户。几乎所有的Linux发行版本都支持该命令。

下面就看看两个具体的示例,一个是通过ip命令创建网络命名空间进行实验,另一个是通过Mininet的命令进行实验。两者相比,Mininet就凸显出优势,实验用户可以不再关心底层系统实现,而聚焦在上层实验逻辑上。

示例一:

基于Linux Network Namespace的Mininet架构分析 图片6

示例二:

然后使用pingall命令进行类似的实验

其实从Mininet的util.py中makeIntfPair、moveIntfNoRetry、moveIntf等函数实现,以及link.py文件中对makeIntfPair函数的调用可以看出一些端倪。在makeIntfPair函数中实现了接口管理,包括创建一对veth接口、关联node接口、建立连接映射等。Mininet通过对IP命令的封装实现了基于Linux Network namespace的网络构建。

参考资料:
1、介绍 Linux 的命名空间。https://linux.cn/article-5019-1.html
2、Docker背后的内核知识:命名空间资源隔离。http://linux.cn/article-5057-6.html
3、 Linux内核的namespace机制分析。http://blog.chinaunix.net/uid-20788636-id-4479145.html
4、Docker实践(4)—network namespace与veth pair。http://www.cnblogs.com/hustcat/p/3928261.html
5、mininet与namespace。http://vinllen.com/mininetyu-namespace/
6、Mininet Walkthrough。http://mininet.org/walkthrough
7、Mininet运作原理。http://hwchiu.logdown.com/posts/221370-mininet-parsing
8、Testing SDN behavior with Mininet。http://www.linux-magazine.com/Issues/2014/162/Mininet
9、Mininet network simulator review。

http://www.brianlinkletter.com/mininet-test-drive/

10、Mininet中虚拟机构成的分析。http://richardzhao.me/?p=369
11、linux IP 命令使用举例。http://blog.csdn.net/radkitty/article/details/3022181


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/12853.html
分享到:
相关文章
条评论

登录后才可以评论

SDNLAB君 发表于15-07-28
6