【原创】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

N个整数,求其中任意N-1个数的乘积中的最大的一个(禁用除法)

2013-11-29 by muzi

刚才看程序员面试宝典的时候看到这个有趣的题目,也是google2007年的笔试题目。只能用乘法,不能用除法。

看了网上一些扯到不行算法之后,我决定把我自己的想法写一下,不一定对。

PS:好久没写C++,语法都忘了,跟python语法混乱了……哎。。

整个问题只会有一下3种情况

  • 有两个0,最大必为0。

  • 数组全非负,最好办,在没有两个及以上的0的情况下,把最小的剔除即可。

  • 数组有正有负,有0,最困难。

具体代码如下:

//数组a[n]
//——————————————————————————————————————————————
int min1 = -65534,min2=65535,No,No_1,No_2 = 0,total=1,z_num=-1;//初始化参数;
for(int i=0,j=0;(i<n)||(j<1 ...
read more