SDN Experiment 4
实验内容
题⽬
假如你是生活在1972年维护ARPAnet的网络管理员,在前面的实验中你学会了如何建立最短路径,下发
了一条SDC到MIT跳数最少的路径(图中绿色的路径)。你的同事Bob某天接到了一个新的需求,要求
UTAH到ILLINOIS之间的所有流量必须经过部署于TINKER的流量分析器以进行进一步研究,粗心大意的
Bob没有检查当前的网络状态就很快下发了一条新的路径(图中红色的路径)。聪明又机智的你很快意
识到Bob下发的流表很可能造成转发的环路。
实验过程
0. 从github下载VeriFlow并打上实验补丁
遇到的问题:
查找资料:
使用 Git 同步时出现gnutls_handshake() failed: Error in the pull function
git clone https://github.com/samueljero/BEADS.git
改为:
git clone git://github.com/samueljero/BEADS.git
EC:每个EC是一组在整个网络中经历相同转发动作的数据包
切换到你的包文件存放目录下
cd /usr/src
下载git安装包
sudo wget https://www.kernel.org/pub/software/scm/git/git-2.30.0.tar.gz
解压git安装包
sudo tar -zxvf git-2.30.0.tar.gz
cd git-2.30.0
配置git安装路径
sudo ./configure prefix=/usr/local/git/
编译并且安装
make && make install
实验内容
- 输出每次影响EC的数量
- 打印出环路路径的信息
- 进一步打印出环路对应的EC的相关信息
- 分析原始代码与补丁代码的区别,思考为何需要添加补丁
一、输出每次影响EC的数量
根据指导书的提示,EC数量在verifyRule函数中有定义。
找到VeriFlow.cpp第1019行,取消1019和1020行注释,并同时将1020行的输出拷贝到fp上。
重新编译VeriFlow,并按原本的要求运行对应程序。
打开log_file.txt并查看日志。
可以看出,稳定后拓扑的ecCount为3.
二、打印出环路路径的信息
根据指导书的提示,在查找环路时将每次的currentLocation保存起来即可,考虑到该函数是递归的,可以将数据保存至递归入口处的数据结构中,这里选择了字符串数组。
首先将VeriFlow.h中111行的traverseForwardingGraph定义做修改,添加一个保存环路路径的字符串数组参数。
在VeriFlow.cpp中1050行,遍历图的位置,预分配一个字符串数组,并作为参数传入。
分别在1115行和1128行加入打印环路和记录路径的代码。
其中,printLoop和arrayIn的定义如下:
添加后输出的环路如下:
三、进一步打印出环路对应的EC的相关信息
根据指导书的提示,修改PacketClass的显示即可。
首先找到traverseForwardingGraph中PacketClass的输出行,可以看出是通过调用toString方法来转为字符串的。
找到对应的代码,在EquivalenceClass.cpp的110行,将其修改为简化形式,如下:
重新编译,运行,结果如下:
四、分析原始代码与补丁代码的区别,思考为何需要添加补丁
原始代码和补丁的主要区别在于原始代码没有区分in_port,这样对于重叠的回路,会被认为是相同的数据通路,显然这样的方式划分的等价类和我们的目标是不一致的,因此需要添加in_port来保证正确地划分等价类。