SDN问答学习


SDN 流表是什么呢?

所谓流表,其实可被视作是OpenFlow对网络设备的数据转发功能的一种抽象。在传统网络设备中,交换机和路由器的数据转发需要依赖设备中保存的二层MAC地址转发表或者三层IP地址路由表,而OpenFlow交换机中使用的流表也是如此,不过在它的表项中整合了网络中各个层次的网络配置信息,从而在进行数据转发时可以使用更丰富的规则。流表中每个表项的结构如下所示:

-----------------------
| 包头域 | 计数器 | 动作 |
-----------------------

OpenFlow流表的每个流表项都由3部分组成:

  • 包头域: 用于数据包匹配的包头域(Header Fields)。OpenFlow流表的包头域(OpenFlow v1.1之后被称作匹配域),用于对交换机接收到的数据包的包头内容进行匹配。在OpenFlow v1.0中,流表的包头域中包括了12个元组(Tuple),相关内容如下所示:
OpenFlow流表包头域:

----------------------------------------------------------------------------------------------------------------
|入端口|源MAC地址 |目的MAC地址|以太网类型|VLANID|VLAN优先级|源IP地址|目的IP地址|IP协议|IP TOS位|TCP/UDP源端口|TCP/UDP目的端口|
----------------------------------------------------------------------------------------------------------------

包头域中用于和交换机接收到的数据包进行匹配的元组涵盖了ISO网络模型中第二至第四层的网络配置信息。每一个元组中的数值可以是一个确定的值或者是“ANY”以支持对任意值的匹配。另外,如果交换机能够在IP地址相关元组上支持子网掩码的话,将有助于实现更精确的匹配。

  • 计数器: 用于统计匹配数据包个数的计数器(Counters)。OpenFlow流表的计数器可以针对交换机中的每张流表、每个数据流、每个设备端口、每个转发队列进行维护,用于统计数据流量的相关信息。例如:针对每张流表,统计当前活动的表项数、数据包查询次数、数据包匹配次数等;针对每个数据流,统计接收到的数据包数、字节数、数据流持续时间等;针对每个设备端口,除统计接收到的数据包数、发送数据包数、接收字节数、发送字节数等指标之外,还可以对各种错误发生的次数进行统计;针对每个队列,统计发送的数据包数和字节数,还有发送时的溢出(Overrun)错误次数等。

  • 动作: 用于展示匹配的数据包如何处理的动作(Actions)。OpenFlow流表的动作用于指示交换机在收到匹配的数据包后应该如何对其进行处理。与传统交换机转发表只需要指明数据包的转发出端口不同,OpenFlow交换机因为缺少控制平面的能力,所以对匹配数据包的处理不仅仅是简单的转发操作,而需要用动作来详细说明交换机将要对数据包所做的处理。OpenFlow交换机的每个流表项可以对应有零至多个动作,如果没有定义转发动作,那么与流表项包头域匹配的数据包将被默认丢弃。统一流表项中的多个动作的执行可以具有优先级,但是在数据包的发送上并不保证其顺序。另外,如果流表项中出现有OpenFlow交换机不支持的参数值,交换机将向控制器返回相应的出错信息。动作分为必备动作(Required Actions)和可选动作(Optional Actions)两种类型。其中,必备动作是需要由所有的OpenFlow交换机默认支持的,而可选动作则需要由交换机告知控制器它所能支持的动作种类。OpenFlow流表动作的列表如表下表所示:

|---------------------------------------------------------------------------------------------------------------
|类型	|   名    称	        |   说    明
|---------------------------------------------------------------------------------------------------------------
|       |           	    |交换机必须支持将数据包转发给设备的物理端口及如下的一个或多个虚拟端口
|       |                   |   ALL:转发给所有出端口,但不包括入端口
| 必备   |转发(Forward)       |   CONTROLLER:封装数据包并转发给控制器
| 动作   |                   |   LOCAL:转发给本地的网络栈
|       |                   |   TABLE:对packet_out消息执行流表的动作
|       |                   |   IN_PORT:从入端口发出
|       |-------------------------------------------------------------------------------------------------------
|       |丢弃(Drop)	        | 对没有明确指明处理动作的流表项,交换机将会对与其所匹配的所有数据包进行默认的丢弃处理
|---------------------------------------------------------------------------------------------------------------
|   	|转发(Forward)	    |交换机可选支持将数据包转发给如下的虚拟端口
|       |                   |   NORMAL:利用交换机所能支持的传统转发机制(例如二层的MAC、VLAN信息或者三层的IP信息)处理数据包
| 可选   |                   |   FLOOD:遵照最小生成树从设备出端口洪泛发出,但不包括入端口
|       |-------------------------------------------------------------------------------------------------------
| 动作   |排队(Enqueue)	    |交换机将数据包转发到某个出端口对应的转发队列中,便于提供QoS支持
|       |-------------------------------------------------------------------------------------------------------
|       |修改域(Modify-Field)	|交换机修改数据包的包头内容,具体可以包括:
|       |                   |  — 设置VLAN ID、VLAN优先级,剥离VLAN头
|       |                   |  — 修改源MAC地址、目的MAC地址
|       |                   |  — 修改源IPv4地址、目的IPv4地址、ToS位
|       |                   |  — 修改源TCP/IP端口、目的TCP/IP端口
|---------------------------------------------------------------------------------------------------------------

OpenFlow交换机在接收到网络数据包后,对其处理流程如下图所示:

openflow交换机接收网络数据包处理流程

OpenFlow交换机解析包头的流程,如下图所示:

openflow交换机解析包头的流程

Niujie /
Categories: Technology  tagged: SDN 
Be Zero, Be Funny.