内容摘录自极客时间课程《趣谈网络协议》,如有侵权,请及时联系删除。
软件定义网络SDN
三个关键特点:
- 控制与转发分离
转发平面就是一个个虚拟或者物理的网络设备,控制平面就是统一的控制中心。(可以理解为之前的网络设备需要每台分别配置,现在可以进行统一配置与管理) - 控制与转发平面之间使用开放接口
控制器向上提供接口,被应用层调用,称为北向接口;控制器向下调用接口,来控制网络设备,称为南向接口。 - 逻辑上进行集中控制
逻辑上集中的控制平面可以控制多个转发面设备,也就是控制整个物理网络,因而可以获得全局的网络状态视图,并根据该全局网络状态视图实现对网络的优化控制。
OpenFlow和OpenvSwitch实现SDN
开源实现。
OpenFlow 是 SDN 控制器和网络设备之间互通的南向接口协议,OpenvSwitch 用于创建软件的虚拟交换机。OpenvSwitch 是支持 OpenFlow 协议的,当然也有一些硬件交换机也支持 OpenFlow 协议。它们都可以被统一的 SDN 控制器管理,从而实现物理机和虚拟机的网络连通。
OpenFlow协议
在OpenvSwitch里面,有一个流表规则,任何通过这个交换机的包,都会经过这些规则进行处理,从而接收、转发、放弃。流表其实就是一个个表格,每个表格好多行,每行都是一条规则。每条规则都有优先级,先看高优先级的规则,再看低优先级的规则。
对于每一条规则,要看是否满足匹配条件。这些条件包括,从哪个端口进来的,网络包头里面有什么等等。满足了条件的网络包,就要执行一个动作,对这个网络包进行处理。可以修改包头里的内容,可以跳到任何一个表格,可以转发到某个网口出去,也可以丢弃。
通过这些表格,可以对收到的网络包随意处理(随意处理?如何做到安全?),如:
- 物理层,指定从哪个口转发;
- MAC层,修改源MAC,修改目标MAC,修改VLAN,删除 VLAN,MAC 地址学习;
- 网络层,修改源IP地址,修改目标IP地址;
- 传输层,修改源端口,修改目标端口;
OpenvSwitch有本地的命令行可以进行配置。我们可以通过OpenvSwitch的命令创建一个虚拟交换机。然后可以将多个虚拟端口port添加到这个虚拟交换机上,实现虚拟网桥,vlan,网卡绑定等功能。
OpenvSwitch解析
用户态两个重要的进程:
- OVSDB 进程,使用ovs-vsctl命令行会和这个进程通信,去创建虚拟交换机,创建端口,将端口添加到虚拟交换机上,OVSDB 会将这些拓扑信息保存在一个本地的文件中。
- vswitchd进程,ovs-ofctl命令行会和这个进程通信,去下发流表规则,规则里面会规定如何对网络包进行处理,vswitchd 会将流表放在用户态 Flow Table 中。
在内核态,有内核模块OpenvSwitch.ko,其会在网卡上注册一个函数(hook),每当有网络包到达网卡的时候,这个函数就会被调用,进而将网络包中的信息进行解析,包括入(网)口、MAC、IP、端口号等。
内核态也会有Flow Table。接下来内核态模块在这个内核态的流表中匹配规则,如果匹配上了,就执行相应的操作,比如修改包,或者转发,或者放弃。如果内核没有匹配上,这个时候就需要进入用户态,用户态和内核态之间通过Linux的一个机制叫Netlink,来进行相互通信。内核通过upcall,告知用户态进程 vswitchd,在用户态的 Flow Table 里面去匹配规则,这里面的规则是全量的流表规则,而内核态的 Flow Table 只是为了做快速处理,保留了部分规则,内核里面的规则过一段时间就会过期。当在用户态匹配到了流表规则之后,就在用户态执行操作,同时将这个匹配成功的流表通过 reinject 下发到内核,从而接下来的包都能在内核找到这个规则,来进行转发。
SDN使用的其中一个开源控制器是OpenDaylight。