SDN-流表分析与增删改查
目录
基于OpenFlow的SDN网络
上图以主机h1向网络发送数据包时的情况为例,若发送给主机h2,则路线为①②③⑥,每条路径的解释见图注。若读者没有了解过OpenFlow协议,请参考下面的文章,可以看看里面的数据结构,以及Packetin、Packetout、Flow-Mod消息、流表的字段等。
拓扑代码——mytopo.py
from mininet.topo import Topo
class MyTopo( Topo ):
def __init__( self ):
# initilaize topology
Topo.__init__( self )
# add hosts and switches
h1 = self.addHost( 'h1' )
h2 = self.addHost( 'h2' )
h3 = self.addHost( 'h3' )
s1 = self.addSwitch( 's1' )
s2 = self.addSwitch( 's2' )
# add links
self.addLink(h1,s1,1,1)
self.addLink(h2,s1,1,3)
self.addLink(h3,s2,1,1)
self.addLink(s1,s2,2,2)
topos = { 'mytopo': ( lambda: MyTopo() ) }
你也可以使用图形化界面miniedit进行网络构建
启动控制器,博主使用的是OpenDaylight
启动mininet
流表操作
查看流表
查看所有流表
dpctl dump-flows
删除流表
删除所有流表命令
dpctl del-flows
在SDN-OpenFlow1.0协议分析中的控制器配置流表(Flow-Mod消息)部分是不是还提到了删除部分流表呀,我们也可以根据条件进行删除。
删除入端口号为1和2的流表项命令
dpctl del-flows in_port=1
dpctl del-flows in_port=2
上面的dpctl命令是针对所有流表的,那么针对某个交换机的流表如何删除呢?
对某个交换机的流表进行删除命令(删除交换机s1流表中入端口号为2的流表项)
sh ovs-ofctl del-flows s1 in_port=2
添加流表
添加入端口为1,出端口为2及入端口为2,出端口为1的流表项
dpctl add-flow in_port=1,actions=output:2
dpctl add-flow in_port=2,actions=output:1
添加丢弃数据包的流表,丢弃入端口为2的数据包
dpctl add-flow in_port=2,actions=drop
流表实践
我们查看流表,刚开始为空,当然也就ping不通。接下来添加了两个流表项,再次ping,可以看到h1与h3之间可以ping通。
cookie为控制器定义的流表项标识符
duration是持续时间
table是流表的id
n_packets大概是缓冲的数据包数(不太清楚,有读者知道,请下方评论)
n_bytes大概是缓冲的字节数(不太清楚,有读者知道,请下方评论)
in _port是入端口
actions是动作列表
output是动作,意思是输出
可以看到两个交换机的1、2端口均打开,而在构建网络时主机h2是3号端口,所以ping不通。
接下来我们删除交换机s1中入端口为2的流表项,h1与h3就无法ping通了。
接下来,我删除了所有流表,重新添加端口1、2的流表项,使之可以ping通,再添加丢弃流表项,使通过端口2的数据包丢弃,最后h1与h3之间无法ping通。
查看流表可以看出,每个交换机均添加了一条action为drop的流表项。
更多SDN相关内容,请查看:SDN-自学笔记
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。
推荐阅读