实验目的
目的:学习和掌握距离向量算法
内容:编程实现并分析以下过程
实验内容与分析
实验环境
CentOS 7.7 + GCC 4.8.5
Win10+Python3.6
实验环境配置
本次实验使用五台虚拟机模拟五个路由器,网络连接均为NAT模式,端口统一用20000,五个路由器的名称及对应IP如下:
A : 192.168.126.65
B : 192.168.126.66
C : 192.168.126.67
D : 192.168.126.68
E : 192.168.126.69
网络配置方法如下:
以路由器A为例
在终端输入如下命令
1 | cd /etc/sysconfig/network-scripts/ |
可以看到第一个网卡ifcfg-ens33
用nano或vim对其进行编辑
注释BOOTPROTO=dhcp,将其设置为静态IP
1 | #BOOTPROTO=dhcp |
并在后面添加IP配置信息
1 | GATEWAY=192.168.126.2 |
GATEWAY和NETMASK可以在VMWare的虚拟网络编辑器查看
设置完成后重启网络服务
1 | service network restart |
利用ifconfig可以看到网络地址设置成功
同理依次设置其他4个虚拟机IP即可
实验原理
实验代码
DVroute.py
1 | #!/usr/bin/env python3 |
shell脚本文件
1 | python3 DVroute.py 20000 192.168.126.66 20000 2 192.168.126.69 20000 2 |
1 | python3 DVroute.py 20000 192.168.126.65 20000 2 192.168.126.67 20000 8 192.168.126.69 20000 6 |
1 | python3 DVroute.py 20000 192.168.126.66 20000 8 192.168.126.68 20000 3 |
1 | python3 DVroute.py 20000 192.168.126.67 20000 3 192.168.126.69 20000 6 |
1 | python3 DVroute.py 20000 192.168.126.65 20000 2 192.168.126.66 20000 6 192.168.126.68 20000 6 |
1 | python3 DVroute.py 20000 192.168.126.66 20000 2 |
1 | python3 DVroute.py 20000 192.168.126.65 20000 2 192.168.126.67 20000 3 |
1 | python3 DVroute.py 20000 192.168.126.66 20000 3 |
1 | python3 DVroute.py 20000 192.168.126.66 20000 2 |
1 | python3 DVroute.py 20000 192.168.126.65 20000 2 192.168.126.67 20000 3 192.168.126.68 20000 1 |
1 | python3 DVroute.py 20000 192.168.126.66 20000 3 192.168.126.68 20000 1 |
1 | python3 DVroute.py 20000 192.168.126.66 20000 1 192.168.126.67 20000 1 |
任务1:模拟路由收敛
任务要求
Solution
开启A、B、C、D、E五台虚拟机,分别运行shell脚本
1 | sh 路由器名1.sh |
收敛后结果如下:
对照网络拓扑图后,验证收敛正确
任务2:模拟拓扑变化
任务要求
Solution
在任务一的基础上在B上继续输入距离改变命令
1 | linkchange 192.168.126.69 20000 2 |
距离改变后,A、C的路由表未发生变化,得到B、D、E变化如下
对照网络拓扑图后,验证收敛正确
任务3:制造路由回路
任务要求
Solution
开启C、B、A三台虚拟机,分别运行shell脚本
注意:运行shell脚本顺序C必须在B前面,否则无法观察到路由回路效果(这是因为DV路由算法中若自己的路由表项的某一目的路由的下一跳为邻居X,则直接用邻居X发来的路由表项进行更新而不进行比较,因此要让B赶在C之前根据C发来的路由表替换关于目的路由A的信息,所以C要在B前启动)
1 | sh 路由器名2.sh |
收敛后结果如下:
在B中输入如下命令
1 | linkdown 192.168.126.65 20000 |
观察可发现B、C之间产生了路由回路
任务4:解决路由回路
任务要求
Solution
此任务需修改DVroute.py代码
保存后同任务三一样进行相应操作
收敛后结果如下:
在B中输入如下命令
1 | linkdown 192.168.126.65 20000 |
可以发现不产生路由回路
思考题
任务要求
Solution
查阅RFC1058,发现如下一段话:
意思是逆向毒化只能杜绝仅涉及两个网关的回路生成,而不能杜绝涉及三个网关之间的互相欺骗而导致的回路生成。
以下作者制造一个涉及三个路由器的路由回路:
开启C、B、D、A四台虚拟机,逆向毒化设置为开启状态,分别运行shell脚本
注意:运行shell脚本顺序应是C、B、D、A,否则无法观察到路由回路效果
1 | sh 路由器名3.sh |
收敛后结果如下:
在B中输入如下命令
1 | linkdown 192.168.126.65 20000 |
可以观察到B、C、D之间产生一个路由回路
之所以逆向毒化技术无法杜绝回路生成,是因为其定义——若向邻居X发送的路由表项中某一项的下一跳是邻居X,则将跳数设为不可达。因此其只能杜绝仅涉及两个网关的路由回路,而对于最佳路径上的下一跳是某个邻居的邻居,当有坏消息,则可能造成三个网关的互相欺骗而形成路由回路。
实验小结
本次实验是对DV路由算法的仿真,算法不算困难,在实验三socket编程实验中对聊天室程序的server.py做进一步修改即可完成实验。笔者通过继承socket.socket类生成一个Router类,方便对各项函数进行联系和管理。此次实验十分有趣,加深了我对路由算法的理解和认识,以及进一步熟练掌握python编程。另外,遗憾的是由于时间有限,笔者本次只实现了更新定时器一个功能,对于其他定时器功能,还需笔者对RFC和路由算法做进一步了解后方可实现。