初学者的SDN学习之路

Software Defined Network顾名思义软件定义网络,可以简单地分为网络和软件两个部分:软件和网络。此外,通过使用OpenFlow协议来实现SDN是一种较为普遍的方式,所以本篇将从软件和网络以及OpenFlow三个方面进行介绍。在研究SDN的研究者之中,有相当大比例的网络工程师,他们了解网络,精通网络,然而却并不了解软件开发。除此之外,还有很大比例的研究者是软件工程师,他们软件开发能力出色,然而并不了解网络运作的机制,在接触SDN之前,他们的范围仅仅只是应用层,底层的东西交给全交给主机的协议栈了。还有一部分同学是像我这样,通信工程出身,学的是物理层的编码解码,误码率,电磁波。不像计算机专业那些学生一样,学习各种语言,操弄各种编译器,混迹于github这种全球最大的男性交友网站。剩下最后一种就是又懂网络,又懂编程。这种人,我一般称之为老师,是用来请教问题的,比如地球-某某老师。一般的,他们不屑于看到这种文章,太low。

本篇主要的目标用户是对网络和软件开发都不太了解,或者网络和编程开发只擅长一种的研究者。由于我也是一个初学者,所以仅当做经验分享吧。如有表达不对的地方,敬请指出,万分感谢。

网络

软件定义网络,如果不了解网络,那如何去定义一个你不了解的东西?如果不知道网络中存在的问题,如何使用SDN来改善?所以网络知识至关重要。然而作为一个初学者,并不需要网络各个方面都精通,也做不到,仅需学习基础知识,并选择一个研究场景即可。

计算机网络

学习网络的必修课是计算机网络。计算机网络讲述的是计算机网络的运作机制,都是极其基础重要的知识。谢希仁前辈的《计算机网络》是从底层往上层介绍,从物理层的hub到数据层的网桥和交换机,到网络层的路由器,最后讲到TCP/UDP的传输层,止于应用层,适合有通信背景的学习者。《计算机网络:自顶向下方法》则是从另一个角度出发,从应用层向下介绍,摆脱了物理层的枯燥,这样的思路更适合学习计算机出门的学习者。《CCNA学习指南》也是推荐的书籍之一,前部分内容讲解计算机网络非常简单明了,更贴近于真实网络规划,可以当做计算机网络的进阶书籍阅读。

学习完计算机网络之后,学习者应该懂得二层交换、三层路由,了解到OSI七层协议栈,也了解了TCP/IP,ARP,ICMP,DNS, DHCP。作为检验标准,读者可以尝试介绍一个客户端主机和跨网段的服务器进行通信的流程。

关于网络协议,只需了解主要的一两种,其他了解其作用即可,因为协议实在太多了,没有必要学完。RIP、BGP、OSPF和IS-IS需要了解。如果研究的课题与路由协议相关,则可详细学习,初期不建议深入学习。学习成果检验是对比路由协议的差异,如RIP的广播路由信息和OSPF的告知邻居。

ARP,ICMP,DNS,DHCP这几种功能型报文非常重要,均需了解其工作流程,具体的报文格式,可适当了解关键字段。项目需要时再深入研究。

TCP/UDP的差别需要牢记,适合的应用场景也许了解。关于TCP的状态机,建议尝试记忆,TCP的三次握手建立连接,四次握手释放连接是面试高频题。

应用层的仅需了解若干常用协议如SMTP,POP3,HTTP及其对应的传输层的端口号即可。

网络场景

当学习了基础的网络知识,学习者已经具备了一定知识储备,对网络也有了基础的了解。然而现网之复杂,并不是看了一本《计算机网络》就可以了解的。网路可以按照规模分为局域网,城域网,广域网,也可以按照功能划分成接入网,传输网和核心网。当然按照场景划分就更多了。云计算网络的典型场景数据中心网络是目前研究的热门领域。以校园网为代表的园区网也是较为常见的SDN应用部署场景。跨数据中心的互连互通、WAN的研究则是研究的另一个大方向。

选择一个自己喜欢的应用场景,进行深入研究,并根据需求学习相关知识,会大大提高学习的效率。比如我选择学习数据中心网络,所以我需要学习一些云计算的知识,需要了解数据中心中的网络架构。我推荐《腾云:云计算和大数据时代的网络技术揭秘》作为云计算网络知识的科普书籍。书中介绍了很多有用的知识,包括云计算的起源,云计算和网络的关系,网络安全,以及数据中心网络中的一些关键网络技术。读完你应该了解到什么是TOR和EOR,知道了刀片服务器,了解到VN-TAG是用来标识虚拟机到TOR的流量的,了解到VXLAN和NVGRE的作用,了解到交换机还可以组装的,除了OVS之外还有NEXUS 1000v等产品。读完这本书,能对现网的一些技术,以及产品有一些科普性质的了解,对后续深入学习研究有很大帮助。

相信有了前面计算机网络知识作为铺垫,再选定一个特定的研究场景,网络方面的学习已经不成问题。

软件开发

软件开发是SDN学习中另一个重要方面,这方面我同样不是行家,我也是新手,所以以下言论仅当做自己的经验介绍。

选择一门语言,选择一个控制器

根据自己的喜好,选择一门语言,然后根据语言,选择一个对应的控制器,这是开发的第一步。如我自己,在折腾了C/C++,Java,Python之后,最终还是皈依到了Python大法的旗下。根据Python语言,我选择了由Python语言写的POX。POX无需安装,直接可以运行。同时,POX代码简单,初学者只需阅读pox/forwarding文件夹下的代码即可。

根据我们已有的网络知识,我们基本可以看懂pox/forwarding文件夹下的程序逻辑。以l2_learning.py为例,该文件完成了一个简单的二层交换的应用,其逻辑为:记录MAC地址和Port的对应关系,转发时,查询MactoPort表,若查询成功,则转发,若失败则泛洪。后来RYU出现了,封装更好的,性能更好的RYU成为了我的首选。

在编程的过程中,需要进行程序设计,其中设计的算法以及数据结构的知识在这里不多介绍,有兴趣的读者可以自行学习。

以项目为导向,先写起来

阅读源码需要有明确的目的性。最开始可以先尝试读一些简单的如Simple switch之类的代码,掌握一些简单的API的使用,理解基础的内容,然后再进行深入的源码阅读。

在进一步学习SDN开发时,建议以项目为导向,先写起来,在尝试中去解决问题。在写的过程中遇到问题再去查看源码找关键点,如此一来学习非常有效率,且学到的东西很快就可以用上,学习效果好。特别是在OpenFlow协议已经经过多个版本的扩张,目前内容已经非常多的情况下,选择性学习能帮助你降低学习的压力,提高学习的效率。

时间充裕的情况下,你可以选择好好阅读那些你认为重要的代码。比我在经历了多个APP开发之后,我觉得我需要好好了解一下RYU的内部机制了。所以我花了三天,把从底层socket到协议解析,到事件分发到handler注册的代码认真看了一遍,收益颇多。

学会Debug

写程序容易,调程序难。掌握正确的调试方法能大大提高开发的效率。

为提高调试的效率,在程序设计的时候就需要非常注意。写程序时需要注意程序的设计,比如成端的逻辑尽可能写成函数;一个函数不得过长,最好别超过一个屏幕的行数;尽可能模块化地编程,可以提高代码的重用率,将错误域缩小到某模块,某函数,容易定位错误。在调试的过程中,控制变量的思维方式可以大大提升效率。其他编码风格方面的要求,建议按照google的PEP8风格进行代码编写。

对操作系统的熟悉和理解也将大大提高开发效率。熟悉Linux的基本操作是必须的,如果不清楚,你可能需要自学一下linux和shell。在调试的过程中,错误显示一般是英文,所以能读懂错误信息,并学会谷歌是一项必备的技能。一般的问题谷歌都可以解决。另外,加几个SDN的技术群也是提高DEBUG效率的一个重要手段。

关于开发的建议还有,构建一套适合自己的、高效的开发环境,以及做好版本控制。比如我自己,我只用sublime编译器,编译运行和调试都直接在终端中进行。版本控制使用git。版本控制的重要性不许赘述,详情谷歌。

OpenFlow

目前应用最广泛的SDN实现协议:OpenFlow,是学习SDN中必须要学的核心内容。在设计一个SDN的应用时,需要以下的步骤:

明确网络应用的逻辑

明确对应的操作所采用的OpenFlow报文

根据应用逻辑以及OpenFlow协议进行编程开发

比如一个简单的二层交换机,首先我们明确了他的运作机理是MAC学习和转发,然后明确转发所需要使用的OpenFlow报文是:packet\_out和Flow\_mod,最后根据应用逻辑以及OpenFlow协议对应的报文,进行编程开发。

所以我们可以知道OpenFlow在SDN应用中的重要性。

OpenFlow经过这几年的发展已经从1.0版本发展到了1.5版本,初学者在学习的时候需要注意顺序。建议先学习OF1.0版本,再学习OF1.3版本,更高版本根据需要进行学习。

OpenFlow1.0版本是OpenFlow火起来时的第一个版本,其内容并不多,Match域仅有12个字段,动作种类也不多,同时也是单流表。对于初学者而言,学习1.0版本可以大大降低学习压力,掌握OpenFlow核心内容。在正确理解SDN,以及可以使用OpenFlow1.0协议开发SDN应用之后,可尝试学习1.3版本协议。1.3版本较1.0版本内容大幅增加。经过几个版本的迭代,OpenFlow1.3版本协议已经有了三种表:

flow table

group table

meter table

动作种类也得到了拓展,多流表的概念也变得成熟,Match匹配域已经多达几十个,所以这时OpenFlow已经将Match域分成几类,并以OXM的形式呈现出来。多控制器写作的概念在1.3版本中也已经相当成熟。

OpenFlow1.3版本为SDN应用开发提供了很多便捷,开发人员可以利用多流表,设计更多复杂的应用逻辑。作为一个比较稳定的版本,1.3版本成为继1.0版本之后控制器支持最多的版本,所以此版本是SDN学习者应该要学习的。

总结

SDN学习与其他研究方向相比,要求较高,需要了解软件开发以及网络,学习起来,并不太容易。同样作为初学者,我从大三开始接触,有幸有学长带着入门,再后来由于网络知识的缺陷,一度陷入不知道做什么的状态。恶补了网络知识之后,才慢慢走上正轨。然后最近我又遇到了编程上的难题,急需恶补,急需努力提升自己的开发能力。本篇学习笔记,是几年来学习的粗略总结,希望对SDN初学者有帮助。最

后,兴趣是最好的老师,如果你喜欢SDN这个方向,就会学得很快。如果在学习的过程中没有成就感,没有乐趣,也可以试试别的方向,做自己喜欢的事最重要。

作者:何妍 

来源:51CTO

时间: 2024-09-16 09:51:25

初学者的SDN学习之路的相关文章

我与SDN的缘分:一名初学者的学习之路与心得

去年十一月,我在大三的计算机网络课程上与SDN初识.今年三月中旬,我有幸得到老乡学长北邮– 李呈的指引,真正地与SDN结缘,悄然走上学习之路. SDN,Software Defined Network,是对传统网络架构的一次革新.经过短短三四个月的学习和实践,我本着授人以渔的理念,辅以我的一些理解,将我的学习历程和心得叙写出来,送给各位想要入门的或跟我一样刚刚入门的朋友们.文中有理解不到位的地方,还望各位朋友不吝赐教,非常感谢!SDN,软件定义网络,我们关键就是弄清楚三件事:网络.软件.软件与网

Qt 学习之路 2 --- 读书笔记

一.文章来由 来自豆子老师非常好的一本Qt教程,但是只有网络版,所以用这个做笔记了,不动笔墨不读书嘛~~ 二.读书笔记 1.Qt 学习之路 2(2):Qt 简介 1.1 关于 Qt 的一站式解决 Qt 是一个著名的 C++ 应用程序框架.但并不只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI 组件.使用 Qt,在一定程度上你获得的是一个"一站式"的解决方案:不再需要研究 STL,不再需要 C++ 的,不再需要到处去找解析 XML.连接数据库.访问网络的各种第三方库,因为

F#学习之路(2) 深刻理解函数(上)

函数在函数式编程语言中是一等公民,是函数式语言中最重要的基本组成元素,也是其名称的由来. F# 中的函数之如C#中的类,是组织程序结构的最基本单元.是命令式编程语言中函数或OO编程语言中方法的超集.超集,有多强大?我将在下面几个方面细细道来. F#是一种多范式的编程语言.支持命令式.函数式.面向对象的编程范式,还有目前火热的面向语言编程(DSL).本文不会介绍其他的编程范式,只介绍函数式编程范式. 在面向对象编程的世界里,视命令式或过程式是一种丑陋的编程方式,至少被大多数程序员视为不能有效发挥O

Qt学习之路(23):自定义事件

Qt允许你创建自己的事件类型,这在多线程的程序中尤其有用,当然,也可以用在单线程的程序中,作为一种对象间通讯的机制.那么,为什么我需要使用事件,而不是使用信号槽呢?主要原因是,事件的分发既可以是同步的,又可以是异步的,而函数的调用或者说是槽的回调总是同步的.事件的另外一个好处是,它可以使用过滤器. Qt中的自定义事件很简单,同其他类似的库的使用很相似,都是要继承一个类进行扩展.在Qt中,你需要继承的类是QEvent.注意,在Qt3中,你需要继承的类是QCustomEvent,不过这个类在Qt4中

c++问题-C++初学者的关于学习流程的提问

问题描述 C++初学者的关于学习流程的提问 我是高校在校生,现在自己在学C++现在刚刚看完谭浩强的一本入门级的书籍,了解了C++的一些基本数据结构,语法和类以及继承的用法,会写一些简单的程序,接下来不知道应该学习什么,身边的同学有的在学习算法和编程思想,有的已经在看MFC,请大神给点指点吧! 解决方案 MFC已经奄奄一息,不建议学:如果没有基础的算法.数据结构思想,建议先打点基础:C++很难,谭浩强的书恐怕是不够,建议接着刷C++ primer和Effective C++ 解决方案二: 把C++

请求-初学C#,专业信息管理,方向ERP,求大神明示学习之路

问题描述 初学C#,专业信息管理,方向ERP,求大神明示学习之路 我现在是个大二的学生了,现在在学习C#的基本入门语法,以后想做ERP这类方向,请求各位前辈指教一下我接下来应该学习C#的那些方向 解决方案 看看 <C#入门经典> 这本书 先搞懂基础

Webwork 学习之路(六)Action 调用

阅读目录 1.这部分框架类关系 2.Webwork 获取和包装 web 参数 3.DefaultActionProxyFactory.DefaultActionProxy.DefaultActionInvocation       一路走来,终于要开始 webwork 核心业务类的总结,webwork 通过对客户端传递的 web 参数重新包装,进行执行业务 Action 类,并反馈执行结果,本篇源码分析对应下图 WebWork 框架流转图中红色框的地方. 回到顶部 1.这部分框架类关系 回到顶部

Windows Azure初学者非常重要的学习资料Training Kit

Windows Azure初学者非常重要的学习资料--Training Kit在8月的下旬又进行了一次小的更新,增加了两套讲课用针对Windows Azure Mobile Service的PPT,以及15个动手案例.个人认为最主要的更新来自于对Mobile Service的案例,这对于Windows 8开发者的学习非常重要. Hands On Labs: 1. Introduction to Windows Azure2. Exploring Windows Azure Storage3. D

以实践为起点,设计出重基础的学习之路

在CSDN对我的专访中,我比较全面地阐述了我带领学生开展的以实践为主线的编程学习过程.有人发表评论:"如果你是大学生,我建议你把这篇文章当成垃圾看.大学重点学得应该是基础,不是你那些所谓的为了完成工作而学的项目经验.什么是基础,重点是数学.英语.接下来是计算机组成和操作系统,如果你是计算机系的,C语言必须掌握.谈谈数学重要的原因,以前计算机专业在很多名校都是数学的一个分支,可能刚涉编程你不懂数学的重要性,如果你深入学习数据结构例如的排序的算法时间分析就知道用到了一大堆微积分,还有计算方法,这个反