【原创】SDN控制器开发教程——打造属于你自己的控制器

2013-12-17 by muzi

前言

SDN(Software Defined Network)这些年越来越火。当我还是大三的小朋友的时候,我的学长带我走进了OpenFlow的世界。一年里,我慢慢学会了许多东西,研究过pox,写过mininet自定义拓扑,画过OpenFlow的数据结构,做过HTTP的流量引导,广播风暴解除等许多小东西。在SDN这条道路上越走越远,也希望有一天,我能在这个领域有所成就,做出一点自己的贡献。

暑假的时候开始来工信部电信研究院实习,开始跟着学长一起开发,后来学长去美帝了,我继续完成剩下的工作。为了实现demo,我们顺便写了一个小小的控制器,其本质很简单,也许简单到你都不屑一顾。但是这个过程,我们需要从底层通信开始搭建,一直到最后的上层应用,无论哪一个环节,都会涉及到。到最后你会发现,其实也许这个控制器并没有太大的用处,但是更多的是这个过程中你学到的知识,那是使用别人开发的控制器说不能得到的宝贵知识。


你能得到的

  • 底层通信:基于Tornado架构的socket通信的搭建
  • OpenFlow协议数据结构细节
  • 通信流程的事件处理
  • 若干网络协议的熟悉与掌握。
  • 最重要的,你自己从无到有,经历了一个开发过程,所有出现的你想到的想不到的问题,你都需要自己去解决。你会在解决问题的过程中收获太多太多你想不到的财富。
  • 自信!你可以大声对自己说 ...
read more

【原创】OpenFlow通信流程解读

2013-12-12 by muzi

前言

接触了这么久的SDN,OpenFlow协议前前后后也读过好多遍,但是一直没有时间总结一下自己的一些见解。现在有时间了,就写一写自己对OpenFlow协议通信流程的一些理解。

SDN中Switch和controller

在SDN中很重要的两个实体是Switch跟Controller。Controller在网络中相当于上帝,可以知道网络中所有的消息,可以给交换机下发指令。Switch就是一个实现Controller指令的实体,只不过这个交换机跟传统的交换机不一样,他的转发规则由流表指定,而流表由控制器发送。

switch组成与传统交换机的差异

switch组成

switch由一个Secure Channel和一个flow table组成,of1.3之后table变成多级流表,有256级。而of1.0中table只在table0中。

  • Secure Channel是与控制器通信的模块,switch和controller之间的连接时通过socket连接实现。
  • Flow table里面存放这数据的转发规则,是switch的交换转发模块。数据进入switch之后,在table中寻找对应的flow进行匹配,并执行相应的action,若无匹配的flow则产生packet_in(后面有讲)

of中sw与传统交换机的差异

  • 匹配层次高达4层,可以匹配到端口,而传统交换机只是2层的设备。
  • 运行of协议,实现许多路由器的功能,比如组播。
  • 求补充!!(如果你知道,请告诉我,非常感谢!)

OpenFlow的switch可以从以下方式获得

  • 实体of交换机,目前市场上有一些厂商已经制造出of交换机 ...
read more

【原创】SDN下的分布式广播风暴解决方案

2013-12-07 by muzi

前言

这是很久以前的成果了,那时候我才大三上。为了学习sdn,openflow等知识,北邮科研楼628的一群哥们儿,想着各种新奇的东西去解决已有的问题。

有一天,我们遇到了网络风暴,但是我们觉得STP有点复杂,而且,确实也不愿意去学。那么,就自己写一个解决方案吧。于是,下面的小代码产生了。

核心思想

其实特别简单,一句话:不让同一个数据包从第二个端口进入,即仅允许数据包从第一个进来的端口进入。

也就是说,我确保了,同一个数据包,不会从别的交换机从非第一次的in_port进入本交换机,那就不会有环路,也就解决了风暴,而且,同一个端口允许进入,不影响主机继续发送广播包。

具体实现

这个就需要我们建立一个macToport的表,在python里面数据结构字典来实现。使用src_mac作为key,记录值为[dstip,port,time]

self.macToPort = {srcMAC:[dst_ip,in_port,time]}

这个字典记录了用数据包的mac地址记录了数据包的目标ip,入口端口,到达时间三个信息,其实如果为了更好的对应,我们应该使用上xid,让 ...

read more

【原创】mininet搭建自定义网络拓扑 by muzi

2013-12-06 by muzi

你知道的mininet

相信很多研究SDN的朋友都知道mininet,也是用过mininet。但是恐怕大多数人都只是局限于workthough的水平.链接:http://mininet.org/walkthrough/

搭建更多的,灵活的拓扑还是有一定的难度。

上一次实验的时候,看了一下spirent testceter的一套测试拓扑,从中受益,学了一点。现在写出来分享一下。

如果你想快速建立拓扑,请直接拉到最后一个标题

教你搭建你自己的任意拓扑

首先把需要用到的相关模块import进来。

/#!/usr/bin/python

import re
from mininet.cli import CLI
from mininet.log import setLogLevel, info,error
from mininet.net import Mininet
from mininet.link import Intf
from mininet ...
read more

基于tornado的简单socket通信建立

2013-11-29 by muzi

配图版请查看:http://user.qzone.qq.com/350959853/blog/1375093527

安装tornado

这里有比较全的介绍,写得非常好。http://sebug.net/paper/books/tornado/

hello world

首先,下载安装好tornado之后,我们就可以去使用tornado里面的库了。 照着官网的简单的例子抄了一遍,写了一个hello world!

hello

显示效果如下:

res

基于tornado的简单的socket连接通信实现

代码如下:

import errno
import functools
from tornado.ioloop import IOLoop
import socket
import time
import Queue

sock = socket.socket    (socket.AF_INET,socket ...
read more