软件定义网络-OpenvSwitch

软件定义网络(SDN)。它主要有以下三个特点:

软件定义网络-OpenvSwitch_第1张图片

  • 控制与转发分离:转发平面就是一个个虚拟或者物理的网络设备,就像小区里面的一条条路。控制平面就是统一的控制中心,就像小区物业的监控室。它们原来是一起的,物业管理员要从监控室出来,到路上去管理设备,现在是分离的,路就是走人的,控制都在监控室。
  • 控制平面与转发平面之间的开放接口:控制器向上提供接口,被应用层调用,就像总控室提供按钮,让物业管理员使用。控制器向下调用接口,来控制网络设备,就像总控室会远程控制电梯的速度。这里经常使用两个名词,前面这个接口称为北向接口,后面这个接口称为南向接口,上北下南嘛。
  • 逻辑上的集中控制:逻辑上集中的控制平面可以控制多个转发面设备,也就是控制整个物理网络,因而可以获得全局的网络状态视图,并根据该全局网络状态视图实现对网络的优化控制,就像物业管理员在监控室能够看到整个小区的情况,并根据情况优化出入方案。

OpenFlow 是 SDN 控制器和网络设备之间互通的南向接口协议,OpenvSwitch 用于创建软件的虚拟交换机。OpenvSwitch 是支持 OpenFlow 协议的,当然也有一些硬件交换机也支持 OpenFlow 协议。它们都可以被统一的 SDN 控制器管理,从而实现物理机和虚拟机的网络连通。

软件定义网络-OpenvSwitch_第2张图片

在 OpenvSwitch 里面,有一个流表规则,任何通过这个交换机的包,都会经过这些规则进行处理,从而接收、转发、放弃。

那流表长啥样呢?其实就是一个个表格,每个表格好多行,每行都是一条规则。每条规则都有优先级,先看高优先级的规则,再看低优先级的规则。

软件定义网络-OpenvSwitch_第3张图片

对于每一条规则,要看是否满足匹配条件。这些条件包括,从哪个端口进来的,网络包头里面有什么等等。满足了条件的网络包,就要执行一个动作,对这个网络包进行处理。可以修改包头里的内容,可以跳到任何一个表格,可以转发到某个网口出去,也可以丢弃。

通过这些表格,可以对收到的网络包随意处理。

通过上面的表格可以看出,简直是想怎么处理怎么处理,可以覆盖 TCP/IP 协议栈的四层。

对于物理层

  • 匹配规则包括从哪个口进来;
  • 执行动作包括从哪个口出去。

对于 MAC 层:

  • 匹配规则包括:源 MAC 地址是多少?(dl_src),目标 MAC 是多少?(dl_dst),所属 vlan 是多少?(dl_vlan);
  • 执行动作包括:修改源 MAC(mod_dl_src),修改目标 MAC(mod_dl_dst),修改 VLAN(mod_vlan_vid),删除 VLAN(strip_vlan),MAC 地址学习(learn)。

对于网络层

  • 匹配规则包括:源 IP 地址是多少?(nw_src),目标 IP 是多少?(nw_dst)。
  • 执行动作包括:修改源 IP 地址(mod_nw_src),修改目标 IP 地址(mod_nw_dst)。

对于传输层:

  • 匹配规则包括:源端口是多少?(tp_src),目标端口是多少?(tp_dst)。
  • 执行动作包括:修改源端口(mod_tp_src),修改目标端口(mod_tp_dst)。

总而言之,对于 OpenvSwitch 来讲,网络包到了手里,就是一个 Buffer,想怎么改怎么改,想发到哪个端口就发送到哪个端口。

在 OpenvSwitch 里面,有个 bond_mode,可以设置为以下三个值:

  • active-backup:一个连接是 active,其他的是 backup,只有当 active 失效的时候,backup 才顶上;
  • balance-slb:流量按照源 MAC 和 output VLAN 进行负载均衡;
  • balance-tcp:必须在支持 LACP 协议的情况下才可以,可根据 L2、L3、L4 进行负载均衡(L2、L3、L4 指的是网络协议 2、3、4 层)

OpenvSwitch 包含很多的模块,在用户态有两个重要的进程,也有两个重要的命令行工具。

  • 第一个进程是 OVSDB 进程。ovs-vsctl 命令行会和这个进程通信,去创建虚拟交换机,创建端口,将端口添加到虚拟交换机上,OVSDB 会将这些拓扑信息保存在一个本地的文件中。
  • 第二个进程是 vswitchd 进程。ovs-ofctl 命令行会和这个进程通信,去下发流表规则,规则里面会规定如何对网络包进行处理,vswitchd 会将流表放在用户态 Flow Table 中。

在内核态,OpenvSwitch 有内核模块 OpenvSwitch.ko。他会在网卡上注册一个函数,每当有网络包到达网卡的时候,这个函数就会被调用。

在内核的这个函数里面,会拿到网络包,将各个层次的重要信息拿出来,例如:

  • 在物理层,会拿到 in_port,即包是从哪个网口进来的;
  • 在 MAC 层,会拿到源和目的 MAC 地址;
  • 在 IP 层,会拿到源和目的 IP 地址;
  • 在传输层,会拿到源和目的端口号。

在内核中,还有一个内核态 Flow Table。接下来内核态模块在这个内核态的流表中匹配规则,如果匹配上了,就执行相应的操作,比如修改包,或者转发,或者放弃。如果内核没有匹配上,这个时候就需要进入用户态,用户态和内核态之间通过 Linux 的一个机制叫 Netlink,来进行相互通信。

内核通过 upcall,告知用户态进程 vswitchd,在用户态的 Flow Table 里面去匹配规则,这里面的规则是全量的流表规则,而内核态的 Flow Table 只是为了做快速处理,保留了部分规则,内核里面的规则过一段时间就会过期。

当在用户态匹配到了流表规则之后,就在用户态执行操作,同时将这个匹配成功的流表通过 reinject 下发到内核,从而接下来的包都能在内核找到这个规则,来进行转发。

这里调用 openflow 协议的,是本地的命令行工具。当然你也可以是远程的 SDN 控制器来进行控制,一个重要的 SDN 控制器是 OpenDaylight。

下面这个图就是 OpenDaylight 中看到的拓扑图。

软件定义网络-OpenvSwitch_第4张图片

我们可以通过在 OpenDaylight 里,将两个交换机之间配置通,也可以配置不通,还可以配置一个虚拟 IP 地址为 VIP,在不同的机器之间实现负载均衡等等,所有的策略都可以灵活配置。

此文章为9月Day25学习笔记,内容来源于极客时间《趣谈网络协议》,推荐该课程。

你可能感兴趣的:(网络协议,网络协议)