了解运行 Junos OS 的设备上的 OpenFlow 流和过滤器
OpenFlow 流由各种元素定义。 表 1 概述了对 OpenFlow v1.0 和 OpenFlow v1.3.1 中流元素的支持。OpenFlow 版本支持的元素可唯一标识流。
流元素 |
OpenFlow v1.0 中受支持? |
OpenFlow v1.3.1 中受支持? |
---|---|---|
匹配条件 |
是的 |
是的 |
操作集 |
是的 |
不 |
流指令 |
不 |
是的 |
流优先级 |
是的 |
是的 |
流超时信息 |
是的 |
是的 |
流 Cookie 和 Cookie 掩码 |
不 |
是的 |
流条目为不需要完全匹配的字段指定通配符匹配条件。如果流条目包含所有匹配条件的通配符,则所有数据包都匹配该流条目。
要实施基于 OpenFlow 流的转发,运行 Junos OS 的设备会使用过滤器。对于配置为参与 OpenFlow 的每个逻辑接口,都会创建一个过滤器,并将其应用于输入方向上的逻辑接口。过滤器名称是接口名称的串联,包括逻辑单元号和内部分配的虚拟交换机 ID,例如 ge-1/1/0.0_0。
如果手动配置过滤器名称或过滤器术语名称与自动生成的 OpenFlow 过滤器名称或过滤器术语名称相冲突,Junos OS 不会在期间 commit check
生成错误。如果存在冲突,则提交将成功,但其中一个过滤器或过滤器术语会根据接收顺序予以拒绝。
过滤器由一个或多个带有匹配条件和操作(适用于 OpenFlow v1.0)或指令(适用于 OpenFlow v1.3.1)组成。OpenFlow 流映射到过滤器术语,而添加、删除和修改流的 OpenFlow 控制器请求将导致在过滤器中添加、删除或修改术语。当 OpenFlow 控制器发送流修改请求时,入口端口的流条目匹配条件将确定更新了哪个逻辑接口过滤器。OpenFlow 流优先级可确定过滤器中条款的顺序,其中优先级较高的条款安装在优先级较低的条款之上。流匹配条件映射到过滤器术语匹配条件,流操作或指令映射到过滤器术语 then
语句。根据流操作或指令, then
语句可能包含将数据包转发到下一跃点或 OpenFlow 控制器或丢弃数据包的操作。
如果 OpenFlow 控制器发送修改流的请求,但没有流条目与条件匹配,OpenFlow v1.0 会将该流的条目添加到流表中。但是,在这种情况下,OpenFlow v1.3.1 不会将此流添加到流表中,也不会记录错误。
每个 OpenFlow 流条目都对应一个过滤器术语。但是,根据入口端口的匹配条件,每个流条目可能会映射到一个或多个过滤器中的一个术语。如果入口端口是通配符匹配项,则流条目将作为一个术语显示在该 OpenFlow 虚拟交换机的所有接口过滤器中。例如,假设 OpenFlow 控制器发送请求,以将新流条目与入口端口字段的通配符匹配。在这种情况下,流会添加为该虚拟交换机下配置的所有 OpenFlow 逻辑接口的新过滤器术语。
运行 Junos OS 的设备同时支持严格流和非严格流 mod 命令,用于修改和删除流。OpenFlow 控制器严格修改和严格删除流模块请求仅修改或删除与所有标头字段(包括通配符和优先级)的描述完全匹配的流。非严格修改和删除流模块请求修改或删除与请求完全匹配或比请求更具体的流。
除了已经说明的功能外,OpenFlow v1.3.1 还支持流 Cookie,这是 OpenFlow 控制器在流表中安装流时可以指定的标识符。此 Cookie 使 OpenFlow 能够过滤为流修改而选择的流,并删除操作。
您可以为在任何流条目 drop
上不匹配的数据包配置默认操作,这些数据包会丢弃数据包,或者 packet-in
接受数据包并将其转发至控制器。默认操作特定于 OpenFlow 虚拟交换机,在与该虚拟交换机关联的所有过滤器中都是相同的。如果未显式配置默认操作,则默认为 packet-in
。
如果某个逻辑接口不可用,将从数据包转发引擎中移除与该逻辑接口关联的过滤器。虽然过滤器被移除,但路由引擎仍会保留与逻辑接口匹配的流作为入口端口,直到流被清除以响应 OpenFlow 计时器。有关 OpenFlow 计时器的信息,请参阅 了解运行 Junos OS 的设备上的 OpenFlow 流条目计时器。如果逻辑接口在清除流之前变得可用,则路由引擎在该点保留的过滤器和任何流将重新安装到硬件中。
同样,当某个逻辑接口不可用时,将该逻辑接口作为其操作集或指令中唯一的活动出口接口的流将被视为无效。无效流将从数据包转发引擎中移除,但路由引擎会无限期地保留这些流,直到这些流在响应各种 OpenFlow 计时器时被清除。或者,将逻辑接口作为操作集或指令中的几个活动出口接口之一的流仍然有效。在这种情况下,流仍保留在数据包转发引擎中,但会更新组播下一跃点,以删除该逻辑接口作为有效的出口接口。