原文发表在我的博客主页,转载请注明出处.

前言

之前模拟仿真网络一直用的是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的内部实现原理简介的更多相关文章

  1. kafka原理简介并且与RabbitMQ的选择

    kafka原理简介并且与RabbitMQ的选择 kafka原理简介,rabbitMQ介绍,大致说一下区别 Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和 ...

  2. InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)

      上一篇文章中对ThreadLocal进行了详尽的介绍,另外还有一个类: InheritableThreadLocal 他是ThreadLocal的子类,那么这个类又有什么作用呢?   测试代码 p ...

  3. Nginx 反向代理工作原理简介与配置详解

    Nginx反向代理工作原理简介与配置详解   by:授客  QQ:1033553122   测试环境 CentOS 6.5-x86_64 nginx-1.10.0 下载地址:http://nginx. ...

  4. Oracle Golden Gate原理简介

    Oracle Golden Gate原理简介 http://www.askoracle.org/oracle/HighAvailability/20140109953.html#6545406-tsi ...

  5. NAT原理简介、各种 ADSL Modem 及路由器的端口映射方法

    NAT原理简介 NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Force ...

  6. DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解

    本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Multilayer Perceptron,如果你想详细了解多层感知机算法,可以参考:UFLDL教程,或者参 ...

  7. KVO内部实现原理

    KVO的原理: 只要给一个对象注册一个监听, 那么在运行时, 系统就会自动给该对象生成一个子类对象, (格式如:NSKVONotifying_className), 并且重写自动生成的子类对象的被监听 ...

  8. storm 原理简介及单机版安装指南——详细版【转】

    storm 原理简介及单机版安装指南 本文翻译自: https://github.com/nathanmarz/storm/wiki/Tutorial 原文链接自:http://www.open-op ...

  9. Angular单页应用&AngularJS内部实现原理

    回顾 自定义指令 登录后获取登录信息session 首先在登录验证的时候保存一个user 在学生管理页面中运用ajax调用获取到登录的用户信息 对注销按钮添加点击事件:调用ajax在表现层给user赋 ...

随机推荐

  1. Mongodb Manual阅读笔记:CH4 管理

    4 管理 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...

  2. MySQL客户端工具 SQLyog

    我最喜欢它的History功能,把执行过的操作对应语句都输出出来,一些麻烦的语句用GUI操作后,还能保存对应的sql语句.不错! 官网:http://www.webyog.com 下面是官方的介绍:S ...

  3. C# 读取在存储过程多结果集

    --SQL Server 测试环境搭建: Create database Test; go USE [Test] GO if OBJECT_ID('Tab','U') is not null drop ...

  4. Office——EXCEL 显示 隐藏 Ribbon 调用宏

    ==================================声明================================== 本文版权归作者所有 未经作者授权 请勿转载 保留法律追究的 ...

  5. 【Oracle XE系列之一】Windows10_X64环境 安装Oracle XE11gR2 X64数据库

    一.安装 1.去Oracle官网下载XE版的安装包[下载路径](Oracle Database Express Edition 11g Release 2 for Windows x64),解压. 2 ...

  6. VIM使用技巧总结

    一.vim使用的基本配置 1: set nu //设置行号 2: set ts=4 //设置tab为4个空格大小 3: set expandtab //设置用空格代替tab 4: set ai //设 ...

  7. Android getevent

    详细用法如下: 源码复制打印? Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] ...

  8. spring为什么不能注入static变量

    Spring 依赖注入 是依赖 set方法 set方法是 是普通的对象方法 static变量是类的属性 @Autowired private static JdbcTemplate jdbcTempl ...

  9. monkeyrunner之安卓开发环境搭建(一)

    在学习monkeyrunner之前,让我们先搭建好eclipse安卓开发环境. 对于程序开发人员而言,eclipse并不陌生,它提供了一个非常广阔的平台来开发程序.同样也可以用它来开发android程 ...

  10. Zookeeper 监视(Watches) 简介(转)

    Zookeeper C API 的声明和描述在 include/zookeeper.h 中可以找到,另外大部分的 Zookeeper C API 常量.结构体声明也在 zookeeper.h 中,如果 ...