SDN初探

      因为网络大作业,要使用SDN,而且SDN能让我更加深入理解网络原理。比如ARP协议在SDN中的实现(l2_learning)。但是SDN感觉比较复杂,光看官网就头大了。我就参加了coursera上的SDN课程。有人带,入门还是很快的。
      关于SDN的历史也很丰富,可以看N Feamster的介绍,直接跳过,进入学习环节。

实验环境:

      SDN说简单了就是Data plane和Controller的分离,进一步说就是switch和控制算法的分离。底层的switch厂商可以不同,但是遵守统一协议,比如openflow。这个目的就是为了控制算法能够不受厂商限制。但是我们没有真实的网络设备和拓扑,这对我们学习和研究有很大阻碍。还好有虚拟技术。Mininet让实验成为现实。SDN的相关内容太多,软件也不少,因此我担心自己的电脑吃不消,就装了个专门的虚拟机。在SDNHUB上下载,是ALL-in-one的,包含各种controller和必要工具。所以实验环境就运行虚拟机就ok了。

网络拓扑:

      最新创建的是网络拓扑,就是switch和host的连接结构。真实环境的话是手动连接电缆。这里使用Mininet创建。可以根据Mininet官网教程一步步实验。比如创建一个树形拓扑。

      完成后就是一个mininet的CLI界面,可以输入help看看支持哪些。重要的有py,link等等。除了mn内置的几个拓扑结构外,还可以使用Python API,这就大大增加了Mininet的可扩展性。最核心的就是加加链路,设置属性。

      这还支持可视化,比如poxdeskminiEdit。不过都还比较粗糙。我试了一下poxdesk,感觉够用。

poxdesk
树形结构(未显示主机)

控制模块:

      SDN Controller就有很多了,比如POX,OpenDaylight等等。比较详见此文这个博客。我选的是POX,容易上手,课程用的也是这个,Python语言。比如上文的l2 learning,可以非常清楚的理解原理。

      我觉得SDN Controller才是核心,将来网络的运行全靠这了。POX细节部分我还没有深入。可以参考其wiki。我要实现的就是Fattree的路由算法。还有两天时间,刚八类!

链接:

  1. openflow tutorial

Python: function

      Python基本的内容已经回顾完了。这次的function真的是让我好好消化了一下。特别是Python中的闭包(Closure),由于之前没有实际用过,不是很能切身体会其用处。我目前只能理解到enclosing function这个层面。

function coding:

      Python最简单的表示函数的方法是 def ,之后的code block就是一个函数体。当然还有lambda函数等等。Python不仅有一般的返回方式,比如 return ,还支持 yield (比较高级,到generator时再展开)。这两者的主要区别是yield记住了函数处理的位置。比如读一个大文件,使用yield就能一段段返回,这也是Python内置open函数的标准做法。

      Python中还有compile能生成函数。最酷炫的定义函数的方法在下文提到。原文见stackoverflow.

      Python中所有变量都是对象。函数也不例外。最简单的证明就是

      函数这个变量不是像C一样编译时就确定的。是运行时动态确定的。这点也很容易理解,毕竟Python是脚本语言。

function object:

      既然函数是个对象,那么这里面装的是什么?自然的好奇,一下子将我带入高级领域了。接触了dis,code,inspect等等好多底层的,一下子反应不过来。先看最相关code。进行测试:

      输出为:

      code这个对象就是function的核心。我这么认为。因为这包含了函数的机器码。Python内置了反编译dis模块。看看酷炫的函数生成方式和dis模块的相应作用。再次声明这代码我目前没能力写出,理解也好半天,娱乐一下,原文见大神。输出见不看了,代码在Python 3可直接运行看输出。

nested function:

      Python的作用是根据LEGB来的。从Local->enclosing->global->buildin。最难以理解的是enclosing。而且Python2和3还有区别。Python3多了nonlocal,一下子提升了nested function的实用性,或者说是提供了便利性。先看代码例子。

      nested function的主要应用场景就是上面所示。生成一个附带上下文信息的独立函数。比如F,G各自都是独立的带有信息state。这貌似就是class。但实际上还是有区别的。首先写法就不一样。然后结构也不一样。然后据说效率也不一样。当然同样的功能class一定能实现。

      回到LEGB。如上面的例子。E就是代码nested function到最外层的函数为止的作用域,不包括最外层的函数外面的。在Python 2只能在nested function里引用E中变量,即read only。Python 3使用nonlocal后就能表明这个变量要在nested function里改变。虽然Python 2能用一些技巧实现同样的事,但总归不自然。

      函数还有部分内容,内容太多,分开写。

链接:

  1. python code object
  2. Exploring Python Code Object

Python: statements

      statements是编程语言中重要部分。在Python中也是如此。statements代表一段逻辑。Python通过对齐(indent)控制statements。

赋值:

      正常的赋值就不提了。Python3支持一种特别的赋值方式: a,*b, c = [1,2,3,4,5] ,*b代表匹配剩下的。Python3在赋值前都会创建副本,比如 a,b = b,a 的赋值方式完全没有问题。 顺便提一下, print(a = 1) 这样的语句在Python中是不行的,因为赋值不返回值,跟C不一样。
      当然Python也支持 Augmented assignment statements。其实就是 X += Y 这样的。如果这里X是不可变的,那么这样操作与 X = X + Y 差别不大。但是如果X是可变的,比如list类型,那差别就大了。特别是效率问题。如下所示。变量是重新开辟了内存区域。

if:

      Python里只有if,没有switch。因为if…elif…也可以写的很漂亮。更因为Python可以直接用dict代替switch。仔细想想如何做。更强大的是可以直接switch到函数。如下:

      Python中的判断还是要注意的。像大小比较返回的是True、False,但是逻辑判断返回的居然是对象,因为在Python中每个对象都是固有的True或False。当然判断还是遵守short circuit的。如下:

循环:

      计算机就是用来循环的。Python的循环也不同寻常。Python很少用while,至少我很少用,因为for太强大了。平常的for不管了。Python的for是只要对方是个可迭代的,就可以使用 for i in X: 的形式。举例文件的读取。下面才是正确的做法。节省内存,效率也不低。唯一的弱点是f是iterator,只能顺序读一次。

      循环也经常与map,zip,enumerate配合使用。

Iterations:

      Iteration是Python中重要的类型。Python中有iterable和iterator。书上是这么说的。

The iterable object you request iteration for, whose __iter__ is run by iter
The iterator object returned by the iterable that actually produces values during
the iteration, whose __next__ is run by next and raises StopIteration when finished
producing results

      感觉还是不太明白,后来还是上网查查明白了。见stackoverflow。像list,dict,str等等都是iterable的。这样就可以做有趣的事了。普通的for一样可以。这里多了叫Comprehension的说法。其实就是把for写在[]里。如

      据说这样效率会比较高。。总之比手动index快。所以让Python做更多事是提升效率的基本原则。

文档:

      虽然说Python已经十分接近自然语言了。但是写注释和文档还是必要的。Python这点做的很好,PyDoc把注释和文档结合了。所以写大型注释就是写””” HELLO “””这样的。然后由__doc__或help获取。不展开。也可以使用HTML看文档, python -m pydoc -b 。对与个人用足够了。高大上的Sphinx也可以尝试一下。

 

      好了,Python以前会打大概就差不多了。还有后面一点点会的函数。。就当复习了。这么点时间还是学到了不少。收获很多!