TCP Congestion性能测试分析
1.实验简介
最近在学习《现代计算机网络》,课程布置了一个对tcp拥塞控制性能进行测试的实验,本篇博客就本次实验做一个完整的实验报告及总结。
一.实验环境(详细说明实验运行的操作系统,网络平台,机器的配置)
- 操作系统:Windows10
- 虚拟机操作系统:SEEDUbuntu 12.04
- 虚拟机工具:VirtualBox 5.2.16
- 网络虚拟软件:GNS3 2.0.3
- 网络性能测试工具:iperf
二.实验目的
- 掌握基础ip网络配置;
- 选择 TCP 的三种支持的三种拥塞控制算法 cubic、reno、westwood,通过改变 Seed-Router 的延迟和丢包,来测试三种 TCP 拥塞控制算法在不同情况下(延迟、丢包)的性能。
- 深入理解不同TCP拥塞控制算法思路及原理。
三.实验步骤
本次实验中主要实现SeedUbuntu内核中Cubic、Reno、Westwood三种TCP拥塞控制算法的性能测试分析与比较。实验中采用三台虚拟机SEED-Client、SEED-Router、SEED-Server构建处于两个不同子网网段的可相互通信网络拓扑结构,其中保证SEED-Client和SEED-Serve采用同一TCP拥塞控制算法,通过设置SEED-Router的转发参数(丢包率、延迟、重复包率、损坏包率)模拟不同的网络状态。
1.导入SEED虚拟机镜像文件,命名为SEED-Client,再复制两个,命名为SEED-Router、SEED-Server(注意勾选重新初始化网卡的MAC地址)。
2.在GNS3中新建一个项目,将三台虚拟机按如图方式连接起来
3.然后在GNS3中给每台虚拟机配置三个网卡,eth0、eth1、eth2,其中eth0不要作为连接使用,而是将其配置为网络地址转换NAT,用于虚拟机访问外部网络。
4.按照下表配置三台主机的ip地址和路由
SEED-Client | SEED-Router | SEED-Server | |
---|---|---|---|
eth0 | / | / | / |
eth1 | 192.168.1.2/24 | 192.168.1.1/24 | 192.168.2.2/24 |
eth2 | / | 192.168.2.1/24 | / |
5.在SEED-Client端增加默认路由
用ip route命令查看
Ping www.baidu.com测试能否通过eth0联网
6.在SEED-Router端启动路由转发功能
7.在SEED-Server增加默认路由
用ip route命令查看
测试能否联网,访问外部网络。
经过上述一系列操作步骤,实现SEED-Client与SEED-Server之间能够相互ping通,并且保证三台虚拟机可以通过eth0网卡访问外部网络。
8.然后分别在SEED-Client和SEED-Server上通过sudo apt-get install iperf命令安装iperf软件
现在实验所需的环境配置完成。
linux下的拥塞控制算法
(1)观察Linux内核内已经编译的TCP拥塞控制算法:使用命令行sysctl net.ipv4.tcp_available_congestion_control,可以看到已经直接编译到内核的拥塞控制算法Cubic及Reno
修改当前的拥塞控制算法
使用命令ls /lib/modules/3.5.0-37-generic/kernel/net/ipv4/ 查看Linux支持的拥塞控制算法:
从SEED-Client虚拟机发包测试
下面以SEED-Client和SEED-Server都设置拥塞算法为cubic
先在SEED-Server端运行iperf -c命令,让iperf的服务器端运行守护在5001端口:
在SEED-Client端运行下表的命令,让iperf的客户端运行,同时利用Linux内核的tcp probe模块监控特定连接中参数变化:
命令 | 作用 |
---|---|
modprobe tcp_probe port=5001 | 对端口为5001(源或目的)的tcp连接进行监控 |
cat /proc/net/tcpprobe > data.txt & | tcpprobe捕捉的信息是持续性的,可以放到后台读 |
pid=$! | 保存上一个读命令的pid,用于结束读tcpprobe接口 |
iperf -c otherhost –t time | 使用iperf建立一个tcp流 |
kill $pid | 杀死进程 |
修改不同的拥塞控制算法,重复执行上述命令,得到XXX.txt文件保存了TCP的拥塞窗口的变化情况,作为实验数据,方便后续的分析。
下面依次得到cubic、reno和westwood算法在正常情况、不同延迟时间、不同丢包率情况下的测试结果。
1.CUBIC算法
设置cubic算法的loss为2.5%
设置cubic算法的loss为0.5%
设置cubic算法的延迟为30ms加减10ms
设置延迟为100ms加减30ms
设置延迟为10ms加减3ms
2.Reno算法
正常情况:
设置reno算法的loss为2.5%
设置reno算法的loss为0.5%
设置reno算法的延迟为30ms加减10ms
设置reno延迟为100ms加减30ms
设置reno延迟为10ms加减3ms
3.Westwood算法
Client:
Server:
正常情况:
设置westwood算法的loss为2.5%
设置westwood算法的loss为0.5%
设置westwood算法的延迟为30ms加减10ms
设置westwood延迟为100ms加减30ms
设置westwood延迟为10ms加减3ms
Server:
在实验过程中遇到加了delay情况下,生成的.txt文件没有数据,注意此时需要先用modprobe -r命令将tcp_probe模块移除,再重新加载,加载使用额外的参数full=1。
tcpprobe模块的卸载与加载,modprobe –r tcp_probe
# modprobe tcp_probe full=1 port=5001 // full选项表示每次收到数据包都捕捉信息
==模拟丢包==
在 SEED_Route 这台虚拟机连接 SEED_Server 网卡上增加丢包和延迟来改变网络环境。在 SEED_Route 终端中键入命令:
tc qdisc add dev eth2 root netem loss 2.5%
模拟丢包
将add改为del删除相关配置。
增加延迟:
cwnd拥塞窗口
重复上述步骤,获得新的数据,命名为data_cubic_delay.txt
改变拥塞控制算法:
Client:
Server:
设置丢包和延迟
运行新的拥塞控制算法:linux支持的拥塞控制算法westwood.ko
首先加载这些内核模块:
然后在每种拥塞控制算法下重复第获取数据命令,得到三种算法下正常、丢包、延迟共9种情况下的数据进行分析。
查看已经配置的网络条件:#tc qdisc show dev eth2
将实验数据文件通过虚拟机共享目录导出
1、挂载这个目录到linux本地目录
首先在虚拟机中创建共享文件夹
改为可读可写
运行命令加载
sudo mount -t vboxsf -o uid=1000,gid=1000 share /home/share
share为VirtualBox共享目录的名字
/home/share为刚刚创建的目标目录。
这样就把数据从虚拟机复制到物理机上来了。便于后续的数据分析。
四.实验结果和分析
当对资源的需求超过了资源的可用部分,网络中许多资源同时供应不足,网络的性能就要明显变坏,整个网络的吞吐量随之负荷的增大而下降,这便是拥塞。TCP作为一个成熟可靠的通信协议,拥有许多具有较优性能的拥塞控制协议,可做到从全局角度,了解网络能够承受的现有网络负载,防止过多的数据注入网络中,保证网络中的路由器或链路不会过载。
本次实验主要以Linux内核中TCP拥塞控制算法模块Cubic、Reno、Westwood为例通过测试比较采用不同TCP拥塞控制算法在不同网络状态下的网络的吞吐量等性能,并深入分析Cubic、Reno、Westwood三种TCP拥塞控制算法的基本原理,进一步分析现有TCP拥塞控制算法的优缺点和较佳适用的网络环境。
实验中测试了Linux内核中的TCP拥塞控制算法中基于丢包反馈协议的Cubic、Reno和基于路径延迟反馈协议的Westwood算法,其中Cubic是针对Reno等传统TCP拥塞控制算法进行改进以适应现今高带宽、传输延时大的网络链路,提高TCP带宽利用率。
TCP作为面向连接全双工可靠服务协议,实现拥塞控制算法主要包括四个阶段有:慢开始、拥塞避免、快速重传以及快速恢复。
(1)慢开始:在新加入网络时,主机发送数据不是立即将大量数据字节注入网络,而是由小到大逐渐增大发送窗口。通常在刚刚开始发送报文段时,先把拥塞窗口 cwnd 设置为一个最大报文段MSS的数值,在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值,这样,每经过一个传输轮次RTT,拥塞窗口 cwnd 就加倍,即拥塞控制窗口呈指数增长。为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。 当 cwnd < ssthresh 时,使用上述的慢开始算法。 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。
(2)拥塞避免:当发送窗口达到慢开始阈值ssthresh时,为避免拥塞窗口增长过快导致网络拥塞,现采用拥塞控制算法,使发送窗口线性缓慢增加,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1。
图4.1 采用慢开始及拥塞避免策略
无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认ACK),就要把慢开始门限ssthresh设置为出现拥塞时的发送方窗口值的一半(但不能小于2),然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。
慢开始和拥塞控制算法常常作为一个整体使用,而快速重传和快速恢复则是为了减少因为拥塞导致的数据包丢失带来的重传时间,从而避免传递没有用的数据包到网络。
(3)快速重传:快重传机制要求接收方每收到一个失序的TCP报文段后就立即发出重复确认(为了使发送方及早知道没有到达对方)而不要等待自己发送数据时才进行确认,发送方只要连续收到3个重复确认就应当立即重传未被确认的报文段。
(4)快速恢复:当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半。但是接下去并不执行慢开始算法,而是认定网络现在可能没有出现拥塞,不执行慢开始算法,而是执行拥塞避免算法。
根据得到的数据进行绘图:
采用Cubic算法实验结果图:
正常情况下:
丢包率为2.5%的情况:
丢包率为0.5%:
设置延迟为30ms±10ms:
设置延迟为100ms±30ms:
设置延迟为10ms±3ms:
采用Reno算法实验结果图:
正常情况下:
丢包率为2.5%的情况:
丢包率为0.5%:
设置延迟为30ms±10ms:
设置延迟为100ms±30ms:
设置延迟为10ms±3ms:
采用Westwood算法实验结果图:
正常情况下:
丢包率为2.5%的情况:
丢包率为0.5%:
设置延迟为30ms±10ms:
设置延迟为100ms±30ms:
设置延迟为10ms±3ms:
对上述绘制的图像作如下分析:
通过对比正常情况下的Cubic和Reno图,可以发现cubic在稳定状态下的拥塞窗口cwnd的总体增长趋势更平缓。在发送端检测到链路中出现丢包时,cubic和reno都会立刻减小cwnd以缓解拥塞现象,之后cwnd开始进入恢复阶段。通过对比可以明显观察到cubic相比于reno,拥塞窗口增长的更为平缓,而reno的拥塞窗口呈现指数趋势增长。在丢包率为0.5%时,reno算法的吞吐量和cubic算法相比有着一定的优势,而当丢包率为2.5%时,cubic比reno此时有更高的带宽利用率。
通过对比正常情况下的reno和westwood图,可以看出慢启动阶段westwood的拥塞窗口增加的较为迅速,而在拥塞避免阶段其增长趋势有所放缓。在高丢包率链路中由于频繁的丢包reno需要降低自己的发送端cwnd,不断将当前的cwnd置为一般,而且对比发现高延时环境下reno的拥塞窗口增长比低延时来的慢一些。
对上述三种拥塞控制算法进行性能分析,主要关注性能指标是发送端的cwnd,ssthresh以及整个连接过程中的吞吐量。下表是不同丢包率和延时时间下的吞吐率:
拥塞控制算法 | 正常情况 (Mbit/s) | loss 为0.5% | loss 为2.5% | delay为 30ms±10ms | delay为 100ms±30ms | delay为 10ms±3ms |
---|---|---|---|---|---|---|
cubic | 31.7 | 20.9 | 14.6 | 15.5 | 12.3 | 23 |
reno | 41 | 21.5 | 13.9 | 17.1 | 7.99 | 21.4 |
westwood | 39.1 | 22.3 | 16.8 | 16.9 | 3.98 | 21.6 |
绘制如图所示柱状图:
分析上图可知,当网络存在随机丢包时,采用Westwood基于时延反馈的拥塞控制机制效果最佳,采用适用于高带宽的基于丢包反馈的Cubic拥塞控制机制和采用Reno拥塞控制算法的效果较差,这是由于存在丢包后,Cubic算法和Reno算法受丢包事件驱动,采用拥塞控制,使得发送窗口乘性回退,最终反映为网络的吞吐量的下降,而Westwood则是通过测量估计可用带宽动态调整慢开始阈值,可实现更快的快速恢复。
分析上图:当网络存在7-13ms的随机延迟时,cubic算法表现出最佳的吞吐率。Cubic算法的有点在于只要没有出现丢包,就不会主动降低自己的发送速度,可以最大程度的利用网络剩余带宽,提高吞吐量。可以在在高带宽、低丢包率的网络中可以发挥较好的性能。而Westwood由于检测到了连接超时,会认为网络拥塞,发送窗口乘性减少回退,大大降低了网络利用率,但由于其可实现更快的快恢复阶段,因此性能相比于Reno要好一点。
综合上述分析,对cubic、reno、westwood三种拥塞控制算法有了较深的了解。其中Cubic、Reno算法是基于丢包反馈协议的(将丢包视为出现拥塞,采取缓慢探测的方式,逐渐增大拥塞窗口,当出现丢包时,将拥塞窗口减小),Westwood算法是基于延迟反馈协议的(将时延增加视为出现拥塞,延时增加时增大拥塞窗口,延时减小时减小拥塞窗口)。
Cubic算法适用于高带宽,低丢包率的网络,能够有效利用带宽。
Reno算法适用于低延时,低带宽的网络。
Westwood算法是在tcp-reno算法的基础上针对高带宽大延时提出的,尤其在无线网络中相较reno有更快的恢复速度,对可用带宽的利用率很高。通过测量估算出网络的可用带宽,对拥塞窗口cwnd进行适当调整,实现更快速的恢复。与Reno相比吞吐量成倍提高。