网络配置非常复杂,所以很容易出错。SDN和OpenFlow协议通过使用一种统一语言来替换各个供应商的私有配置语法,以简化网络配置任务。
在一个OpenFlow SDN环境中,工程师不再需要用生成树等协议去管理各个设备,而是将网络的控制面板解耦,将它转移到一个中央SDN控制器上。然后,这个控制器能够为网络上的所有设备作出数据包转发决策。
但是,OpenFlow接口也非常复杂,所以研究人员开发了一些网络编程语言,如Frenetic和Pyretic,它们可以简化OpenFlow SDN编程。
OpenFlow SDN背后的复杂过程
虽然OpenFlow控制器使管理员不需要再逐个配置和管理数量庞大的设备,但是这个系统所使用的路由选择决策过程仍然非常复杂。
在一个基于控制器的SDN环境中,如果有一个数据包的来源和目标从未见过,当它到达一个网络设备时,这个设备就会把数据包发送到控制器上。这个控制器负责决定如何转发这个数据包。然后,它会在设备上配置转发规则,有相同来源和目标的后续数据包就可以根据这个规则转发。
来源与目标信息对就称为流(Flow)。控制器会为每一个流创建一条转发规则,然后在每一个设备上为路径配置这一条规则。转发规则可能基于各种因素,如流量负载、安全性或延迟要求。
流规则可能指定一个来源和目标信息对,也可能包含一些通配符地址。每一个设备都会保存一组按优先级排列的流规则。当一个数据包到达设备时,它会对比流规则列表,然后根据最高优先级的规则进行转发。
通配符规则一定要小心定义,避免那些本应该发送到控制器上单独处理的数据包被通配符规则提前转发出去。如果一个流基于多个条件转发数据包,那么必须有一条规则包含所有的条件。否则,这个流将会基于列表中第一条规则来转发数据包,而后续规则将会被忽略。这些都是需要简化的复杂因素。
网络编程语言可以简化OpenFlow
Frenetic和Pyretic是普林斯顿和康奈尔大学教师和学生正在研究的编程语言。这两种语言都是高级语言,它们的目标是隐藏SDN编程的复杂性和减少出错概率。这两个语言的研发都在Frenetic Project的整体框架中进行。
Frenetic包含了基于Ocaml编程语言的编程语法和运行时刻。它主要设计用来操作开源NOX控制器的。Pyretic基于Python,可以操作POX控制器。
这两种语言将数量庞大的OpenFlow命令替换为少数高级命令,从而可以加快网络策略的开发。此外,它们也能够简化策略的创建过程。
使用底层OpenFlow命令指定多个交换机操作是有难度且容易出错的。每一个操作的语句必须按顺序发出,才能保证命令按正确顺序执行。例如,配置一个交换机同时转发数据包并进行计数,需要将OpenFlow命令组合到一系列命令中。写入一个策略模块,由它配置一个设备基于当前链路负载、数据包优先级和安全来转发数据包,同时完成数据包计数,这是一个非常有难度的任务。
通过使用语言接口,程序员就可以为每一个操作或条件指定一个策略。然后,他们可以使用Frenetic或Pyretic将每一个策略组件写为一个独立模块。这些语言的运行时刻可以通过组合策略来创建OpenFlow命令,实现所有的条件并将它们按正确顺序排列。这样就可以防止执行一个策略的命令时与其它策略的命令发生冲突。
此外,语言和运行时刻也可以避免出现一些常见编程错误,如无法处理可能出现的竞争条件。在新数据包流的第一个数据包出现时,就经常发生这种情况。在控制器将新规则下发到这个设备之前,第二个数据包可能已经到达了路径中的下一个设备。
第二个数据包可能也会被发送到控制器上,从而产生不必要的计算时间,或者由于所部署的通配符规则而出现错误转发。运行时有一些规则可以防止出现这个情况。此外,运行时还可以在策略更新期间消除设备之间的不一致性。它们可以保证所有的数据包全部都按旧策略或新策略进行转发。
Frenetic和Pyretic采用了不同的方法
Frenetic和Pyretic采用了不同的策略模块解析方法。Frenetic提供了一个并行模型。在程序员看来,进入控制器的每一个数据包都由一个对应的策略模块处理,也就是说模块是并行执行的。支持多个条件的策略看起来也是并行执行的,如基于链路转发同时计算数据包数量。
Pyretic也支持并行执行,但是它也支持顺序执行。例如,Pyretic程序员可以规定一个访问控制模块在负载均衡模块之前执行。此外,程序员也可以让策略随时间推移而变化。
监控网络状态是一个重要功能。控制器必须快速知道各个链路的负载或链路出现的问题。这些语言包含了一些命令,运行时可以通过解析这些命令来创建一组OpenFlow命令,检测网络事件、记录计数和组合统计信息,从而提供关于网络运行状况的总体视图。
Frenetic和Pyretic继续向前发展
这两个语言的研发工作仍在继续。Pyretic团队增加了一些特性,如支持服务质量,正在开发RADIUS和DHCP服务器等应用。其他研究人员也开始关注它们。佐治亚理工学院的教师与学生还使用Pyretic重新实现了它的Resonance控制器。所有工作在一天内就完成了,完成的代码行数减少了六倍。Frenetic团队正在改进其编译器的效率,同时也在验证所生成代码的正确性。
在研究机构推出这些语言并应用到商业领域之后,它们将会大大加快SDN的应用速度。