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

  • 相关阅读:
    抓取用户openid
    getaccesstoken方法
    https_request请求接口返回数据
    composer安装
    Linux下mysql数据库root无法登录的情况
    nginx安装
    shell脚本采用crontab定时备份数据库日志
    Python之元类详细解析
    Python面向对象之封装、property特性、绑定方法与非绑定方法
    Python之面向对象的组合、多态、菱形问题、子类中重用父类的两种方式
  • 原文地址:https://www.cnblogs.com/cotyb/p/5252421.html
Copyright © 2011-2022 走看看