目录
基于OpenFlow的SDN网络
拓扑代码——mytopo.py
流表操作
查看流表
删除流表
添加流表
上图以主机h1向网络发送数据包时的情况为例,若发送给主机h2,则路线为①②③⑥,每条路径的解释见图注。若读者没有了解过OpenFlow协议,请参考下面的文章,可以看看里面的数据结构,以及Packetin、Packetout、Flow-Mod消息、流表的字段等。
SDN-OpenFlow1.0协议分析
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进行网络构建
SDN-Mininet安装使用
启动控制器,博主使用的是OpenDaylight
启动mininet
查看所有流表
dpctl dump-flows
仅查看某个交换机的流表需要使用ovs-ofctl, 本文主要使用dpctl,其他命令请查看SDN-Mininet命令详解(dpctl ovs-vsctl ovs-ofctl)
删除所有流表命令
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通。
可以看到两个交换机的1、2端口均打开,而在构建网络时主机h2是3号端口,所以ping不通。
cookie=0x0, duration=3.146s, table=0, n_packets=0, n_bytes=0, idle_timeout=60, priority=65535,arp,in_port="s1-eth1",vlan_tci=0x0000,dl_src=c2:9d:8f:ac:b9:1c,dl_dst=a6:a5:54:a4:3f:9b,arp_spa=10.0.0.3,arp_tpa=10.0.0.1,arp_op=2 actions=output:"s1-eth2"
上面是SDN-Mininet安装使用文章中pingall命令后的流表,多了些字段。
查看OF1.0交换机,可以看到和之前分析协议时写的一样,有一些动作等。
接下来我们删除交换机s1中入端口为2的流表项,h1与h3就无法ping通了。
接下来,我删除了所有流表,重新添加端口1、2的流表项,使之可以ping通,再添加丢弃流表项,使通过端口2的数据包丢弃,最后h1与h3之间无法ping通。
查看流表可以看出,每个交换机均添加了一条action为drop的流表项。
mininet其他命令请查看SDN-Mininet命令详解(dpctl ovs-vsctl ovs-ofctl)
更多SDN相关内容,请查看:SDN-自学笔记
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。