关于SDN流表匹配顺序问题
参考博文:https://blog.csdn.net/weixin_40610952/article/details/80509378
简单地说,流表的匹配遵循两条原则:
(1)优先级不同情况下,优先级高的先匹配,优先级低的后匹配,优先级的范围0~66535,数字越大则优先级越高;
(2)优先级相同情况下,当流表项具有相同的优先级,相同的actions,不同的匹配域粒度的情况下,按照流表项添加的先后顺序匹配,最先添加的流表项,数据流优先匹配,即按照添加的先后顺序进行匹配。
一个猜想:
在OpenFlow1.3中,使用Mininet构建虚拟拓扑网络,交换机中会预设一条Table-Miss流表,优先级最低,即为0,用作未匹配任何流表项的数据包的处理,即当交换机从自身端口收到一个数据包,但是未匹配任何流表项,则把这个数据包通过Packet-in向上转发给控制器。
如下图,在交换机S1、S2、S3中,每个交换机都有一条priority=0的流表
给S3设置一条流表,sh ovs-ofctl add-flow s3 priority=0,in_port=1,action=2
现在,S3中有两条优先级为0的流表,我们可以断言,当S3收到一个数据包的时候,首先会匹配下面用红线圈出来的流表
原因解释一下,因为在优先级为0的情况下,action=CONTROLLER:66535这条流表是最早添加的,按照优先级相同,先添加先匹配的原则,因此,优先级为0的流表不管有多少条,永远是action=CONTROLLER:66535这条流表最先被匹配。
备注:注意一点,有时最初始的这条流表会被覆盖,如设置流表sh ovs-ofctl add-flow s3 priority=0,action=2,添加后,会发现action=CONTROLLER:66535这条流表被覆盖而消失,这应该是流表冲突的问题,暂时还没仔细研究。如下图,action=CONTROLLER:66535这条流表被覆盖了。