实验原理
网络链路拥塞是指在分组交换网络中传送分组的数目太多时,由于存储转发节点的资源有限而造成网络传输性能下降的情况。当网络发生拥塞时,一般会出现数据丢失,时延增加,吞吐量下降,严重时甚至会导致“拥塞崩溃”。通常情况下,当网络中负载过度增加致使网络性能下降时,就会发生网络拥塞。
因此,根据这些特征,构建了一个网络拓扑(SDN网络拓扑,普通拓扑也行,但是我这是构建的SDN架构,为了方便我后续的学习),设计了一种逐渐增加链路中发送的数据包,从而观察各个主机的丢包率和链路带宽的情况。
实验设备:2台Ubuntu虚拟机(普通网络拓扑一也行,这里的两台主要是有一台运行远程ryu控制器)
实验软件:mininet、ovs(普通拓扑不需要)、iperf、wireshark
实验步骤
1、构建网络拓扑
实验中,使用mininet进行网络拓扑构建,为了方便我使用的是可视化界面miniedit(mininet的具体使用方法见前几篇博客),拓扑图如下
根据上图,构建了一个SDN架构的网络拓扑,一共有7台主机连接到一个ovs交换机(普通网络拓扑可以不要控制器,使用普通的交换机,也就是左边的蓝色方形的交换机)。主机1-主机7的IP地址分别为10.0.0.1~10.0.0.7,此外,为了能够使链路可以拥塞,设置各个链路的带宽为1Mbit/s,链路设置中还有其他参数也可以根据情况进行设置。(链路的可选设置self.addLink( node1, node2, bw=10, delay='5ms', max_queue_size=1000, loss=10, use_htb=True)
: adds a bidirectional link with bandwidth, delay and loss characteristics, with a maximum queue size of 1000 packets using the Hierarchical Token Bucket rate limiter and netem delay/loss emulator. The parameter bw
is expressed as a number in Mbit; delay
is expressed as a string with units in place (e.g. '5ms', '100us', '1s'); loss
is expressed as a percentage (between 0 and 100); and max_queue_size
is expressed in packets.)。至于控制器和OVS的设置不是本节实验的重点,可以见之前的博客描述进行设置。
2、测试原始链路带宽
拓扑构建完成后,就可以运行拓扑了,然后打开主机1~主机7的xterm终端。本实验将主机7作为服务端,主机1~6作为客户端对其进行访问。测试原始带宽,即测试链路中没有数据传输时的各个主机访问主机7时的带宽,使用的工具为iperf,安装过程自行查找。
(1)在h7的终端中输入命令iperf -s -p 5566 -i 1开启服务,即在h7的终端中,将h7设为服务器server,设置端口为5566,间隔时间1s。
(2)分别在h1-h6的终端中输入命令iperf -c 10.0.0.7 -p 5566 >> host_link_bandwidth_before.txt,也就是分别在h1-h6去访问h7,将链路的带宽的数据记录在host_link_bandwidth_before.txt文件中,这个文件提前在/mininet/examples目录下建好了,>>即Linux的重定向命令,具体的使用可以自行查找。下图显示了h1-h6执行命令完成后,输入命令cat host_link_bandwidth_before.txt查看文件的内容。
根据上图可以看出h1~h6和h7之间的链路带宽基本维持在1Mbit/s左右,基本符合前面对链路带宽的设置。
3、测试链路有数据时的链路带宽(2的对照实验)
为了更好的观察不同的数据密度下链路带宽的变化,实验主要统计h1和h7之间的链路带宽变化,以h2~h6这5个主机作为数据发送端,逐渐以1~5个主机发送ping泛洪数据为链路数据,记录h1和h7之间的链路带宽,即1,2,3,4,5个主机泛洪攻击主机7时,主机1到主机7链路的带宽变化。在h1的终端中输入命令iperf -c 10.0.0.7 -p 5566 >> host_bandwidth_after.txt,即h1访问h7,将测试带宽的结果写入文件host_bandwidth_after.txt中。下图从上倒下依次显示了,有1~5个主机对主机7进行泛洪时,主机1和主机7之间的链路带宽测试数据。
根据上图的结果可以看出带宽从924kbit/s逐渐下降到227kbit/s。
4、测试原始链路各个主机访问主机7的丢包率和时延
此步让各个主机分别发送icmp请求报文到主机7,即各个主机 ping 主机7。分别在h1~h6的终端中输入命令ping 10.0.0.7 >> host_ping_result_before.txt,即将主机ping h7的结果输出到文件host_ping_result_before.txt中。下图显示了h1 ping h7,并且显示了各个主机ping操作完成后的 host_ping_result_before.txt 里面的数据。
根据上图的结果,可以看出在每个主机单独 ping 主机7时丢包率基本为0,说明链路的质量较好,没有发生拥塞。
5、测试链路有数据时的数据丢包率(3的对照实验)
这一步,以h7作为服务端,h1作为数据测试端,在h1的终端中输入ping -f 10.0.0.7 >> host_pingflood_result_after.txt测试h1到h7的数据丢包率,ping -f即不断的对服务端进行ping操作。测试分别在h2~h6逐渐增多发送数据的情况下统计数据,即当链路中只有h1和h2对h7发送数据时输出一次h1和h7的丢包率测试结果,链路中有h1,h2,h3主机访问h7时输出h1和h7的丢包率测试结果,依次进行当6台主机都ping泛洪h7时,输出h1 ping h7的结果。下图第一个是h1和h2同时对h7进行ping泛洪,第二个图是h1丢包率的测试结果,第三个图是依次1-6个主机同时对h7进行ping泛洪时h1丢包率的测试结果。
根据上图结果,可以看出丢包率随着链路数据的逐渐增多而逐渐升高,说明了链路拥塞就会造成数据的丢包情况加剧。
截止此时,实验已经可以看出链路拥塞带来的数据传输的影响,为了有更好的说服力,接下来使用wireshark进行抓包分析。
6、wireshark抓包
安装wireshake自行查找相关的知识。对于wireshark的过滤器的操作参考https://blog.csdn.net/csdnhxs/article/details/80941842。
具体也就是分别在h1和h7的终端上输入命令sudo wireshark & 启动wireshark对数据进行抓包,h1中的wireshark抓h1 ping h7的数据包,h7中的wireshark抓h1 ping h7的数据包。
根据上图结果,可以看出h1发送了4113个icmp请求报文给h7,但是h7只收到了3743个请求报文,说明链路拥塞对数据传输产生了很大的影响。