一、实验内容:
1、下载安装virtualbox和mininet虚拟机
2、学习mininet的使用,阅读相关文献和网站,比如mininet walkthrough
3、采用线型(linear)或者树形(tree)拓扑,或者用python自定义拓扑。在该拓扑下,使用dpctl下发流表,完成两个host的ping操作,用wireshark或者tcpdump抓包,截屏并分析结果
二、实验原理
1、ARP request
host1 不知道host2的MAC地址,所以会发送ARP请求,交换机收到ARP包会产生Table miss,然后报告给控制器,实验中控制器经过查找发现MAC地址表没有ARP包中的目的MAC,然后会将此包发回给交换机,并让交换机广播出去,所以最终host2会收到此ARP包。
2、ARP reply
host2使用ARPreply回复host1,控制区就学习到了host2的MAC。
3、ICMP request
host1知道host2的MAC地址,因此发送echo request给host2,此包报告给控制器,然后控制器就会下发流表,然后由控制器发送flow——mod数据包,ONetSwitch收到此数据包,就会按照数据包内容来修改流表。
4、ICMP reply
host2此时也知道了host1的MAC地址,因此发送echo reply给host1.同样,控制器也会下发流表然后后面的icmp包就直接匹配流表到达目的地,不会再报告给控制器。
三、实验过程
1、安装virtualbox和mininet虚拟机
根据网上教程下载安装即可,不再赘述过程,下图为安装后界面,是有图形显示界面的。如果不下载安装moodle上的mininet,而直接从mininet官网上下载的话,安装的结果是一个黑色界面,没有蓝色的背景图像显示,当执行sudo wireshark &时结果也是无法进入,应该还需要再安装图像界面或者wireshark。本实验仅采用moodle上的mininet进行安装并做实验。

2、采用树形拓扑,使用dpctl下发流表,完成两个host的ping操作
拓扑结构:

STEP1:创建具有1个交换机,交换机上连接3台主机的网络拓扑结构
sudo mn --topo=single,3 --mac –switch=ovsk –controller=remote
其中:
--mac:自动设置MAC地址,MAC地址与IP地址的最后一个字节相同
--arp:为每个主机设置静态ARP表,例如:主机1中有主机2和主机3的IP地址和MAC地址ARP表项,主机2和主机3依次类推。
--switch:使用OVS的核心模式
--controller:使用远程控制器,可以指定远程控制器的IP地址和端口号,如果不指定则默认为127.0.0.1和6633

注意,此时是无法连接到远程控制器的。
STEP2:尝试h1 ping h2

结果全部丢包,即ping不通,中断执行
STEP3:重新开启一个新的中断,进入pox,使其进行逆向学习操作
./pox.py forwarding.l2_learning

STEP4:再ping,可以ping通

STEP5:下发流表

3、Host和交换机连起来,和控制器进行hello操作

开启wireshark,捕获经过Lookback:lo的包,过滤器设为of
$sudo wireshark &

重新开启一个新的中断,进入pox,使其进行逆向学习操作
./pox.py forwarding.l2_learning

观察wireshark抓包情况,如下:

课上已经分析了有关数据包。该实验进行再次验证。
得到的数据包有:

48和50均是两个Hello包,分别从源端口54913到目的端口6633,再从源端口6633到目的端口54913,仔细看会发现源端口和目的端口的的ip地址相同,均为回环地址127.0.0.1
接下来分别是Feature Request, Feature Reply,也是上述两端口之间相互传递信息
下面我们来看61,63,65,67这几个Echo
61 Echo Request, 63 Echo Reply如下


可以发现,Echo Request的sequence number等于Echo Reply的acknowledge number

观察从72开始的数据包,此时出现第一个Packet_in,包中有以太网的协议和ARP协议。其传递的信息为:谁有10.0.0.2,请告诉10.0.0.1,这是一个ARP Request信息,是因为host1 不知道host2的MAC地址,所以会发送ARP请求。其目的地址为Broadcast,即广播方式传递信息,交换机收到ARP包会产生Table miss,然后报告给控制器,实验中控制器经过查找发现MAC地址表没有ARP包中的目的MAC,然后会将此包发回给交换机,并让交换机广播出去,所以最终host2会收到此ARP包。可以看到,Target MAC address是00:00:00:00:00:00,其BufferID为256
观察73的数据包Packet_out, 可以看到,他的Output port是Flood,即洪泛传播,给所有的物理端口都传递信息,则信息会传递到host2。此时的BufferID还是256。
观察75数据包Packet_in,此时传递的信息是10.0.0.2 is at ce:ac:78:3b:df:49,即已经找到了host2的MAC地址,此时的BifferID是257
观察76数据包,是第一个Flow_mod,是控制器发送给交换机信息,host2使用ARPreply回复host1,控制区就学习到了host2的MAC。此时BufferID是257
至此,流表项已经添加成功,从77开始,是ICMP协议,即host1知道host2的MAC地址,因此发送echo request给host2,此包报告给控制器,然后控制器就会下发流表,然后由控制器发送flow——mod数据包,ONetSwitch收到此数据包,就会按照数据包内容来修改流表。host2此时也知道了host1的MAC地址,因此发送echo reply给host1.同样,控制器也会下发流表然后后面的icmp包就直接匹配流表到达目的地,不会再报告给控制器。
整个的流程如下: