OpenState之 Mac学习 实验

OpenState之 Mac学习 实验

目录

  • OpenState安装
  • Port Knocking 实验

Mac Learning 实验

环境要求:

  • 系统ubuntu 14.04
  • mininet:2.3.0d
  • 已安装OpenState

Port Knocking 实验

1.通过键入以下命令在Mininet中启动maclearning控制器应用程序:

$ ryu-manager ryu/ryu/app/openstate/maclearning.py

从启动结果可以看见交换机支持最大为四个端口:

2.启动Mininet,使用4个主机的单个拓扑:

$ sudo mn --topo single,4 --mac --switch user --controller remote

3.mininet终端上键入以下命令:

mininet> pingall

4.打开s1的终端,进行debug流表

mininet>xterm s1

在打开的s1终端窗口中,分别输入以下两条命令,查看s1中table0的流状态(请注意安装的规则如何与任何MAC地址不匹配,而只与数据包的当前状态匹配。) 和 查询s1的状态表

sudo dpctl -c unix:/tmp/s1 stats-flow

结果如下:

sudo dpctl -c unix:/tmp/s1 stats-state

OpenFLow对比试验

1 在RYU中启动simple_switch_13 app

$ ryu-manager ryu/ryu/app/simple_switch_13.py

2 启动Mininet树状拓扑

sudo mn --topo tree,4 --mac --switch user --controller remote

拓扑的形状如下,底层的每个交换机各连接两个主机,共16个主机。

3 在mininet终端 h1 ping h16,我们可以看到,第一次ICMP包ping通耗费了51.8 ms,主要是花费在广播arp包,寻找1.0.0.16。

mininet> h1 ping h16

如果ping不关闭,用wireshark软件进行抓包,从总的端口上可以看到各个网卡的流量波动如下。

ICMP数据包的访问顺序如下(右上图)。

对比

删除之前的拓扑,启动maclearning应用,重新启动mininet上相同的拓扑,再次h1 ping h16,发现使用时间为2.05 ms,简直不要太低。

删除原来拓扑命令

sudo mn -c

为了防止是意外,h1 ping h15测试了一下,时间为2.02 ms,仍然特别的小。

OpenState之MACLearning个人分析

以上例树状4层拓扑图为例,假设s4交换机与h1相连为1口,与s3相连为3口,那么ping包发送过程如下。

  • 首先解析IP,发送ARP包,s4交换机收到 1口进入+源mac(00:00:00:00:00:01)+目的mac(?未知)+state,
    根据目的mac查找state,没有找到,默认为default,即state=0。这时候进行洪泛,并且更新状态表,以目的地址为Match,state为进入端口,得出下表中第一行。

  • 一直等到从交换机3口回来的ARP数据包,这时候的信息为,3口进入+源mac(00:00:00:00:00:16)+目的mac(00:00:00:00:00:01)+state,查找state的值是根据目的mac,得出state=1,故从1口进行转发。同时,根据源mac地址(00:00:00:00:00:16)更新state为入端口,state=3。

简略状态表如下:

Match(可以理解为目的Mac) State
00:00:00:00:00:01 1
00:00:00:00:00:16 3
* 0

这个表是通过“学习”得来的,故称之为Mac学习吧。另外Match属于个人定义,State就是为对应的端口号,state=0是表示泛洪发送。不对的地方还望指正!

原文地址:https://www.cnblogs.com/Pan-xi-yi/p/10056158.html