本文首发于我的公众号码农之屋(id: Spider1818),专注于干货分享,包含但不限于Java编程、网络技术、Linux内核及实操、容器技术等。欢迎大家关注,二维码文末可以扫。
导读:SDN是一种新型网络解决方案,它的设计理念是将网络控制面和数据转发面进行分离,然后通过集中式控制器对网络资源实施按需分配。
一、网络技术的困境
长期以来,网络技术总是以被动的方式进行演变,并且大量的技术革新都集中在网络设备本身,如带宽不断提升,从千兆到万兆、再到百G;大二层网络技术,通过消除环路因素,支持了虚拟场景的大范围二层扩散性计算。
新的技术商用,总会引起设备的升级换代,并且随着流量的巨大变化,网络的部署与变更技术上越来越复杂,网络在应对流量变化上很难有良好的预期性。在当前方式下,一旦完成业务部署,服务器通过网线连入网络,应用流量吞吐对网络的影响就难以控制、网络的调整也就变得相当滞后。
为了从根本上解决上述提到的网络问题,业界一直在探索新的技术方案来提升网络灵活性,其要义是打破网络的封闭架构,增强网络的可编程能力。经过多年的技术发展,SDN技术应运而生。
二、SDN横空出世
SDN(Software Defined Network),即软件定义网络,2006年诞生于美国斯坦福大学CleanSlate课题研究组。它是一种新型网络创新架构,也是网络虚拟化的一种实现方式。其核心理念是将网络设备的控制面与数据面进行分离,从而实现了对网络流量的灵活控制,使得网络变得更加智能。
SDN更像是一种网络虚拟化思想,核心诉求是通过软件控制网络,实现业务自动化部署。例如,在传统交换机内部,其主要负责具体的网络流量往哪里转发,而在SDN中,通过控制器进行流量转发的计算,然后将结果发送给交换机,交换机只进行简单的转发,从而实现控制和转发平面相分离。
三、SDN分层结构
SDN在应用中大体可划分为三层体系结构:控制层(Control Layer)、应用层(Application Layer)和基础设施层(Infrastructure Layer)。不同层次之间是通过不同接口进行通信的,比如应用层是通过北向接口(Northboundinterface)与控制层通信,而基础设施层则是通过南向接口(Southboundinterface)与控制层通信。SDN分层体系结构请参考图1。接下来将对SDN分层结构的内容进行一次简单的介绍。
1)控制层
控制层是SDN控制器管理网络的基础设施,可以根据需要灵活选择多种控制器。在这一层中,控制器中包含大量业务逻辑,以获取和维护不同类型的网络信息、状态详细信息、拓扑细节、统计详细信息等。
由于SDN控制器是用于管理网络的,所以它必须具有用于现实世界网络使用情况的控制逻辑,如交换、路由、二三层VPN、防火墙安全规则、DNS、DHCP和集群,网络供应商和开源社区需要在自己的SDN控制器中实现自己的服务,而这些服务会向应用层公开自己的API。
目前市场上的SDN控制器解决方案大致可以分为两类:大型网络设备厂商提供商业方案,如CiscoOpen SDN controller;社区组织提供的开源方案,如OpenDaylight等。
2)基础设施层
基础设施层,由各种网络设备构成,它可以是数据中心的一组网络交换机和路由器。控制层负责管理底层物理网络,物理层的实现可以是支持OpenFlow的硬件交换机。随着虚拟化技术的完善,SDN交换机可以是软件形态,如OVS就是一款基于开源技术实现的、能够与服务器虚拟化(Hypervisor)集成,具备交换机的功能的虚拟交换机。另外,OVS支持传统的标准管理接口,如NetFlow和sFlow等。
3)应用层
应用层对于开发者来说是开放区域,鼓励开发尽可能多的创新应用。包括网络的可视化:拓扑结构、网络状态、网络统计等;网络自动化相关应用:网络配置管理,网络监控,网络故障排除,网络安全策略等。SDN应用程序可以为企业和数据中心网络提供各种端到端的解决方案。
4)南向接口
控制层到基础设施层(网络交换机)通讯需要经过南向接口,目前主要的协议是OpenFlow、NetConf、OVSDB。OpenFlow协议是事实上的国际行业标准,其中NOX、Onix、Floodlight都是基于OpenFlow协议实现的开源控制器。作为一个开放的协议,OpenFlow突破了传统网络设备厂商各自为政形成的设备能力接口壁垒。
5)北向接口
应用层通过API方式与SDN控制器通讯。与南向接口不同,现在北向接口还缺少业界公认的标准,实现方案思路有的从用户角度出发、有的从运营商角度出发、有的从产品能力角度出发。技术风格上,部分传统的网络设备厂商倾向于在现有的设备上提供编程接口供业务App调用,许多上层应用的开发者也比较倾向于采用 REST API 接口的形式。
四、距离精通SDN到底有多远
如果你想在SDN领域成为专家级人物,你就必须掌握图2提到所有的知识。在此建议分成4个阶段进行深度学习,具体每个阶段学习哪些知识,可参考以下描述。
Step1:既然SDN是网络技术,那学习SDN必须要懂传统的网络知识
1)协议栈:ARP、IP、ICMP、UDP、TCP、DHCP、DNS等
2)路由技术:OSPF、ISIS、BGP、IPv6、Multicast等
3)交换技术:VLAN、Trunk、Ethechannel、VRRP等
4)标签技术:MPLS、MPLSL2 VPN、MPLS L3 VPN、MPLSTE等
5)流控技术:QoS(分类标记、队列机制、拥塞避免、监管整形)
6)安全技术:IPSec VPN、SSLVPN、Firewall、IDS/IPS
建议学习以上内容时,参考思科、华为等网络厂商的认证课程(CCNA/HCNA等),按照基础到进阶再到高级一点点积累。
Step2:需要懂一门编程语言,经典C或C++、Java或Python
目前大部分的控制器都是Java和Python实现的,对于网络工程师出身的,如果是编程新手,建议直接从Python入手;如果是码农,对于各种编程语言都比较熟悉,那直接跳过本阶段的学习。
Step3:开始啃各种OpenFlow白皮书,阅读OpenFlow行业大会的PPT和资料(靠谱的技术方案,靠谱的商用案例)
OpenFlow的白皮书可以直接到官网下载,根据版本迭代从1.0开始,最好通读一遍英文版,然后再搜集国内的一些中文翻译版。OpenFlow的行业大会无非就是ONF/ONS、OpenDayLight、ONOS等,技术大会是整个行业的方向标,有利于判断现阶段SDN走到什么阶段,有什么比较好的商用案例借鉴,是否有新的产品更新等。
Step4:搭建SDN学习环境,开始上手折腾起来
常用的SDN虚拟系统/控制器,例如Mininet、OpenDayLight、ONOS等。通过这些工具搭建出SDN网络,然后通过Wireshark工具进行OpenFlow协议分析,通过编程语言如Python编写基础功能用例并进行测试,前期可以研读一些开源的SDN代码,再慢慢根据自己的业务需求进行定制。
我的公众号「码农之屋」(id: Spider1818) ,分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎大家关注。