配置环境
- 操作系统:
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%
时,拥塞窗口和慢启动阈值出现较大的波动,锯齿变得更加密集,且拥塞窗口和慢启动阈值均在一个较低值波动(由算法本身的机制所导致的),网络带宽空闲较大,网络利用率不高。另一方面,设置网卡延迟均会导致拥塞窗口及慢启动阈值波动减缓,拥塞控制的时效性变差,拥塞窗口及慢启动阈值的增减速率出现较大差异,甚至出现拥塞窗口和慢启动阈值变得极大的现象,算法的拥塞控制效果减弱。