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

去年十一月,我在大三的计算机网络课程上与SDN初识。今年三月中旬,我有幸得到老乡学长北邮– 李呈的指引,真正地与SDN结缘,悄然走上学习之路。

SDN,Software Defined Network,是对传统网络架构的一次革新。经过短短三四个月的学习和实践,我本着授人以渔的理念,辅以我的一些理解,将我的学习历程和心得叙写出来,送给各位想要入门的或跟我一样刚刚入门的朋友们。文中有理解不到位的地方,还望各位朋友不吝赐教,非常感谢!SDN,软件定义网络,我们关键就是弄清楚三件事:网络、软件、软件与网络怎么结合。

一、 走进网络

既然我们要用SDN来改造网络,当然得先了解一下网络是何物,磨刀不误砍柴工。

我对网络的了解,是从高中开始的。从OSI七层模型,到五层模型;从家庭组网,再到Socket编程实践,我对网络的兴趣不断增长。直到大二学了《计算机通信与网络》这门课,才算是对过往三四年积累的零星知识的一次大梳理,让我对网络有了一个系统性的了解。

(1)传统网络

传统网络,我的老师用它代指我们一直以来都在使用的网络,用以跟SDN网络区别。我是跟随着谢希仁前辈的《计算机网络》这本书学习的,也推荐给各位朋友。

跟随着大二的课程,我把五层模型的低四层学了个遍,主要是从物理层的拓扑、集线器,到数据链路层的网桥、MAC、CSMA/CD、CSMA/CA,再到网络层的路由器、最长前缀匹配、IP、ARP、OSPF、RIP、BGP,最后到传输层的UDP、TCP,掌握了这些,对我们网络的理解大有裨益。

根据我的SDN实践经验,深入理解一下最长前缀匹配,TCP的反馈重传、滑动窗口、三次握手、四次挥手,是非常有好处的。

(2)SDN网络

在这里,我们需要弄清楚三个问题:

① SDN是什么?

② 我们为什么需要SDN?

③ SDN可以用在何处?

学习SDN伊始,我阅读了一些介绍SDN的文献资料,还有一些控制器的白皮书。比较推荐大家从Open Network Fundation(ONF)组织的SDN白皮书入手,再辅以其他的介绍资料,了解SDN的架构是什么样,数据、控制、管理面,南向、北向、东西向,以及传统网络存在哪些不能适应新需求的问题、SDN针对这些问题有什么样的特性去应对。

对于控制器的白皮书,我看了ONOS的白皮书,还有一些OpenDayLight和Floodlight的介绍。通过这些,我们可以了解SDN网络的工作模式是什么,以及不同的应用场景对SDN网络有什么不同的要求。

二、 编程实践

通过上面阶段的学习,我们已经知道我们面前的SDN能做些什么,我们为什么要去用它了,这两个要点将支撑着我们继续深入钻研。

(1)Openflow

Openflow,是南向协议的一种,当下比较主流。通过对它的学习,我们可以搞清楚文章开头提到的“软件与网络怎么结合”这个问题。

Openflow以“flow”(“流”)去看待网络中的连接,它只负责对流的管理,不涉及交换设备属性的管理,比如给每个端口配置多少条队列等等,这些由其伴侣协议OF-Config去做。

对协议的学习,是很让人兴奋的一件事,可以先通过Openflow白皮书对其工作模式、流和流表、优点和性能局限有个理解,然后在SDNLAB、ONF等网站上下载到协议的细则说明书,具体学习。先从1.0版本入手,然后可以进行一些编程实践以加深理解,在掌握1.0的基础上,再去学习1.3版本。协议细则在我们后续的编程实践中也很有参考价值。

(2)控制器

控制器有RYU、NOX、POX、Floodlight(FL)、OpenDayLight(ODL)、ONOS等等,不同的控制器设计思路不同、消息/事件机制不同、性能不同、编程语言不同,以致于适用的场景场合不同、学习难度不同。大家可以多方面权衡之后,选一个作为SDN入门学习。

我一开始接触的是Floodlight,也尝试使用过ODL,最后,我选择了RYU这个小巧精干的控制器作为科研阶段的使用。对于学习者来说,控制器只是一个实现SDN的工具,关键在于跑在控制器上的模块,也就是需要我们根据应用需求去设计、编写的东西。

选好控制器之后,先通过官方的介绍或者编程手册了解控制器自身的代码文件组织,再花一点时间了解相应的编程语言,然后再看一下控制器编程手册里官方给的一个最简单模块的示例代码,了解一下一个模块在代码上有什么固定结构。如果官方的控制器代码包中含有已经写好可以直接使用的模块,也可以拿它们的代码来学习,这些在后续的实践中也很有参考价值。

(3)Mininet

在跟一些小伙伴的交流中,我发现有些童鞋还不是很了解Mininet这个东西,我在这里简单地说一下我的理解吧。Mininet是一个拓扑仿真工具,对我们来说,它就是帮我们虚拟地搭建了一个硬件网络,网络中有交换机,有主机,有相互之间的线路连接,通过它我们就得到了一张网,能了解到这里就差不多够了。

更深入一点的话,可以把Mininet看成一个助手或者脚本,我们用参数的形式,输入所要拓扑和网络的参数,它就帮我们调用起安装在Linux中的OVS,使用Linux提供的虚拟化技术KVM虚拟出主机host,然后再把它们连了起来,当然目前host之间的隔离性做得还不是很好。更进阶一步,还可以通过Mininet的Intf类或者直接使用OVS的命令,实现Mininet中交换机网口与Linux网口的对接,从而使我们这张网可以跟外部通信。

具体的学习过程,可以跟着mininet.org官网的WalkThrough页面做一遍,就算基本掌握Mininet这个工具了。

(4)Need &Design& Coding

本文假设大家都具有编程、调试方面的基本功,如果这方面还有待加强的话,可以找一些编程语言的书籍和调试技巧的文章看一看,然后做一些类似文件存取、网络聊天、数据库管理这样的小项目来练练手,编程能力自然会提高。

一个好的程序,比编码更关键的是设计,比设计更关键的是需求分析,这是我多年编程实践的感悟。SDN的编程实践和开发一款软件的软件工程实践是相通的。

首先,是对应用场景的需求分析,需要实现什么效果,需要支撑多大的规模,需要适应什么样的拓扑结构等等。这个阶段,最好尽可能地详细,特别是不能遗漏那些最基本的需求,否则可能会导致后续程序架构的大改。小的需求可以在后续进行快速迭代。

然后,就是设计。面对这些需求,首先要想,我用什么样的管理策略去实现这些需求。然后根据制定好的策略去想,我作为控制器中的模块,需要得到网络中的什么信息,包括topology、switch、link、host等的信息;需要处理哪些协议、地址、端口、字段的数据包。再接着,我需要什么样的数据结构去存储这些信息,需要设计什么样的辅助算法。设计过程中可能需要参考OpenFlow协议和控制器编程手册,看看自己是否能获取到所需的信息。

设计的过程是一个闭环反馈的过程。

最后,就是Coding实现。好的代码风格可以改善我们Coding的心情,也能提高我们Debug和Upgrade的效率。

(5)抓包分析

Wireshark,想必做网络的朋友都听过它的大名。它通过监听网卡,把收发的数据包全部列出来供我们查看。如果程序模块Debug确定没问题,但是功能效果就是不理想,甚至无法实现,那么就要祭出我们这张王牌了。

最近正值大三的期末,我的SDN课程的期末作业就好好地用了一把wireshark,通过添加过滤条目,可以细粒度地看到TCP三次握手、四次挥手的全过程,还有ACK、重传包、RST报文。它还可以解析应用层HTTP、Openflow等协议的数据包。

我在另一个SDN智能组播树的项目中,通过对IGMP的过滤查看,找到了能被利用的协议包,验证了组播协议的工作流程。

有时候,并不是我们的模块做得不好,而是我们对协议的了解不够。

新手上路,一是很难透彻理解通信协议和兼顾通信的各个环节,二是可能遇到网络应用中一些不可预知的工程问题。

对于第一条,我们可以通过抓包,找出是哪个环节出了问题,进而可以发现是我们在Openflow上的操作不对,还是我们对传统协议的兼容出了问题,亦或是我们在传统的通信环节上出了岔子。

我的期末作业就遇到一个典型问题例子:功能测试过程中,不同网段的两个主机互ping,明明已经收到了ICMP响应包(wireshark解析包后会有所指示),但还是报告“主机不可达”,结果发现是主机上的默认网关没有设置好。正常情况下,收到的ping包应该是(IPa->IPb),但是不同网段下,当网关没有设置成自己时,收到的ping包也许应该是(IPgateway->IPb)。

我的一点理解是,Openflow是对流的控制,如果一条流已经被我们成功引过去了,应该就表明我们的模块没有问题了。供大家参考。

而对于第二条,还是举我期末作业遇到的例子吧,访问HTTP时,用wget命令只会产生一个TCP连接,但是用Firefox则会产生两个TCP连接,神奇吧?如果这时候我们是对访问次数或者访问间隔做限制的话,那wget就会成功,而Firefox就会说网页打不开。这时候就不得不抓包分析了。对于这一点,我们可以设置相应的控制时延或者更高级的办法来解决。

对于这个例子,我还遇到了这一种情况,缘起于TCP的反馈重传机制。网络情况是多变的,即使是非常通畅的情况,通过抓包我发现,也会有各种原因导致TCP的意外重传,同理,一发生重传,就会导致上述访问失败的情况。

三、 总结

阿里巴巴的曹捷前辈在今年的DCD大会上宣布愿意率先跨出SDN的第一步,华为也在ONOS和ODL方面双管齐下,其IP部门今年的宣传片中也新加入了SDN的部分。相信SDN这个朝气蓬勃的新架构,会在未来向世人展示它的巨大威力。SDN现在大体还处于实验室和业界的研究阶段,很多东西也还没有定论,虽然已经有Google B4这样强大的成功案例,以及华为和阿里这样的高度热情,但也许一年、两年、五年、十年都无法看到它的遍地开花。所以说,学习SDN,没有足够的兴趣和毅力是无法深入下去的。

我有幸得到老乡学长北邮–李呈的指引,他带我走进了这一片新天地,真的是非常的感谢!同时也要感谢学习路上跟我一起交流的小伙伴们,相互学习,共同进步,相信美好的未来就在不远的前方!

作者:毛健炜

来源:51CTO

时间: 2024-08-23 10:29:50

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

初学者的SDN学习之路

Software Defined Network顾名思义软件定义网络,可以简单地分为网络和软件两个部分:软件和网络.此外,通过使用OpenFlow协议来实现SDN是一种较为普遍的方式,所以本篇将从软件和网络以及OpenFlow三个方面进行介绍.在研究SDN的研究者之中,有相当大比例的网络工程师,他们了解网络,精通网络,然而却并不了解软件开发.除此之外,还有很大比例的研究者是软件工程师,他们软件开发能力出色,然而并不了解网络运作的机制,在接触SDN之前,他们的范围仅仅只是应用层,底层的东西交给全交

樂思蜀致SEO初学者:学习SEO要注意的几个问题

随着SEO的普及,学习者也越来越多,通过这些年的观察,很多SEO初学者在某些问题上把握的不太好,致使学习进度缓慢,影响学习效率.樂思蜀在此就以下几个方面给SEO初学者提供一些建议,仅供参考. 学习的心态 学习SEO,首先要将心态放正,没有一口吃出来的胖子,也没有一天练就的绝招.SEO是一个策略,许多技巧的组合,需要一定时间积累经验,掌握操作知识. 记得前不久有人QQ上发来消息,"能不能教点绝招让我成为SEO高手",险些晕倒.SEO如果能够给几个绝招就成为高手,想必已经高手遍天下了吧.

初学者如何学习运维?

老男孩语录⑧⑧-初学者如何学习运维?①先实践后看原理很多初学者思维的误区是先了解原理在去实践很多有经验的运维给初学者的建议是先把原理看懂,在去实践.他们的思想是原理比操作更重要.其实,这是很误导人的错误学习运维的思想.运维实际上是应用性为主的一门学问.没有基础的运维一定是实践更容易,看原理相对更难,造成学习困扰.老男孩的建议:以下内容转自学生的作业总结(略改动):对于初级运维人员技术方面的学习是先看原理在实践还是先实践在看原理?对于这个问题,老男孩老师做了一个非常漂亮的回答:对于初级运维人员应该

阿里云副总裁杨名:“通向智能之路”

6月15日,第十五届中国软交会在大连开幕.在当日举行的2017全球软件和信息服务高峰论坛上,阿里云计算有限公司副总裁杨名以"通向智能之路"为题,回顾了阿里云的成长壮大历程,分享了阿里云在云计算.大数据.人工智能领域的技术突破以及生态伙伴体系建设.未来发展方向等方面的内容. 阿里云计算有限公司副总裁杨名 过去几年来,阿里云发展速度非常迅速.目前阿里云在中国公有云市场占有率超过50%,中国有40%的网站都运行在阿里云上,一半独角兽公司都在阿里云. 阿里云计算有限公司副总裁杨名表示,阿里云已

初学者如何学习win32和理解一系列代码

问题描述 初学者如何学习win32和理解一系列代码 在打开vs2008中win32项目建立一个项目后,形成的一系列文件和代码如何理解,请给予具体的说明,或者你知道有讲解这的视频也行,谢谢.

Javascript初学者教程:学习JavaScript的步骤

文章简介:最后undefined 感谢阅读此文!真诚的希望它能帮你成为一名JavaScript 爱好者.如果你已对JavaScript 很熟悉,你可以在评论中推荐其他任何相关资源. 学习新的东西是件可怕的事.对我来说,掌握一项新技能最大的问题是,我不知道自己懂什么.鉴于此,定个计划,学习你感兴趣的东西应该会有用.这篇文章的主旨就是:你为学习JavaScript 制定的蓝图.路线.行动计划!你不必担心找不到最好的资源,先整理些不好的资源,再确定下一步该学什么.遵循它,一步一步来. 任务0:了解什么

J2EE基础:对于Spring初学者的学习建议

j2ee|初学 一.首先Java的基础.面向对象的基础和设计模式的基础知识是必不可少的. 如果连这些基础知道都不够扎实的话,我建议还是先去补补课.关于设计模式我觉得不用学太多,但以下三个模式是学习Spring必不可少的:factory模式(包括简单工厂和抽象工厂),Strategy模式,Template method模式.如果不掌握这些你就根本没法领悟Spring的精髓,只能依样画葫芦地照搬,这是很可怕的事. 关于这方面的书的建议已经够多的,我就不说了.我这里强烈建议的书可能让人有点意外,那就是

对于Spring初学者的学习建议

一.首先Java的基础.面向对象的基础和设计模式的基础知识是必不可少的. 关于设计模式我觉得不用学太多,但以下三个模式是学习Spring必不可少的: factory模式(包括简单工厂和抽象工厂) Strategy模式 Template method模式 如果不掌握这些你就根本没法领悟Spring的精髓,只能依样画葫芦地照搬,这是很可怕的事. 我这里强烈建议的书可能让人有点意外,那就是Expert one on one J2EE design and development的第四章,这一章不仅仅是

给予Java初学者的学习路线建议

Java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍.这一部分的内容,同样适用于一些希望转行到Java的同学. 在大家看之前,我要先声明两点. 1.由于我本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线,非Java Web和Java后端开发的同学请适当参考其学习思想即可,切勿照