Mininet教程(五):流表
SDNLAB:Mininet入门与实战 笔记
拓扑结构
在mininet/custom文件中新建py脚本(命名为topo-2sw-3host.py),生成3主机2交换机的网络:
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import RemoteController
from mininet.link import TCLink
from mininet.util import dumpNodeConnections
class MyTopo( Topo ):
def __init__( self ):
Topo.__init__( self )
# hosts & switches
Host1 = self.addHost( 'h1' )
Host2 = self.addHost( 'h2' )
Host3 = self.addHost( 'h3' )
Switch1 = self.addSwitch( 's1' )
Switch2 = self.addSwitch( 's2' )
# links
self.addLink( Host1, Switch1 )
self.addLink( Host2, Switch1 )
self.addLink( Host3, Switch2 )
self.addLink( Switch1, Switch2 )
topos = {'mytopo': ( lambda : MyTopo() ) }
在终端中执行命令:
sudo mn --custom topo-2sw-3host.py --topo mytopo
controller使用默认设置。
流表相关命令
查看静态流表
在mininet环境下:
mininet> dpctl dump-flows #查看静态流表
刚开始交换机s1、s2流表为空。
主机的互ping操作,使得交换机的流表更新(通过与controller通信)。譬如h1 ping h2可以更新s1的流表,h1 ping h3可以更新s1和s2的流表。
mininet> dpctl dump-flows
*** s1 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
*** s2 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
mininet> h1 ping h2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=3.92 ms
^C
--- 10.0.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 3.920/3.920/3.920/0.000 ms
mininet> dpctl dump-flows
*** s1 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=7.596s, table=0, n_packets=0, n_bytes=0, idle_timeout=60, idle_age=7, priority=65535,icmp,in_port=2,vlan_tci=0x0000,dl_src=5e:63:4a:82:dd:33,dl_dst=26:35:0a:98:23:f9,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,icmp_type=0,icmp_code=0 actions=output:1
cookie=0x0, duration=2.356s, table=0, n_packets=1, n_bytes=42, idle_timeout=60, idle_age=2, priority=65535,arp,in_port=1,vlan_tci=0x0000,dl_src=26:35:0a:98:23:f9,dl_dst=5e:63:4a:82:dd:33,arp_spa=10.0.0.1,arp_tpa=10.0.0.2,arp_op=1 actions=output:2
cookie=0x0, duration=2.354s, table=0, n_packets=1, n_bytes=42, idle_timeout=60, idle_age=2, priority=65535,arp,in_port=2,vlan_tci=0x0000,dl_src=5e:63:4a:82:dd:33,dl_dst=26:35:0a:98:23:f9,arp_spa=10.0.0.2,arp_tpa=10.0.0.1,arp_op=1 actions=output:1
cookie=0x0, duration=2.351s, table=0, n_packets=0, n_bytes=0, idle_timeout=60, idle_age=2, priority=65535,arp,in_port=2,vlan_tci=0x0000,dl_src=5e:63:4a:82:dd:33,dl_dst=26:35:0a:98:23:f9,arp_spa=10.0.0.2,arp_tpa=10.0.0.1,arp_op=2 actions=output:1
cookie=0x0, duration=2.349s, table=0, n_packets=0, n_bytes=0, idle_timeout=60, idle_age=2, priority=65535,arp,in_port=1,vlan_tci=0x0000,dl_src=26:35:0a:98:23:f9,dl_dst=5e:63:4a:82:dd:33,arp_spa=10.0.0.1,arp_tpa=10.0.0.2,arp_op=2 actions=output:2
*** s2 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
添加流表
mininet> dpctl add-flow in_port=1,actions=output:2 #对所有的switch添加
mininet> dpctl add-flow in_port=2,actions=drop #丢弃数据包
譬如:
mininet> dpctl add-flow in_port=1,actions=output:2
*** s1 ------------------------------------------------------------------------
*** s2 ------------------------------------------------------------------------
mininet> dpctl add-flow in_port=2,actions=output:1
*** s1 ------------------------------------------------------------------------
*** s2 ------------------------------------------------------------------------
mininet> dpctl dump-flows
*** s1 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=16.432s, table=0, n_packets=0, n_bytes=0, idle_age=16, in_port=1 actions=output:2
cookie=0x0, duration=9.793s, table=0, n_packets=0, n_bytes=0, idle_age=9, in_port=2 actions=output:1
*** s2 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=16.432s, table=0, n_packets=0, n_bytes=0, idle_age=16, in_port=1 actions=output:2
cookie=0x0, duration=9.793s, table=0, n_packets=0, n_bytes=0, idle_age=9, in_port=2 actions=output:1
此时h1、h2之间互ping,因为已经有流表记录了相应操作,所以switch不需要再与controller通信了。但h1和h3之间不可以互ping,因为流表没有指定对于端口3的操作。
mininet> h1 ping h2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.177 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.048 ms
^C
--- 10.0.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1021ms
rtt min/avg/max/mdev = 0.048/0.112/0.177/0.065 ms
mininet> dpctl dump-flows
*** s1 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=76.287s, table=0, n_packets=2, n_bytes=196, idle_age=3, in_port=1 actions=output:2
cookie=0x0, duration=69.648s, table=0, n_packets=2, n_bytes=196, idle_age=3, in_port=2 actions=output:1
*** s2 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=76.287s, table=0, n_packets=0, n_bytes=0, idle_age=76, in_port=1 actions=output:2
cookie=0x0, duration=69.648s, table=0, n_packets=0, n_bytes=0, idle_age=69, in_port=2 actions=output:1
mininet> h1 ping h3
PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
From 10.0.0.1 icmp_seq=9 Destination Host Unreachable
From 10.0.0.1 icmp_seq=10 Destination Host Unreachable
From 10.0.0.1 icmp_seq=11 Destination Host Unreachable
^C
--- 10.0.0.3 ping statistics ---
14 packets transmitted, 0 received, +3 errors, 100% packet loss, time 13305ms
pipe 4
当更改流表为drop时,h1和h2也不能ping通了:
mininet> dpctl add-flow in_port=1,actions=drop
*** s1 ------------------------------------------------------------------------
*** s2 ------------------------------------------------------------------------
mininet> dpctl dump-flows
*** s1 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=215.839s, table=0, n_packets=0, n_bytes=0, idle_age=215, in_port=2 actions=output:1
cookie=0x0, duration=9.080s, table=0, n_packets=0, n_bytes=0, idle_age=160, in_port=1 actions=drop
*** s2 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=215.840s, table=0, n_packets=0, n_bytes=0, idle_age=215, in_port=2 actions=output:1
cookie=0x0, duration=9.080s, table=0, n_packets=0, n_bytes=0, idle_age=221, in_port=1 actions=drop
mininet> h1 ping h2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
From 10.0.0.1 icmp_seq=10 Destination Host Unreachable
From 10.0.0.1 icmp_seq=11 Destination Host Unreachable
From 10.0.0.1 icmp_seq=12 Destination Host Unreachable
^C
--- 10.0.0.2 ping statistics ---
15 packets transmitted, 0 received, +3 errors, 100% packet loss, time 14329ms
pipe 4
删除流表
mininet> dpctl del-flows #删除所有流表
mininet> dpctl del-flows in_port=2 #仅对入口2
mininet> sh ovs-ofctl del-flows s1 in_port=2 #仅对s1&入口2
譬如:
mininet> dpctl dump-flows
*** s1 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=330.753s, table=0, n_packets=0, n_bytes=0, idle_age=330, in_port=2 actions=output:1
cookie=0x0, duration=123.994s, table=0, n_packets=18, n_bytes=1260, idle_age=95, in_port=1 actions=drop
*** s2 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=330.754s, table=0, n_packets=0, n_bytes=0, idle_age=330, in_port=2 actions=output:1
cookie=0x0, duration=123.994s, table=0, n_packets=0, n_bytes=0, idle_age=336, in_port=1 actions=drop
mininet> dpctl del-flows in_port=2
*** s1 ------------------------------------------------------------------------
*** s2 ------------------------------------------------------------------------
mininet> dpctl dump-flows
*** s1 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=139.906s, table=0, n_packets=18, n_bytes=1260, idle_age=110, in_port=1 actions=drop
*** s2 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=139.906s, table=0, n_packets=0, n_bytes=0, idle_age=352, in_port=1 actions=drop
mininet> sh ovs-ofctl del-flows s1 in_port=1
mininet> dpctl dump-flows
*** s1 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
*** s2 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=263.703s, table=0, n_packets=0, n_bytes=0, idle_age=476, in_port=1 actions=drop