概述: 组表: 计量表: 实验准备: 实验拓扑结构如下: 构建自定义拓扑结构实验环境:Ubuntu 20.04 + mininet + OpenDayLight(li) + wireshark
# my_topo.py
# mn --custom /my_topo.py --topo mytopo --mac --controller=remote,ip=127.0.0.1 --switch ovs,protocols=OpenFlow13
from mininet.topo import Topo
class MyTopo( Topo ):
def build( self ):
# Add hosts and switches
h1 = self.addHost( 'h1' )
h2 = self.addHost( 'h2' )
s1 = self.addSwitch( 's1' )
s2 = self.addSwitch( 's2' )
s3 = self.addSwitch( 's3' )
s4 = self.addSwitch( 's4' )
# Add links
self.addlink( h1, s1 )
self.addlink( h2, s4 )
self.addlink( s1, s2 )
self.addlink( s1, s3 )
self.addlink( s2, s4 )
self.addlink( s3, s4 )
topos = { 'mytopo': ( lambda: MyTopo() ) }
mininet连接自定义拓扑:
mn --custom my_topo.py --topo mytopo --mac --controller=remote,ip=127.0.0.1 --switch ovsk,protocols=OpenFlow13链路负载均衡: 查看表信息
ovs-ofctl dump-flows s1 -O OpenFlow13 ovs-ofctl dump-groups s1 -O OpenFlow13对S1下发组表和流表
ovs-ofctl -O OpenFlow13 add-group s1 group_id=1,type=select,bucket=actions=output:2,bucket=actions=output:3 ovs-ofctl -O OpenFlow13 add-flow s1 table=0,priority=1000,in_port=1,nw_dst=10.0.0.1,actions=group:1对S2,S3下发流表
ovs-ofctl -O OpenFlow13 add-flow s2 table=0,priority=1001,in_port=1,actions=output:2 ovs-ofctl -O OpenFlow13 add-flow s2 table=0,priority=1001,in_port=2,actions=output:1 ovs-ofctl -O OpenFlow13 add-flow s3 table=0,priority=1001,in_port=1,actions=output:2 ovs-ofctl -O OpenFlow13 add-flow s3 table=0,priority=1001,in_port=2,actions=output:1对S4下发流表
ovs-ofctl -O OpenFlow13 add-flow s4 table=0,priority=1001,in_port=2,dl_dst=00:00:00:00:00:02,actions=output:1 ovs-ofctl -O OpenFlow13 add-flow s4 table=0,priority=1001,in_port=3,dl_dst=00:00:00:00:00:02,actions=output:1验证 容灾备份: 对S1下发组表
ovs-ofctl -O OpenFlow13 add-group s1 group_id=1,type=ff,bucket=watch_port:2,output:2,bucket=watch_port:3,output:3
对S1下发流表ovs-ofctl -O OpenFlow13 add-flow s1 priority=1000,in_port=1,actions=group:1
看组表信息ovs-ofctl -O OpenFlow13 dump-group-stats s1
断开链路、制造故障ovs-ofctl -O OpenFlow13 mod-port s1 2 down
验证: Qos 连接mininet,构建拓扑。mn --controller=remote,ip=127.0.0.1 --mac --nat --topo=tree,depth=2,fanout=3 --switch ovsk,protocols=OpenFlow13设置datapath
设置datapath为用户态。datapath一般来说是运行在内核态,如果想实现限速功能,就需要将其设置成用户态。
ovs-vsctl set bridge s2 datapath_type=netdev ovs-vsctl set bridge s2 protocols=OpenFlow13下发限速的meter表。
交换机:s2;速度:5M;动作:丢弃;id:1
# 下发 ovs-ofctl add-meter s2 meter=1,kbps,band=type=drop,rate=5000 -O OpenFlow13 # 查看是否下发成功 ovs-ofctl dump-meter s2 -O openflow13下发转发的流表。
匹配进端口为1,转发动作为meter:1,output:2。meter:1表示匹配到的流表首先交给meter表处理,就是超过5M的数据包丢弃掉,然后在交给output:2,从2端口转发出去。
# 对port1即h1限速 ovs-ofctl add-flow -O OpenFlow13 s2 priority=200,in_port=1,action=meter:1,output:2 # 对port2即h2不限速 ovs-ofctl add-flow -O OpenFlow13 s2 priority=200,in_port=2,actions=output:1关闭主机的网卡的tx校验
# 这里主机的网卡ens33mininet的网卡s2-eth2需依据实际情况替换 ethtool -K ens33 tx off ethtool -K s2-eth2 tx off验证
通过iperf验证速度可以得到此时的带宽为5M。
客户端以10M的速度发包,客户端接收到的速率为5M,可见限速成功。
开启服务端h2接收并验证。iperf 参数:
-c 指定为iperf客户端
-s 指定为iperf服务器
-p 设置端口
-i 每隔一秒监视结果
-u 使用UDP而不是TCP
& 在后台运行
h2 xterm &
iperf -u -s -p 12888
h1 xterm &
iperf -u -c 10.0.0.2 -b 10M -i 1 -t 5 -p 12888



