---- 0-TH SEC: ----
<--------------------------| | | |<-------------------CUBIC
| | 500ms | |
CUBIC--------------------->| | ^^^^^5ms | |------------------------>
| | 10ms| | | |
| |---120Mbps,20ms--| |
| | | |
| | 15-TH SEC: | |
VEGAS---120Mbps,2000pkts-->| | | |--120Mbps,5ms,3000pkts-->
| | | |
VEGAS---120Mbps,2000pkts-->| | | |--120Mbps,5ms,3000pkts-->
---- 30 SECS ----
CoCo-Beholder 是一个人性化的虚拟网络模拟器,提供任何尺寸的流行哑铃拓扑。拓扑的每个链路可以具有单独的速率、延迟和队列大小。中央链路还可以具有带有可选抖动的可变延迟。不同方案的流可以在拓扑中一起运行指定的秒数运行时间。对于每个流,可以选择其方向和运行时的起始秒数。
每个流在拓扑的左半部分和右半部分都有一个主机,并且主机交换方案的流量,其中一台主机作为发送方,另一台作为接收方。左路由器将拓扑左半部分的所有主机互连,右路由器将拓扑右半部分的所有主机互连。所有流共享两个路由器之间的公共中央链路。
测试
分析
绘图和统计数据生成
安装
对方案进行故障排除
添加新方案
Python支持
第三方库
作者身份
接触
此命令指定包含要测试的方案的集合的路径,并运行测试 30 秒,中央链路具有 120 Mbps 速率和可变延迟(基本延迟 20 毫秒,增量 500 毫秒,步长 10 毫秒,抖动 5)多发性硬化症):
./run.py -p ~ /pantheon 20ms 0.5s 10ms 5ms -t 30 -r 120 -s 12345
如果这是第一次运行该脚本,则会生成并使用默认布局文件layout.yml
(如下所示)。由此产生的测试设置显示在本页顶部的哑铃拓扑图中。可以编辑布局文件以获得更复杂的测试设置,其中更多的流程属于各种方案并具有不同的网络设置。
# Delays/rates are optional: if lacking or null, they are set to 0us/0.0
# and for netem, to set delay/rate to zero is same as to leave it unset.
# Sizes of queues are optional: if lacking or null, they are set to 1000.
- direction : <-
flows : 1
left-delay : null
left-queues : null
left-rate : null
right-delay : null
right-queues : null
right-rate : null
scheme : cubic
start : 0
- direction : ->
flows : 2
left-delay : 0us
left-queues : 2000
left-rate : 120.0
right-delay : 5ms
right-queues : 3000
right-rate : 120
scheme : vegas
start : 15
- direction : ->
flows : 1
scheme : cubic
start : 0
速率、延迟和队列大小始终使用tc
qdisc NetEm 链路模拟器安装在拓扑中每个链路末端的两个接口上。特别是,这意味着链路的 RTT 是(单向)延迟的两倍。只有中央链路的两端可能有两个不同的接口队列大小 - 请参阅脚本帮助消息中的-q1
、 -q2
、 -q
参数。默认情况下,两个队列均为 1000 个数据包。
中央链路的可变延迟由四个位置参数定义:基本延迟、增量、步长和抖动,其中可以跳过抖动。每个增量时间,延迟都会根据伪随机生成器逐步增加或减少,其种子可以使用-s
参数指定或分配当前的 UNIX 时间。要在中央链路上获得恒定的延迟,请选择 delta >= 运行时间-t
。
将包含测试所有参数(包括生成器种子)的metadata.json
文件写入选定的输出目录中。该文件将来可能会被提供给 CoCo-Beholder 以完全重现测试。此外,在测试过程中,使用tcpdump
将哑铃拓扑的所有主机上的 PCAP 转储文件记录到输出目录中。因此,对于图中的示例,记录了八个 PCAP 转储文件。
注意#1:每个链路的最大延迟 - 侧面和中央(不计算抖动) - 可以使用-m
选项指定。要在中央链路处具有方波延迟,请将最大延迟设置为基本延迟和步长之和。
注意#2:测试脚本在启动方案的任何流程之前,在布局文件中每个方案的 Pantheon 包装器上调用setup_after_reboot
,因此用户不必在每次重新启动后手动设置方案。
分析脚本仅接受两个参数:输入文件夹和输出文件夹 - 默认情况下dumps
和graphs/data
。
首先,该脚本只是将元数据文件从输入文件夹复制到输出文件夹中。然后,该脚本处理每个流的一对 PCAP 转储<flow's starting #>-<scheme>-<sender/receiver>.pcap
,并将流数据包的信息提取到流的单独 json 数据日志文件中。例如,对于两个~12 GB 转储,会生成一个~300 MB 数据日志文件。
图中示例的分析脚本的部分输出:
./analyze.py
cubic scheme, flow 1:
sender dump: 100.0% in 5.18s
Total: 222667 pkts/224631734 bytes, from sender: 144906 pkts/219351284 bytes
receiver dump: 100.0% in 5.37s
Total: 222245 pkts/223376026 bytes, from sender: 144052 pkts/218058328 bytes
♥ Union of data from sender recorded on both sides: 144906 pkts/219351284 bytes
♦ Subset of ♥ which was not recorded at sender : 0 pkts/0 bytes
♣ Subset of ♥ which was not recorded at receiver : 854 pkts/1292956 bytes
♠ Loss (ratio of ♣ bytes to ♥ bytes) : 0.589%
Saving the data of the flow to the file...
==========================================
# and so on for the three more flows...
对于即将生成的绘图和统计数据,不再需要 PCAP 转储。 PCAP 转储的分析仅执行一次,然后绘图脚本可以根据需要在数据日志文件上运行多次,以快速生成各种绘图。
绘图脚本plot.py
读取流的数据日志文件,并在输出文件夹中生成绘图和统计数据(默认情况下为graphs
)。可以生成不同类型的绘图和统计数据:
-f, --per-flow Graphs and stats are generated per flow, i.e. each
graph has a separate curve per flow
-t, --total Total graphs and stats are generated for all flows
altogether, i.e. each graph has only one curve
-s "FIELD1 FIELD2...", --per-subset "FIELD1 FIELD2..."
Graphs and stats are generated per subset, i.e. each
graph has one curve per subset. Flows are in one
subset if they have the same values of the chosen
layout field(s). E.g. for -s "scheme direction", each
graph will have one curve per subset of flows having
both the same scheme name and direction. Currently
allowed layout fields: ['scheme', 'direction'].
对于选定的类型,会生成三个线图和一个散点图:
例如,在上面,人们可以看到图中设置的每流每数据包单向延迟图。
平均图按聚合时间间隔进行平均:由-i
参数提供的任何正浮点数或默认情况下为 0.5 秒。
平均 Jain 指数图始终包含一条根据相应平均吞吐量图中存在的曲线计算得出的曲线。
参数-c
和-j
允许灵活更改图中曲线的颜色。
对于选定的类型,会生成统计文件。它不依赖于所选的聚合间隔并包含:
一条曲线的总体平均单向延迟和总体平均每数据包单向延迟是以不同方式计算的相同值。
安装过程如下:
安装拥塞控制方案的 Pantheon 集合,如果需要,在本地将更多方案添加到集合中
使用其安装脚本安装 CoCo-Beholder 模拟器
完毕。使用 CoCo-Beholder 测试集合中的方案。
安装 CoCo-Beholder 本身很简单,它的安装脚本install.sh
非常简单且简短。然而,安装 Pantheon 方案集合经常会引起很多问题。此外,一些 Linux 发行版也存在 bug。因此,请参阅 Ubuntu 16.04、Ubuntu 18.04 和 Debian 10 上的详细安装说明。
以下说明已在全新安装 Ubuntu 16.04.6-desktop-amd64(2019 年 11 月)的 VM 上进行了测试。
一般注意事项:如果您需要 bbr (TCP BBRv1.0) 方案,请确保使用 Linux 内核 >=4.9。
新版本的 16.04 LTS(16.04.5 及更高版本)附带 Linux 内核 4.15。 CoCo-Beholder 使用tc qdisc NetEm 延迟抖动,该抖动在 Ubuntu 内核 4.15 上被破坏。解决办法:
sudo apt-get install linux-image-4.13.0-39-generic linux-headers-4.13.0-39
linux-headers-4.13.0-39-generic linux-image-extra-4.13.0-39-generic
在文件/etc/default/grub
中,注释掉行GRUB_HIDDEN_TIMEOUT=0
并运行命令sudo update-grub
。这将允许您在重新启动后看到 Grub 菜单。
重新启动并在 Grub 菜单中选择Advanced options for Ubuntu
,然后选择Ubuntu, with Linux 4.13.0-39-generic
。使用命令uname -ar
检查正在运行的内核。
下载 Pantheon git 存储库和所包含方案的 git 子模块:
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
脚本)。您只需使用以下命令安装方案。如果最后一个命令给出类似Command "python setup.py egg_info" failed with error code 1...
错误,则执行sudo pip install --upgrade pip
并重复失败的命令。 sudo apt-get install autoconf # for verus
sudo apt-get install nodejs-legacy # for webrtc
sudo apt-get install python-pip && sudo pip install pyyaml # for setup.py
src/experiments/setup.py --install-deps (--all | --schemes " <cc1> <cc2> ... " )
src/experiments/setup.py --setup (--all | --schemes " <cc1> <cc2> ... " )
cd coco-beholder && sudo ./install.sh
现在您已准备好测试这些方案。
以下说明已在全新安装 Ubuntu 18.04.3-desktop-amd64(2019 年 11 月)的 VM 上进行了测试。
一般注意事项:如果您需要 bbr (TCP BBRv1.0) 方案,请确保使用 Linux 内核 >=4.9。
Ubuntu 内核 4.15 存在该错误。对于 Ubuntu >=18.04.3,您将获得内核 >=5.0,因此请继续下一步。
下载 Pantheon git 存储库和所包含方案的 git 子模块:
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
脚本)。您只需使用以下命令安装方案。 sudo apt-get install autoconf # for verus
sudo apt-get install python-pip && sudo pip install pyyaml # for setup.py
src/experiments/setup.py --install-deps (--all | --schemes " <cc1> <cc2> ... " )
src/experiments/setup.py --setup (--all | --schemes " <cc1> <cc2> ... " )
cd coco-beholder && sudo ./install.sh
现在您已准备好测试这些方案。
以下说明已在全新安装 Debian 10.1.0-amd64-netinst(2019 年 11 月)的虚拟机上进行了测试。
一般注意事项:如果您需要 bbr (TCP BBRv1.0) 方案,请确保使用 Linux 内核 >=4.9。
Ubuntu 内核 4.15 存在该错误。目前尚不清楚 Debian 内核 4.15 是否存在此问题。无论如何,对于 Debian >=10.1.0,您将获得内核 >=4.19,所以请继续下一步。
下载 Pantheon git 存储库和所包含方案的 git 子模块:
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
脚本)。您只需要安装方案。首先,安装方案的依赖项: sed -i ' s/chromium-browser/chromium/g ' src/wrappers/webrtc.py # for webrtc
sudo apt-get install python-pip && sudo pip install pyyaml # for setup.py
src/experiments/setup.py --install-deps (--all | --schemes " <cc1> <cc2> ... " )
将字符串export PATH=/usr/sbin:$PATH
添加到~/.bashrc
文件并运行命令source ~/.bashrc
。这将启用/usr/sbin/sysctl
实用程序,该实用程序不仅在安装期间而且在以后都是必需的。
要构建 Verus,您需要降级 alglib 库。因此,请将deb <URL> stretch main
添加到您的/etc/apt/sources.list
并运行:
sudo apt-get update
sudo apt-get remove libalglib-dev # remove 3.14 version
sudo apt-get install -t stretch libalglib-dev # install 3.10 version
sudo apt-get install autoconf # for verus
myregex= ' s/milliseconds((.+))/milliseconds(int(1))/g '
sed -i $myregex third_party/verus/src/verus_client.cpp
sed -i $myregex third_party/verus/src/verus_server.cpp
sudo apt-get install pkg-config # for sprout
sudo apt-get install libtinfo5 # for quic
# During the setup, do not be afraid of CERTIFICATE_VERIFY_FAILED errors by quic
src/experiments/setup.py --setup (--all | --schemes " <cc1> <cc2> ... " )
cd coco-beholder && sudo ./install.sh
# matplotlib will give Python backports.functools_lru_cache error. To solve:
sudo pip install arrow==0.12.0
现在您已准备好测试这些方案。
cd pantheon
src/wrappers/vegas.py setup_after_reboot # setup the scheme once after reboot
src/wrappers/vegas.py run_first # who is server: sender or receiver
# receiver
src/wrappers/vegas.py receiver 54321 # start server in one shell
src/wrappers/vegas.py sender 127.0.0.1 54321 # start client in another shell
sudo pkill -9 -f vegas # kill all the started processes
cd coco-beholder
myregex= ' s/((.+)).pid/(1, stdout=None, stderr=None).pid/g '
sed -i " $myregex " variable_delay/src/test/test.py
如果您想测试 Pantheon 集合中不存在的方案,您可以在本地添加它,如下所示:
find /lib/modules/ ` (uname -r) ` /kernel -type f -name * cdg *
# /lib/modules/4.19.0-6-amd64/kernel/net/ipv4/tcp_cdg.ko
cdg
条目添加到pantheon/src/config.yml
文件中,该文件保留集合中所有方案的列表。颜色、名称和标记可以是任意的,因为 CoCo-Beholder 不会读取它们。 cdg :
name : TCP CDG
color : red
marker : ' x '
cp pantheon/src/wrappers/vegas.py pantheon/src/wrappers/cdg.py
sed -i 's/vegas/cdg/g' pantheon/src/wrappers/cdg.py
现在,您可以像往常一样通过在布局文件中指定 cdg 流来使用 CoCo-Beholder 测试 cdg。
CoCo-Beholder 确保与 Python 2.7、3.5、3.6 和 3.7 配合使用。 CoCo-Beholder 的安装脚本install.sh
默认安装 Python 2 库依赖项。对于Python 3,请注释掉安装脚本中的相应行。
CoCo-Beholder 利用 Mininet 库:它的 API 能够在单独的网络命名空间中创建虚拟主机作为 UNIX shell,在一对虚拟主机之间创建 veth 对链接,并在虚拟主机上启动进程。 CoCo-Beholder 不使用 Mininet 的控制器、交换机、拓扑、TCLink 或其他更高级别的实体。为了防止将来出现任何兼容性问题并使 CoCo-Beholder 的安装更容易,根据 Mininet 许可证,Mininet 2.3.0d5 所需的部分作为第三方库包含在 CoCo-Beholder 存储库中。
Evgeniya Khasina于 2019 年在萨尔大学硕士论文“CoCo-Beholder:实现拥塞控制算法的综合评估”范围内实施了该项目,导师是马克斯·普朗克互联网架构系Anja Feldmann 教授和Corinna Coupette 博士。信息学研究所。
如果对该计划有任何疑问,您可以写信给我 Evgeniya Khasina,我的电子邮件地址。