Mininet调用API扩展自定义拓扑
1、调用API接口扩展自定义的拓扑,并丰富链路。
2、在原有拓扑的情况下,更改拓扑级链路信息。
Mininet作为一个基于Python的网络仿真工具,可以分为两大部分:Python库和运行文件。前者对网络中元素进行抽象和实现,例如定义主机类来表示网络中的一台主机;后者则基于这些库完成模拟过程。
topo 类中包含构建网络的函数如:
- addHost(“host name”): 添加主机
- addSwitch(“sw name”): 添加交换机
- addLink(node,node): 添加链路
- attach(port):添加端口
扩展拓扑在原有拓扑的基础上成功添加主机。
Mininet流表应用实战1——手动添加流表
1、掌握SDN交换机的工作原理。
2、掌握Open vSwitch下发流表的方法。
3、通过Mininet自定义创建拓扑,不使用控制器,手动添加流表操作实现主机间的通信。
4、掌握Mininet中添加、删除流表命令。
在SDN环境下,当交换机收到一个数据包并且交换机中没有与该数据包匹配的流表项,且交换机未被SDN控制器控制,交换机将此数据包丢弃。可以通过对流表操作来控制交换机的转发行为,通过手动对交换机下发流表,当交换机交换机收到一个数据包时,因已手工添加相对应的流表,交换机根据流表操作转发数据包,使主机间通信。
先创建拓扑,这里还需要学习一些vim编辑器的命令https://blog.csdn.net/zhang_yu_ling/article/details/103777714
在主机h1中分别ping主机h2和h3,在主机h2和h3上查看tcpdump的抓包结果,可以看到主机h1 Ping h2和h3失败了,主机h2和h3上没有收到任何ICMP echo request packet。
原理解析:ping操作时,由于拓扑里没有SDN控制器,也没有用dptcl给OpenFlow交换机添加任何flow entry,所以交换机不会做转发决定,并直接丢弃h1到h2及h1到h3的ping包。
执行命令添加交换机端口流表使主机h1和h2通信,在主机h1中执行如下命令分别ping主机h2和h3,可以看到主机h1成功ping通h2,且h3没收到任何ping包。
原理解析:用dpctl对交换机添加flow,让交换机从s1-eth1这个端口接收到的所有traffic都从s1-eth2这个端口发出去。用dpctl给交换机添加双向流表,因为ping包除了echo request还有echo reply。所以还需要用dpctl对交换机添加flow,让交换机从s1-eth2这个端口接收到的所有traffic都从s1-eth1这个端口发出去。添加这两条flow后,h1能够ping通h2,但是并没有为h1和h3之间添加对应的端口流表,所以h1与h3不通。
接下来尝试添加协议流表使h1/h2通信。
执行如下命令添加两条traffic类型为IPv4(0x0800)协议相关的flow entry,并查看下发的流表。
在主机h1中执行如下命令分别ping主机h2和h3。
可以看到无法ping通。
原理解析:用dpctl对交换机添加flow,让交换机把所有EtherType为0x0800(IPv4)并且destiation IP为10.0.0.2的traffic从s1-eth2这个端口发出去。用dpctl对交换机添加flow,让交换机把所有EtherType为0x0800(IPv4)并且destiation IP为10.0.0.1的traffic从s1-eth1这个端口发出去。但处在同一网段下的主机,它们之间的交流是L2 forwarding,需要靠ARP来解析MAC地址,之前只匹配了0x0800(IPv4)协议,并没有匹配到0x0806(ARP),这样当交换机收到h1的ARP包后,因为没有控制器,flow table里面也没有相应的flow告诉它如何转发这个ARP包,交换机只能将它丢弃,从而导致h1 ping h2失败,所以需要添加ARP协议的流表来使通信。
执行命令dpctl add-flow dl_type=0x0806,actions=NORMAL添加ARP(0x0806)协议相关的流表,让交换机以NORMAL形式(即广播)将所有ARP包从各个端口广播出去。
在主机h1中执行如下命令分别ping主机h2和h3。
在主机h2和h3上查看tcpdump抓包结果。
可以看到主机h1能够ping通h2。