配置环境
- 操作系统:
Windows10 - 虚拟机操作系统:
SEEDUbuntu 16.04内存大小:1G;显存大小:16MB;硬盘大小:80GB - 虚拟机工具:
VirtualBox 5.2.22 - 网络平台:
GNS3 2.1.0 - 机器配置(共两个虚拟机,如下):
机器名:SEED_Client;内存大小;1024M;处理器数量:1个;显存大小:16M机器名:SEED_Server;内存大小:1024M;处理器数量:1个;显存大小:16M机器名:SEED_Route;内存大小:1024M;处理器数量:1个;显存大小:16M - 本机计算机配置:
内存:8G;CPU:Intel Core i5-5200U 2.20GHz
实验目的
选择 TCP 的三种支持的三种拥塞控制算法 cubic、reno、westwood,通过改变 Seed-Router 的延迟和丢包,来测试三种 TCP 拥塞控制算法在不同情况下(延迟、丢包)的性能。
实验步骤
环境搭建
在 VirtualBox 上创建三台虚拟机,分别命名为 SEEDClient,SEEDServer,SEEDRoute 配置三台虚拟机的网络和路由器;
SEED_Client
键入命令 vim /etc/network/interfaces,修改静态 IP 地址,如下图:

修改完成后键入命令 sudo /etc/init.d/networking restart,重启网络。
输入命令 ifconfig eth0,查看 IP 信息为:

输入命令 route -n,查看路由表信息为:

SEED_Server
键入命令 vim /etc/network/interfaces,修改静态 IP 地址,如下图:

修改完成后键入命令 sudo /etc/init.d/networking restart,重启网络。
输入命令 ifconfig eth0,查看 IP 信息为:

输入命令 route -n,查看路由表信息为:

SEED_Route
键入命令 vim /etc/network/interfaces,修改静态 IP 地址,如下图:

修改完成后键入命令 sudo /etc/init.d/networking restart,重启网络。
输入命令 ifconfig eth0,查看 IP 信息为:

同时修改 /etc/sysctl.conf 配置文件,使其永久开启 IP 转发功能。取消 net.ipv4.ip_forward =1 这一行的注释,保存退出,输入命令 sudo sysctl -p /etc/sysctl.conf,使修改生效。
配置完成后,在 SEED_Client 上 ping SEED_Server 成功,如下图:

安装 iperf
在 SEED_Client 和 SEED_Server 的终端运行命令 sudo apt-get install iperf ,下载 iperf 程序,安装完成如下图(这一步需要保证虚拟机能联网):

iperf命令说明
- 列出所有拥塞控制算法:
sysctl net.ipv4.tcp_available_congestion_control - 新增加新的拥塞控制算法:
echo "westwood" > /proc/sys/net/ipv4/tcp_congestion_control - 修改当前拥塞控制算法:
sysctl -w net.ipv4.tcp_congestion_control=cubic - 查看当前拥塞控制算法:
cat /proc/sys/net/ipv4/tcp_congestion_control或sysctl net.ipv4.tcp_congestion_control
在 SEED_Client 和 SEED_Server 上列出所有直接编译到内核的拥塞控制算法,执行如下命令
1 | $ sysctl net.ipv4.tcp_available_congestion_control |

查看 Linux 支持的拥塞控制算法,执行如下命令:
1 | $ ls /lib/modules/3.5.0-37-generic/kernel/net/ipv4/ |

新增拥塞控制算法并查看,执行如下命令:
1 | $ echo "westwood" > /proc/sys/net/ipv4/tcp_congestion_control |

再次查看当前可用的算法,重复上述命令

获取数据
将 SEED_Client 和 SEED_Server 的拥塞控制算法设置为 cubic 。

在 SEED_Client 虚拟机上进行发包测试,先在 SEED_Server 终端运行下面的命令 iperf -s ,让 iperf 的服务器端运行守护在 5001 端口,如下图:

在 SEED_Client 端切换到 root,运行下面的命令,让 iperf 的客户端运行,同时利用 Linux 内核的 tcp probe 模块监控特定连接中参数变化:
1 | $ modprobe tcp_probe port=5001 //对端口为5001的tcp连接进行监控 |
运行完成如下图:

运行上述命令之后,所有数据存入 data_cubic.txt 中。

运行命令 kill -9 3094 杀掉后台由命令 cat /proc/net/tcpprobe > data.txt & 产生的相应程序

模拟丢包与增加延迟
命令说明:
tc qdisc change dev eth1 root netem loss 2.5%// 设置丢包tc qdisc add dev eth1 root netem delay 30ms 10ms// 设置延迟tc qdisc add dev eth1 root netem duplicate 1%// 将eth1网卡的传输设置为随机产生 1% 的重复数据包tc qdisc add dev eth1 root netem corrupt 0.2%// 将eth1网卡的传输设置为随机产生 0.2%
删除网卡上面的相关配置,将之前命令中的 add 改为 del 即可删除配置
模拟丢包
在 SEED_Route 这台虚拟机连接 SEED_Server 网卡上增加丢包和延迟来改变网络环境。在 SEED_Route 终端中键入命令:
1 | $ tc qdisc add dev eth1 root netem loss 2.5% |

该命令使得 eth1 丢包率为 2.5%。模拟丢包后,重复上述获得数据的步骤,将获得丢包数据,并命名为 data_cubic_loss.txt 。

设置延迟
在 SEED_Route 终端中键入命令:
1 | $ tc qdisc del dev eth1 root netem loss 2.5% |
第一行命令,删除丢包率到 2.5% 设置;第二行命令是增加延时,如下图:

同理,重复上述步骤,获得新的数据,命名为 data_cubic_delay.txt 。

改变拥塞控制算法
依次设置当前算法为:cubic 、reno 、westwood,如下命令:
1 | $ sysctl -w net.ipv4.tcp_congestion_control=cubic |
然后在每种拥塞控制算法下重复第获取数据命令,得到三种算法下正常、丢包、延迟共9种情况下的数据进行分析
实验结果分析
数据导出
在虚拟机中设置共享文件夹,点击 控制 -> 设置 -> 共享文件夹 -> 添加共享文件夹 设置本地的共享路径。

在 SEED_Client 终端中输入命令 mkdir mini_share 创建文 ubuntu 中的共享文件夹 mini_share,然后输入命令 mount -t vboxsf share mini_share,手动挂载映射关系。执行完成即可共享文件夹,将之前生成的数据文件放入 mini_share 文件夹,如下图:

查看本地文件夹,如下图:

说明共享文件夹成功,如果不成功,可以重启下虚拟机试一下。
分析数据
数据格式
每行的各列分别为:
timestamp//时间戳saddr:port// 源IP及端口,我的数据是在发送端捕捉的,所以port是固定的8089daddr:port// 目的IP及端口skb->len// 收到的数据包skb大小,收到的都是ACK包,所以len都比较小snd_nxt// 下一个待发送数据的序列号snd_una// 待确认数据的序列号snd_cwnd// 拥塞窗口大小ssthresh// 慢启动阈值snd_wnd// 接收窗口大小srtt// smoothed RTT
cubic 算法下的拥塞控制实验数据:

cubic 算法不做任何处理的数如图所示,snd_cwnd 表示用赛窗口大小,ssthresh 表示慢启动阈值。

cubic 算法丢包数据如图所示,snd_cwnd 表示用赛窗口大小,ssthresh 表示慢启动阈值。

cubic 算法延时数据如图所示,snd_cwnd 表示用赛窗口大小,ssthresh 表示慢启动阈值。
reno 算法下的拥塞控制实验数据:

reno 算法不做任何处理的数如图所示,snd_cwnd 表示用赛窗口大小,ssthresh 表示慢启动阈值。

reno 算法丢包数据如图所示,snd_cwnd 表示用赛窗口大小,ssthresh 表示慢启动阈值。

reno 算法延时数据如图所示,snd_cwnd 表示用赛窗口大小,ssthresh 表示慢启动阈值。
westwood 算法下的拥塞控制实验数据:

westwood 算法不做任何处理的数如图所示,snd_cwnd 表示用赛窗口大小,ssthresh 表示慢启动阈值。

westwood 算法丢包数据如图所示,snd_cwnd 表示用赛窗口大小,ssthresh 表示慢启动阈值。

westwood 算法延时数据如图所示,snd_cwnd 表示用赛窗口大小,ssthresh 表示慢启动阈值。
总结
从所得的实验数据来看,设置 SEED_Route 连接 SEED_Server 端网卡的丢包率为 2.5% 时,拥塞窗口和慢启动阈值出现较大的波动,锯齿变得更加密集,且拥塞窗口和慢启动阈值均在一个较低值波动(由算法本身的机制所导致的),网络带宽空闲较大,网络利用率不高。另一方面,设置网卡延迟均会导致拥塞窗口及慢启动阈值波动减缓,拥塞控制的时效性变差,拥塞窗口及慢启动阈值的增减速率出现较大差异,甚至出现拥塞窗口和慢启动阈值变得极大的现象,算法的拥塞控制效果减弱。