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

  • 相关阅读:
    2981 大整数加法
    1160 矩阵的最大值(指针专题)
    1159 最大的两个数(指针专题)
    1127 矩阵乘积
    1126 布尔矩阵的奇偶性
    1125 上三角矩阵的判断
    1124 两个有序数组合并
    1123 最佳校友
    1122 小明的调查作业
    1121 电梯
  • 原文地址:https://www.cnblogs.com/cotyb/p/5252421.html
Copyright © 2020-2023  润新知