SDN相比传统网络具有很多优点,比如控制与转发分离,这种思想打破了传统设备供应商的绑定,提高了新业务的部署速度,可以从整个网络层面对流量进行优化等等。在SDN网络中,不管是开发人员还是用户,都可以更多的发挥自己的想象,而不用再受各种RFC的强力约束。

一、传统网络发展及特点

从1969年ARPA NET运行算起,传统网络已经发展了半个世纪,网络按照OSI的模型分成7层,通常所见最多的是二层和三层。二层就是二层交换机构成的网络,在这个网络中交换机学习mac地址和端口的对应关系,通过匹配二层报文的mac地址决定如何转发。一般在一个二层网络中,由于广播风暴的原因,管理的设备不应超过百台,否则会导致网路不稳定和网络性能的下降。三层就是由路由设备连接不同网段构成的网络,跨网段的通信都需要路由,而路由器就通过记录IP地址和端口的对应关系连通不同的网段。不管是IPv4还是IPv6,我们能够在世界范围内使用internet,底层都是由二层网络和三层网络构成的坚实基础。

传统网络从一开始就是一个分布式的网络,没有中心的控制节点,网路中的各个设备之间通过口口相传的方式学习网络的可达信息,由每台设备自己决定要如何转发,这直接导致了没有整体观念,不能从整个网络的角度对流量进行调控。由于是口口相传,就必须使用大家都会的语言,这就是网络协议。各个设备供应商不能自己随便开发协议,否则不同厂商各执己见,网络还是不通。这样全球性的组织就诞生了,比如IETF,而RFC就是网络协议的法律,相当于国际法,各个设备供应商遵从国际法行事,就基本保证了整个网络世界的正常运行。设备提供商就相当于不同的国家,与现实中一样,法律为了适应时代的发展也在不断的修订补充,而各个国家基于自己利益的考虑,不断抢占对自己更有利的山头,想尽办法规避其他国家主导的法律对自己的约束,传统网络就在博弈中不断前进。这种由通用法律约束的发展方式,就限制了网络运营商新业务的部署速度。网络运营商负责对用户提供网络接入功能,用户的需求千差万别,一旦原有基础网络无法满足新需求,就需要上升到协议制定修改的层面,各个设备提供商开始提出各种方案交由IETF裁决,形成新的法律,再由设备提供商实现,重新升级基础网络内的所有设备以支持新业务的部署。这个过程想想就觉得漫长,一般都要经过至少半年,甚至几年的时间。

从传统网络的部署方式能看出来,传统网络新业务部署是补丁式的,因为网络中新老设备并存,新业务必须兼容老业务,新的协议基本上都是在原有协议上进行扩展,这就大大限制的设备提供商的想象力。

传统网络的协议为了适应各种不同的需求场景,发展也越来越复杂,想必有传统网络开发和维护经验的同学都有深刻体会吧。单说部署一个传统的网络,就涉及到ARP、STP、OSPF、ISIS、RIP、BGP、组播等多种协议,如果涉及VPN,又有L2VPN、L3VPN,其中又会有VPLS、PWE3、VLL、MPLS、LDP、BGP VPN扩展,而部署方式又有Martini、Kompella、Option A、Option B、Option C、跨域C&C…,是不是看着就晕?并且由于法律的不完善,RFC中常常存在一些没有明确的地方,这导致了各提供商的实现中存在些许差异,而如果你将要部署的网路中存在多个提供商的设备,那么这些差异很可能在将来某个时候爆发网络问题。传统网络的运维工程师都是经过长年累月的学习和经验积累成长起来的。

虽然数量众多并且复杂,但是传统网络协议也有他的优点,协议本身做到了和设备提供商无关,如果理解了一个协议,那么运维工程师之间交流不会有问题,运用此协议构建的网络都可以维护。各设备提供商的最大的差异主要集中在操作界面上。

二、SDN网络的发展及特点

当前的SDN网络一般都是如下形式:有一个控制器(或集群),他负责收集整个网络的拓扑、流量等信息,计算流量转发路径,通过openflow协议将转发表项下发给交换机,交换机按照表项执行转发动作。和控制器对应,执行转发动作的交换机一般称为转发器。控制面从传统网络的单个设备上剥离,集中到了控制器上,转发面由转发器构成。

网络部署有两种形式:一种是underlay的网络,这种网络中,所有的转发行为都由控制器决定,控制器通过OpenFlow协议或者定制的BGP协议将转发表项下发给转发器,转发器仅仅执行动作,没有单独的控制面。另一种是overlay的网络,这种网络的转发器一般都是传统设备,不支持OpenFlow,或者私有定制协议不能部署。这时就要用到隧道技术,基础网络还是传统网络形式,通过路由协议打通各个节点,但是在服务器接入点,采用隧道技术将数据报文进行封装或者解封装。对传统网络来说见到的就是普通的数据报文,转发即可。隧道技术实际上就是报文的马甲,迷惑网络设备,让设备以为是自己人,但是实际上报文的心是虚拟化的心。现在一般采用VxLan、GRE、NVGRE等隧道技术。而这些也是新增的协议,也需要升级现有网络设备才能支持。穿马甲虽然能够在不进行大的改造的情况下增加新的功能,但无疑会降低网路性能,underlay方式一定是SDN网络的终极形式。

SDN网络的控制面,不再是口口相传,而是集中智能,从更高的层次看整个网络,通过软件来控制网络行为。这里的软件已经不再由设备供应商绑定设备提供,而是用户可以自己实现。SDN网络唯一标准化的是控制器与转发器的通信接口,就是OpenFlow,不是传统意义上的网络控制协议,只是一个接口,控制器和转发器按接口实现即可,至于控制器要如何控制,转发器要如何转发,都是一片空白。SDN打开了一扇通往奇境的大门。

ovs已经成为转发器实现事实上的标准,而控制器则是百家争鸣,有ODL、ONOS、AC、Ryu等。各种控制器的实现也有不小的差异,控制原理也都不同,这就对运维人员带来了挑战。在传统网络时代懂得了协议就懂得了网络,而在SDN时代,控制器才是网络的核心,只有弄懂控制器实现原理,才能懂得网络。

在现阶段,OpenFlow作为接口,网络上传递的报文还是按照传统网络时代定义的格式进行封装,而控制器现阶段能做的也仅是对报文封装的字段进行修改。而下一阶段,当P4或者华为的POF作为接口时,网络将彻底变革,用户不仅可以控制转发行为,还能按需定义报文封装格式,而不再局限于mac、ip等等。虽然更灵活,但是各个局域网络的实现可能都不相同,对网络运维人员来说可能会更困难,换一个网络可能就需要学习一套新的规则。但是这也真正体现软件定义的魅力,控制器的控制形式势必会更加多种多样,网络也会进入一个新的轮回。

三、从ping的流程看传统网络与SDN网络:

1.传统网络

如上图拓扑,网络中间有三台设备构成基础网络,两个客户端属于不同的网络,两个客户端要互访

基础网络构建步骤如下:

1)由于客户端处于不同网段,因此需要路由设备,可以用CE2作为路由设备,或者CE1、2、3均作为路由设备,这里将三台均作为路由设备,CE1、2、3之间三层通信

2)CE1作为CLIENT1的网关设备;CE3作为CLIENT2的网关设备,网关代答ARP

3)CE1、CE2、CE3之间通过静态路由或者路由协议学习 192.168.10 和192.168.20 网段的路由

路由通路的建立主要关注两个字段:路由前缀和下一跳。在传统路由器上,通过命令行可以很直观的看到各种信息之间的关联

[~CE1]display ip interface brief

*down: administratively down

!down: FIB overload down

(l): loopback

(s): spoofing

(d): Dampening Suppressed

The number of Physical UP interfaces: 4

The number of Physical DOWN interfaces: 0

The number of Protocol UP interfaces: 3

The number of Protocol DOWN interfaces: 1

Interface IP Address/Mask Physical Protocol VPN

GE1/0/0 192.168.10.1/24 up up -

GE1/0/1 10.1.1.1/24 up up -

MEth0/0/0 unassigned up down -

NULL0 unassigned up up(s) -
上面是典型的接口信息表显示,可以看到接口以及接口IP、状态信息Shell

[~CE1]display ip routing-table

Proto: Protocol Pre: Preference

Route Flags: R - relay, D - download to fib


Routing Table : public

Destinations : 11 Routes : 11

Destination/Mask Proto Pre Cost Flags NextHop Interface

10.1.1.0/24 Direct 0 0 D 10.1.1.1 GE1/0/1

10.1.1.1/32 Direct 0 0 D 127.0.0.1 GE1/0/1

10.1.1.255/32 Direct 0 0 D 127.0.0.1 GE1/0/1

127.0.0.0/8 Direct 0 0 D 127.0.0.1 InLoopBack0

127.0.0.1/32 Direct 0 0 D 127.0.0.1 InLoopBack0

127.255.255.255/32 Direct 0 0 D 127.0.0.1 InLoopBack0

192.168.10.0/24 Direct 0 0 D 192.168.10.1 GE1/0/0

192.168.10.1/32 Direct 0 0 D 127.0.0.1 GE1/0/0

192.168.10.255/32 Direct 0 0 D 127.0.0.1 GE1/0/0

192.168.20.0/24 Static 60 0 D 10.1.1.1 GE1/0/1

255.255.255.255/32 Direct 0 0 D 127.0.0.1 InLoopBack0

上面是典型的路由表结构,从路由表中可以看到路由匹配项及下一跳、出接口信息。要构建192.168.10.2 到192.168.20.2的通路,实际上需要让CE1知道20网段的下一跳是10.1.1.2,CE2要知道20网段的下一跳是20.1.1.2,这样单向通路就建立起来了,再建反向通路即可。

传统网络的打通,需要在途经的每一台设备上进行配置,需要自己规划整个网络的拓扑、端口的IP地址、路由协议等等,在网络构建和维护过程中都需要人工持续不断的干预。虽然如此,但是传统网络中仍然有一定的智能,路由协议在配置好后,一定程度上不再需要做过多的干预。比如CE1、2、3组成的骨干网在配置好动态协议后,后续再增加同网段的新客户端,是不需要修改配置的。但是如果要部署新业务,如VPN等,就需要对整网配置进行修改。在传统网络中,ping的处理流程如下:

1)在CLIENT1上ping CLIENT2

2)CLIENT1在通过ARP获取到网关MAC后,构造ICMP request报文发往CE1

3)在CE1上解析ICMP报文,通过目的IP地址在路由表查找匹配表项,找到出接口发往CE2

4)CE2做同样的事情,将报文发往CE3,CE3发往CLIENT2

5)CLIENT2构造应答报文发往,目的IP填192.168.10.2,发往CE3,通过路由查找过程,报文到达CLIENT1在这个过程中,接收->查找->转发的一系列动作是设备的内部实现,对用户来说是黑盒,实际上“查找”就是IP的在路由表中的匹配过程。

2.SDN网络

以纯underlay的SDN网络举例,如下图所示拓扑

控制器通过ovs上报的packetin消息触发处理流程,计算好路径后,通过openflow下发给所有转发器,打通链路,主机之间能够互通。转发器上没有控制面,之间也没有交互,转发器最基本动作就是对收到的报文上报控制器,一切的逻辑行为都由控制器负责。

在转发器上,需要把物理口绑定到OVS上,OVS才能进行管理,所以在OVS上查看接口信息如下:

Shell

root@ck:~# ovs-vsctl show

c0e6f272-485a-4e30-b1ed-518b0ade9cc7

Bridge “s2”

Controller “ptcp:6635”

Controller “tcp:127.0.0.1:6633”

is_connected: true

fail_mode: secure

Port “s2”

Interface “s2”

type: internal

Port “s2-eth3”

Interface “s2-eth3”

Port “s2-eth1”

Interface “s2-eth1”

Port “s2-eth2”

Interface “s2-eth2”
Shell

123root@ck:~# ovs-ofctl dump-flows s1

NXST_FLOW reply (xid=0x4):

cookie=0x0, duration=383.313s, table=0, n_packets=32, n_bytes=2544, idle_age=373, priority=0 actions=CONTROLLER:65535
这条流表是用来将报文上送控制器的。在主机v1之间ping v2后,查看流表信息:

Shell

root@ck:~# ovs-ofctl dump-flows s1

NXST_FLOW reply (xid=0x4):

cookie=0x0, duration=2.876s, table=0, n_packets=4, n_bytes=336, idle_age=0, priority=1,in_port=2,dl_dst=00:00:00:00:00:01 actions=output:1

cookie=0x0, duration=2.875s, table=0, n_packets=3, n_bytes=294, idle_age=0, priority=1,in_port=1,dl_dst=00:00:00:00:00:03 actions=output:2

cookie=0x0, duration=516.728s, table=0, n_packets=35, n_bytes=2726, idle_age=2, priority=0 actions=CONTROLLER:65535
多了两条流表,第一条是匹配从2口进入ovs的报文,如果报文的目的mac是v2,从ovs 1口出;第二条是匹配从1口进入ovs的报文,如果报文的目的mac是v1,从ovs 2口出。可以看到这里的port已经变成了数字,要查看编号和名字的对应关系,需要通过其他的表:

Shell

root@ck:~# ovs-ofctl show s1

OFPT_FEATURES_REPLY (xid=0x2): dpid:0000000000000001

n_tables:254, n_buffers:256

1(s1-eth1): addr:0e:c0:36:94:3c:be

config: 0

state: 0

current: 10GB-FD COPPER

speed: 10000 Mbps now, 0 Mbps max

2(s1-eth2): addr:1a:a0:81:52:ec:b5

config: 0

state: 0

current: 10GB-FD COPPER

speed: 10000 Mbps now, 0 Mbps max

LOCAL(s1): addr:92:0d:a5:20:e0:4c

config: PORT_DOWN

state: LINK_DOWN

speed: 0 Mbps now, 0 Mbps max
可以看到在SDN网络中的匹配和动作行为比传统网络要丰富的多,不仅仅是匹配前缀,转发下一跳那么简单了。但是SDN网络设备的用户界面信息表现不直观,相比传统网络还有很大的提升空间。在此网络中,ping的处理流程如下:

  1. 在V1上ping V2
  2. V1通过ARP获取请求网关MAC
  3. ARP报文在OVS1上匹配流表,上送控制器
  4. 控制器进行ARP代答,构造ARP应答报文通过OVS1发给V1
  5. V1在获取到mac后,构造ICMP request报文发往V2
  6. OVS1在收到ICMP报文后,依然不知道如何处理,继续上送控制器
  7. 控制器根据报文信息,计算转发路径,向转发路径上的所有转发器下发流表
  8. 控制器将首包通过OVS1发给OVS2,由于OVS2、OVS3上已经有可以匹配的流表,因此报文会一直送到V2上
  9. V2的应答流程如上类似,差别在于反向的流表已经提前下发,V2的应答报文不会再上送控制器在SDN网络中,对于控制器如何计算、下发什么样的流表是没有统一标准的,只要能正确处理主机之间的报文即可。在上面的例子中,所实现的控制器与通常的不同,由于仅存在两台主机,因此对于三层报文,没有通过匹配IP的方式进行转发,ARP的应答也并不是应答的网关mac,而是直接将目的主机的mac进行了应答,因此,虽然是三层互通,但是通过控制器,也可以做到流表直接匹配mac转发,而不需要IP。从这也可以看到SDN的灵活性。

四、总结

传统网络已经经过半个世纪的发展,凝聚了无数人的智慧和心血,但是由于天生的缺陷,导致在很多场景上心有余而力不足,并且越来越复杂。SDN虽然诞生没多久,但是已经表现出非常强的生命力。传统网络在安全、可靠性、可维护性和性能上还有很大的优势,但是随着SDN相关设备的发展,这种优势必然会越来越弱,而SDN依靠自己的优势,一定会不断占领传统网络的领地。而在SDN内部,overlay网络相比underlay网络,简化不足,复杂有余,在传统网络的基础上叠加虚拟化,比传统网络更复杂。overlay之于underlay,就好比ipv4之于ipv6,要从根本上解决问题,underlay必然是最终的选择。