TCP Congestion 性能测试分析

配置环境

  • 操作系统: 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 的三种支持的三种拥塞控制算法 cubicrenowestwood,通过改变 Seed-Router 的延迟和丢包,来测试三种 TCP 拥塞控制算法在不同情况下(延迟、丢包)的性能。

实验步骤

环境搭建

在 VirtualBox 上创建三台虚拟机,分别命名为 SEEDClientSEEDServerSEEDRoute 配置三台虚拟机的网络和路由器;

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

01_Client

修改完成后键入命令 sudo /etc/init.d/networking restart,重启网络。

输入命令 ifconfig eth0,查看 IP 信息为:

02_eth0

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

03_route

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

04_Server

修改完成后键入命令 sudo /etc/init.d/networking restart,重启网络。

输入命令 ifconfig eth0,查看 IP 信息为:

05_eth0

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

06_route

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

07_Server

修改完成后键入命令 sudo /etc/init.d/networking restart,重启网络。

输入命令 ifconfig eth0,查看 IP 信息为:

08_eth0_eth1

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

配置完成后,在 SEED_Clientping SEED_Server 成功,如下图:

09_ping

安装 iperf

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

10_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_controlsysctl net.ipv4.tcp_congestion_control

SEED_ClientSEED_Server 上列出所有直接编译到内核的拥塞控制算法,执行如下命令

1
$ sysctl net.ipv4.tcp_available_congestion_control

11_available_control

查看 Linux 支持的拥塞控制算法,执行如下命令:

1
$ ls /lib/modules/3.5.0-37-generic/kernel/net/ipv4/

ls

新增拥塞控制算法并查看,执行如下命令:

1
2
$ echo "westwood" > /proc/sys/net/ipv4/tcp_congestion_control
$ cat /proc/sys/net/ipv4/tcp_congestion_control

13_westwood

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

14_available_control

获取数据

SEED_ClientSEED_Server 的拥塞控制算法设置为 cubic

15_cubic

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

16_iperf_s

SEED_Client 端切换到 root,运行下面的命令,让 iperf 的客户端运行,同时利用 Linux 内核的 tcp probe 模块监控特定连接中参数变化:

1
2
3
$ modprobe tcp_probe port=5001 //对端口为5001的tcp连接进行监控
$ cat /proc/net/tcpprobe > data_cubic.txt & // tcpprobe捕捉的信息是持续性的,可以放到后台读   
$ iperf -c 192.168.2.1 // 使用iperf建立一个TCP流

运行完成如下图:

17_iperf_c

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

18_data_cubic

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

19_kill_3094

模拟丢包与增加延迟

命令说明:

  • 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%

20_route_loss

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

21_data_cubic_loss

设置延迟

SEED_Route 终端中键入命令:

1
2
$ tc qdisc del dev eth1 root netem loss 2.5%
$ tc qdisc add dev eth1 root netem delay 30ms 10ms

第一行命令,删除丢包率到 2.5% 设置;第二行命令是增加延时,如下图:

22_route_delay

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

23_data_cubic_delay

改变拥塞控制算法

依次设置当前算法为:cubicrenowestwood,如下命令:

1
2
3
$ sysctl -w net.ipv4.tcp_congestion_control=cubic
$ sysctl -w net.ipv4.tcp_congestion_control=reno
$ sysctl -w net.ipv4.tcp_congestion_control=westwood

然后在每种拥塞控制算法下重复第获取数据命令,得到三种算法下正常、丢包、延迟共9种情况下的数据进行分析

实验结果分析

数据导出

在虚拟机中设置共享文件夹,点击 控制 -> 设置 -> 共享文件夹 -> 添加共享文件夹 设置本地的共享路径。

24_share

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

25_ubuntu_share

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

26_windows_share

说明共享文件夹成功,如果不成功,可以重启下虚拟机试一下。

分析数据

数据格式

每行的各列分别为:

  1. timestamp //时间戳
  2. saddr:port // 源IP及端口,我的数据是在发送端捕捉的,所以port是固定的8089
  3. daddr:port // 目的IP及端口
  4. skb->len // 收到的数据包skb大小,收到的都是ACK包,所以len都比较小
  5. snd_nxt // 下一个待发送数据的序列号
  6. snd_una // 待确认数据的序列号
  7. snd_cwnd // 拥塞窗口大小
  8. ssthresh // 慢启动阈值
  9. snd_wnd // 接收窗口大小
  10. srtt // smoothed RTT

cubic 算法下的拥塞控制实验数据:

27_cubic

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

28_cubic_loss

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

29_cubic_delay

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

reno 算法下的拥塞控制实验数据:

30_reno

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

31_reno_loss

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

32_reno_delay

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

westwood 算法下的拥塞控制实验数据:

33_westwood

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

34_westwood_loss

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

35_westwood_delay

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

总结

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

坚持原创技术分享,您的支持将鼓励我继续创作!