---- 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,我的電子郵件地址。