【原创】SDN控制器开发教程——打造属于你自己的控制器
前言
SDN(Software Defined Network)这些年越来越火。当我还是大三的小朋友的时候,我的学长带我走进了OpenFlow的世界。一年里,我慢慢学会了许多东西,研究过pox,写过mininet自定义拓扑,画过OpenFlow的数据结构,做过HTTP的流量引导,广播风暴解除等许多小东西。在SDN这条道路上越走越远,也希望有一天,我能在这个领域有所成就,做出一点自己的贡献。
暑假的时候开始来工信部电信研究院实习,开始跟着学长一起开发,后来学长去美帝了,我继续完成剩下的工作。为了实现demo,我们顺便写了一个小小的控制器,其本质很简单,也许简单到你都不屑一顾。但是这个过程,我们需要从底层通信开始搭建,一直到最后的上层应用,无论哪一个环节,都会涉及到。到最后你会发现,其实也许这个控制器并没有太大的用处,但是更多的是这个过程中你学到的知识,那是使用别人开发的控制器说不能得到的宝贵知识。
你能得到的
- 底层通信:基于Tornado架构的socket通信的搭建
- OpenFlow协议数据结构细节
- 通信流程的事件处理
- 若干网络协议的熟悉与掌握。
- 最重要的,你自己从无到有,经历了一个开发过程,所有出现的你想到的想不到的问题,你都需要自己去解决。你会在解决问题的过程中收获太多太多你想不到的财富。
- 自信!你可以大声对自己说 ...
【原创】OpenFlow通信流程解读
前言
接触了这么久的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交换机 ...
【原创】SDN下的分布式广播风暴解决方案
前言
这是很久以前的成果了,那时候我才大三上。为了学习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
你知道的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 ...
基于tornado的简单socket通信建立
配图版请查看:http://user.qzone.qq.com/350959853/blog/1375093527
安装tornado
这里有比较全的介绍,写得非常好。http://sebug.net/paper/books/tornado/
hello world
首先,下载安装好tornado之后,我们就可以去使用tornado里面的库了。 照着官网的简单的例子抄了一遍,写了一个hello world!
显示效果如下:
基于tornado的简单的socket连接通信实现
代码如下:
import errno
import functools
from tornado.ioloop import IOLoop
import socket
import time
import Queue
sock = socket.socket (socket.AF_INET,socket ...