ns-3 網絡模擬器教程。 第3章

ns-3 網絡模擬器教程。 第3章
第 1,2 章

3 入門
3.1 概述
3.2 先決條件
3.2.1 下載 ns-3 版本作為來源存檔
3.3 使用Git下載ns-3
3.3.1 使用 Bake 載入 ns-3
3.4 組裝ns-3
3.4.1 使用build.py構建
3.4.2 使用烘焙進行構建
3.4.3 使用 Waf 構建
3.5 測試ns-3
3.6 運行腳本
3.6.1 命令列參數
3.6.2 調試
3.6.3 工作目錄

第3章

入門

本章旨在幫助讀者做好準備,開始使用可能從未安裝過 ns-3 的電腦。 它涵蓋了支援的平台、先決條件、如何取得 ns-3、如何建立 ns-3 以及如何測試建置和運行簡單的程式。

3.1 概述

ns-3 模擬器是作為協作軟體庫系統建構的。 在彙編過程中,使用者程式的程式碼與這些庫連結。 C++或Python程式語言用於編寫自訂程式。

NS-3作為原始程式碼分發,這意味著目標系統必須具有軟體開發環境,以便先建置庫,然後建置使用者程式。 原則上,ns-3 可以作為特定係統的現成庫進行分發,並且將來它們可能會以這種方式進行分發。 但現在許多用戶實際上是透過編輯 ns-3 本身來完成工作的,因此擁有建置庫的原始程式碼很有用。 如果有人願意承擔為作業系統建立現成的庫和套件的工作,請聯絡郵件列表 ns-開發者.

接下來,我們將了解下載和建置 ns-3 的三種方法。 第一個是從主網站下載並建立官方版本。 第二個是選擇和組裝基本 ns-3 安裝的開發版本副本。 第三是使用額外的建置工具來載入 ns-3 的更多擴充。 由於工具略有不同,我們將逐一介紹。

有經驗的 Linux 用戶可能想知道為什麼 ns-3 沒有像大多數其他使用套件管理器的庫一樣作為套件提供? 儘管有適用於各種 Linux 發行版(例如 Debian)的二進位套件,但大多數使用者最終都會編輯程式庫並必須自行重建 ns-3,因此擁有可用的原始程式碼很方便。 因此,我們將重點放在從原始碼安裝上。

對於大多數應用程式 ns-3 權限 不需要,建議使用非特權使用者帳號。

3.2 先決條件

整套可用的 ns-3 函式庫對第三方函式庫有許多依賴項,但在大多數情況下,ns-3 可以在支援幾個常見(通常預設安裝)元件的情況下建置和使用:C++ 編譯器、 Python ,原始碼編輯器(例如, VIM, emacs的日食),如果使用開發儲存庫,則使用 Git 版本控制系統。 大多數首次使用的用戶無需擔心他們的設定報告缺少某些 ns-3 高級功能,但對於想要完整安裝的用戶,該專案提供了一個 wiki,其中包含包含許多有用提示和技巧的頁面。 其中一個頁面是「安裝」頁面,其中包含各種系統的安裝說明,可從以下位置取得: https://www.nsnam.org/wiki/Installation.

本 wiki 的先決條件部分解釋了支援常見 ns-3 選項所需的軟體包,並提供了用於在常見風格的 Linux 或 macOS 上安裝它們的命令。

您可以利用這個機會探索 ns-3 wiki 頁面或主網站: https://www.nsnam.org,因為那裡有很多資訊。 從最新版本的 ns-3 (ns-3.29) 開始,執行 ns-3 需要以下工具:

工具包/版本

  • C++編譯器
    clang++ 或 g++(g++ 版本 4.9 或更高版本)
  • 蟒蛇
    python2 版本 >= 2.7.10,或 python3 版本 >=3.4
  • 混帳
    任何最新版本(請造訪 GitLab.com 上的 ns-3)
  • 焦油
    任何最新版本(用於解壓縮 ns-3 版本)
  • 包壓縮2
    任何最新版本(用於解壓縮 ns-3 版本)

若要檢查 Python 的預設版本,請鍵入 python -V。 若要檢查 g++ 版本,請鍵入 g++ -v。 如果有任何工具遺失或太舊,請參閱 ns-3 wiki 頁面上的安裝指南。

從現在開始,我們假設讀者正在執行Linux、MacOS或Linux模擬器,並且至少擁有上述工具。

3.2.1 下載 ns-3 版本作為來源存檔

這是想要下載並試驗 ns-3 的最新版本和軟體包版本的新用戶的操作過程。 ns-3 版本以壓縮來源檔案發布,有時稱為 壓縮包. 壓縮包 是一種特殊的軟體存檔格式,其中多個檔案組合在一起。 存檔通常是壓縮的。 ns-3 啟動程序透過 壓縮包 很簡單,你只需要選擇一個版本,下載並解壓縮它。

假設您作為使用者想要在名為的本機目錄中建置 ns-3 工作空間。 您可以透過在 Linux 控制台中輸入以下內容來取得該版本的工作副本(當然,替換適當的版本號)

$ cd 
$ mkdir workspace 
$ cd workspace 
$ wget https://www.nsnam.org/release/ns-allinone-3.29.tar.bz2 
$ tar xjf ns-allinone-3.29.tar.bz2 

注意上面使用的實用程序 wget的,這是一個用於從 Internet 下載物件的命令列工具。 如果您尚未安裝它,您可以使用瀏覽器來執行此操作。

按照這些步驟,您將進入 ns-allinone-3.29 目錄,在那裡您應該會看到幾個檔案和目錄

$ cd ns-allinone-3.29
$ ls
bake constants.py ns-3.29 README
build.py netanim-3.108 pybindgen-0.17.0.post58+ngcf00cc0 util.py

現在您已準備好建立 ns-3 基礎發行版,並且可以繼續閱讀有關建立 ns-3 的部分。

3.3 使用Git下載ns-3

ns-3 程式碼可在 GitLab.com 上的 Git 儲存庫中找到,網址為 https://gitlab.com/nsnam/。 團體 恩斯南 匯集了開源專案使用的各種儲存庫。

開始使用 Git 儲存庫的最簡單方法是分叉或克隆環境 ns-3-蒜酮。 這是一組管理最常用 ns-3 子系統的載入和組裝的腳本。 如果您是 Git 新手,您可能會對「fork」和「clone」這兩個術語感到陌生; 如果是這樣,我們建議您只需克隆(製作自己的副本)位於 GitLab.com 上的儲存庫,如下所示:

$ cd 
$ mkdir workspace 
$ cd workspace 
$ git clone https://gitlab.com/nsnam/ns-3-allinone.git 
$ cd ns-3-allinone 

在此階段,您的目錄視圖 ns-3-蒜酮 與上面描述的發布存檔目錄略有不同。 它應該看起來像這樣:

$ ls
build.py constants.py download.py README util.py

請注意,有一個腳本 下載.py,這將另外提取 ns-3 和隨附的原始程式碼。 您可以選擇:下載最新的 ns-3 開發快照:

$ python download.py

或更喜歡使用標誌的 ns-3 版本 -n 指示版本號:

$ python download.py -n ns-3.29

這一步之後到目錄 ns-3-蒜酮 將下載額外的儲存庫 ns-3, , pybindgen и 內塔尼姆.

注意
在一台乾淨的 Ubuntu16.04 機器上,我需要將命令更改為: $ sudo python3 download.py -n ns-3.29 (以下簡稱譯者註)。

3.3.1 使用 Bake 載入 ns-3

以上兩種方法(來源存檔或儲存庫 ns-3-蒜酮 透過 Git)對於獲得具有多個插件的最簡單的 ns-3 安裝非常有用(pybindgen 生成 Python 綁定和 內塔尼姆 用於網路動畫)。 ns-3-allinone 中預設提供的第三個儲存庫稱為 .

是為 ns-3 專案開發的用於從多個儲存庫協調建立軟體的工具。 可用於取得 ns-3 的開發版本,以及下載和建置 ns-3 發行版基本版本的擴展,例如環境 直接程式碼執行, CradleNetwork 模擬搖籃,創建新的 Python 綁定和各種 ns-3“應用程式”的能力。

注意
CradleNetwork 模擬 Cradle 是一個框架,可讓您在網路模擬器中使用真正的 TCP/IP 網路堆疊。

如果您希望 ns-3 安裝具有進階或附加功能,則可以遵循此安裝路徑。

在最新的 ns-3 版本中 已新增至 tar 版本。 此版本包含一個設定文件,可讓您在發佈時下載當前的軟體版本。 也就是說,例如,版本 隨版本 ns-3.29 一起分發,可用於檢索該版本 ns-3 或更早版本的元件,但不能用於檢索更高版本的元件(如果套件描述文件 烘焙設定檔 未更新)。

您還可以獲得最新的副本 在 Linux 控制台中輸入以下命令(假設您已安裝 Git):

$ cd 
$ mkdir workspace 
$ cd workspace 
$ git clone https://gitlab.com/nsnam/bake.git

當您執行 git 命令時,您應該會看到類似以下內容:

Cloning into 'bake'...
remote: Enumerating objects: 2086, done. 
remote: Counting objects: 100% (2086/2086), done. 
remote: Compressing objects: 100% (649/649), done. 
remote: Total 2086 (delta 1404), reused 2078 (delta 1399) 
Receiving objects: 100% (2086/2086), 2.68 MiB | 3.82 MiB/s, done. 
Resolving deltas: 100% (1404/1404), done.

命令完成後 克隆 你應該有一個名為 ,其內容應如下所示:

$ cd bake
$ ls
bake bakeconf.xml bake.py doc examples generate-binary.py test TODO

請注意,您已經載入了多個 Python 腳本,一個名為的 Python 模組 和一個 XML 設定檔。 下一步是使用這些腳本下載並建立您選擇的 ns-3 發行版。 有多個自訂目標可用:

  1. ns-3.29:release對應的模組; 它將下載與 tarball 中的版本類似的組件;

  2. ns-3-dev:類似的模組,但使用開發樹中的程式碼;

  3. ns-蒜酮-3.29:包含其他附加功能的模組,例如 Click 路由和網路模擬 Cradle、Openflow for ns-3。

  4. ns-3-蒜酮:與模組的release版本類似 ALLINONE,但用於開發程式碼。

注意
點擊 — 用於建立路由器的模組化軟體架構。

Openflow是一種用於管理路由器和交換器透過資料網路傳輸的資料處理過程的協議,實現軟體定義的網路技術。

目前的開發快照(非發布)ns-3 可以在以下位置找到:https://gitlab.com/nsnam/ns-3-dev.git.

開發人員試圖使這些儲存庫保持一致的工作順序,但它們位於開發區域並包含未發布的程式碼,因此如果您不打算使用新功能,請選擇正式版本。

您可以透過瀏覽儲存庫清單或造訪 ns-3 Releases 網頁來找到最新版本的程式碼:https://www.nsnam.org/releases/ 並點擊最新版本連結。 在此範例中,我們將繼續使用 ns-3.29。

現在,為了取得我們需要的 ns-3 元件,我們將使用該工具 。 我們先簡單介紹一下這項工作 .

Bake 的工作原理是將套件來源載入到目錄中 資源 並將庫安裝到建置目錄中。 可以透過引用二進位檔案來運行,但是如果你想運行 不是從下載的目錄,建議新增路徑 到您的路徑(PATH 環境變數),例如如下(Linux bash shell 的範例)。 進入“bake”目錄,然後設定以下環境變數:

$ export BAKE_HOME=`pwd` 
$ export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin 
$ export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/lib

這將把程序 烘焙.py 到 shell 路徑,並允許其他程式找到它創建的可執行檔和庫 。 在某些用例中 ,上述 PATH 和 PYTHONPATH 設定不是必需的,但 ns-3-allinone 的完整建置(帶有附加軟體包)通常需要它。

前往您的工作目錄並在控制台中輸入以下內容:

$ ./bake.py configure -e ns-3.29

接下來我們會問 檢查我們是否有足夠的工具來載入各種組件。 撥號:

$ ./bake.py check

您應該會看到類似以下內容:

> Python - OK 
> GNU C++ compiler - OK 
> Mercurial - OK 
> Git - OK 
> Tar tool - OK 
> Unzip tool - OK 
> Make - OK 
> cMake - OK 
> patch tool - OK 
> Path searched for tools: /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin ...

特別是Mercurial、CVS、Git和Bazaar等上傳工具在這一步驟中是必不可少的,因為它們可以讓我們取得程式碼。 在此階段,以系統的常用方式安裝缺少的工具(如果您知道如何操作)或聯絡系統管理員尋求協助。

接下來,試試下載軟體:

$ ./bake.py download

結果應該是這樣的:

>> Searching for system dependency setuptools - OK 
>> Searching for system dependency libgoocanvas2 - OK 
>> Searching for system dependency gi-cairo - OK 
>> Searching for system dependency pygobject - OK 
>> Searching for system dependency pygraphviz - OK 
>> Searching for system dependency python-dev - OK 
>> Searching for system dependency qt - OK 
>> Searching for system dependency g++ - OK 
>> Downloading pybindgen-0.19.0.post4+ng823d8b2 (target directory:pybindgen) - OK 
>> Downloading netanim-3.108 - OK 
>> Downloading ns-3.29 - OK

這意味著已經下載了三個來源。 現在轉到來源目錄並輸入 ls; 你應該看到:

$ cd source 
$ ls
netanim-3.108 ns-3.29 pybindgen

現在您已準備好建立 ns-3 發行版。

3.4 組裝ns-3

與下載 ns-3 一樣,建立 ns-3 有多種方法。 我們要強調的主要事情是 ns-3 是使用名為的建置工具建構的 瓦夫如下面所描述的。 大多數用戶將使用 瓦夫,但是有一些方便的腳本可以幫助您開始或組織更複雜的建置。 所以請在閱讀之前 瓦夫, 看一眼 構建.py 並組裝 .

3.4.1 使用build.py構建

警告! 此建置步驟僅適用於如上所述取得的來源存檔版本; 並且不是透過 git 或 Baker 下載的。

使用發布檔案時 壓縮包ns-3-蒜酮 有一個方便的腳本可以使組件的組裝變得更容易。 它稱為 build.py。 該程式將以最有用的方式為您設定專案。 但是,請注意,更高級的設定和使用 ns-3 通常涉及使用 ns-3 自己的建置系統 Waf,本教學稍後將介紹該系統。

如果您下載的是使用 壓縮包,然後在你的目錄中 〜/工作區 名稱類似的目錄 ns-蒜酮-3.29。 輸入以下內容:

$ ./build.py --enable-examples --enable-tests

打電話時 構建.py 我們使用命令列參數來建立本教程中使用的範例和測試,這些範例和測試在 ns-3 中預設不建置。 預設情況下,程式也會建立所有可用的模組。 然後,如果您願意,您可以在沒有範例和測試的情況下建立 ns-3,或排除您的工作不需要的模組。

當腳本建置您已載入的各個部分時,您將看到腳本顯示的許多編譯器輸出訊息。 首先,腳本將嘗試建立動畫師 內塔尼姆,然後是綁定產生器 pybindgen 最後是 ns-3。 過程完成後,您應該會看到以下內容:

Waf: Leaving directory '/path/to/workspace/ns-allinone-3.29/ns-3.29/build'
'build' finished successfully (6m25.032s) 

Modules built:
antenna                aodv                     applications
bridge                 buildings                config-store
core                   csma                     csma-layout
dsdv                   dsr                      energy 
fd-net-device          flow-monitor             internet
internet-apps          lr-wpan                  lte
mesh                   mobility                 mpi
netanim (no Python)    network                  nix-vector-routing 
olsr                   point-to-point           point-to-point-layout 
propagation            sixlowpan                spectrum 
stats                  tap-bridge               test (no Python) 
topology-read          traffic-control          uan 
virtual-net-device     visualizer               wave 
wifi                   wimax 

Modules not built (see ns-3 tutorial for explanation):
brite                  click                    openflow 
Leaving directory ./ns-3.29

在清單的最後三行中,我們看到一條有關未建置模組的訊息:

Modules not built (see ns-3 tutorial for explanation):
brite                     click

這僅意味著某些依賴外部庫的 ns-3 模組可能尚未構建,或者不需要為此配置構建它們。 這並不意味著模擬器未組裝或組裝的模組無法正常運作。

3.4.2 使用烘焙進行構建

如果您使用上面的bake從專案儲存庫取得原始程式碼,您可以繼續使用它來建置ns-3。 撥號:

$ ./bake.py build

你應該會看到類似的東西:

>> Building pybindgen-0.19.0.post4+ng823d8b2 - OK 
>> Building netanim-3.108 - OK 
>> Building ns-3.29 - OK

幫助:您也可以透過呼叫“bake.py deploy”來同時執行下載和建置步驟。

組裝所有組件可能會失敗,但如果不需要組件,組裝將繼續。 例如,最近的一個可移植性問題是 轉換XML 可以透過工具組裝 並非在所有平台上。 在這種情況下,將出現以下訊息:

>> Building castxml - Problem 
> Problem: Optional dependency, module "castxml" failed
This may reduce the functionality of the final build.
However, bake will continue since "castxml" is not an essential dependency.
For more information call bake with -v or -vvv, for full verbose mode.

轉換XML 僅當您想要建立更新的 Python 綁定時才需要。 對於大多數用戶來說,不需要這樣做(至少在他們更改 ns-3 之前),因此現在可以安全地忽略此類警告。

如果失敗,以下命令將為您提供有關缺少依賴項的提示:

$ ./bake.py show

將列出您嘗試建立的套件的各種依賴項。

3.4.3 使用 Waf 構建

到目前為止,為了開始建置 ns-3,我們使用了以下腳本 構建.py,或工具 。 這些工具對於建立 ns-3 和維護庫非常有用。 事實上,為了構建,他們運行構建工具 瓦夫 來自 ns-3 目錄。 瓦夫 使用 ns-3 原始碼安裝。 大多數用戶很快就會直接使用來配置和組裝 ns-3 瓦夫。 因此,要繼續,請前往您最初建立的 ns-3 目錄。

目前這並不是嚴格要求的,但回溯一下並了解如何更改專案配置將很有用。 您可以進行的最有用的配置更改可能是創建程式碼的最佳化版本。 預設情況下,您已將專案配置為建置偵錯版本。 讓我們看一下創建優化建置的專案。 為了向 Waf 解釋它應該進行包含範例和測試的最佳化構建,您需要執行以下命令:

$ ./waf clean 
$ ./waf configure --build-profile=optimized --enable-examples --enable-tests

這將啟動 瓦夫 本地目錄之外(為了您的方便)。 第一個命令清除先前的構建,這通常不是絕對必要的,但這是一個很好的做法(另請參閱下面的構建配置文件); 這將刪除目錄中先前建立的庫和目標文件 建造/。 重新配置專案並且建置系統檢查各種依賴項時,您應該會看到類似於以下內容的輸出:

Setting top to      : /home/ns3user/workspace/bake/source/ns-3-dev
Setting out to      : /home/ns3user/workspace/bake/source/ns-3-dev/build
Checking for 'gcc' (C compiler)        : /usr/bin/gcc 
Checking for cc version                : 7.3.0 
Checking for 'g++' (C++ compiler)      : /usr/bin/g++ 
Checking for compilation flag -march=native support : ok 
Checking for compilation flag -Wl,--soname=foo support : ok 
Checking for compilation flag -std=c++11 support       : ok 
Checking boost includes   : headers not found, please ,!provide a --boost-includes argument (see help) 
Checking boost includes   : headers not found, please ,!provide a --boost-includes argument (see help) 
Checking for program 'python'            : /usr/bin/python 
Checking for python version >= 2.3       : 2.7.15 python-config                                                                     : /usr/bin/python-config
Asking python-config for pyembed '--cflags --libs --ldflags' flags : yes
Testing pyembed configuration                                      : yes
Asking python-config for pyext '--cflags --libs --ldflags' flags   : yes
Testing pyext configuration                                        : yes

Checking for compilation flag -fvisibility=hidden support          : ok 
Checking for compilation flag -Wno-array-bounds support            : ok 
Checking for pybindgen location          : ../pybindgen ,!(guessed) 
Checking for python module 'pybindgen'   : 0.19.0. ,!post4+g823d8b2 
Checking for pybindgen version           : 0.19.0. ,!post4+g823d8b2 
Checking for code snippet                : yes 
Checking for types uint64_t and unsigned long equivalence : no 
Checking for code snippet                                 : no 
Checking for types uint64_t and unsigned long long equivalence     : yes 
Checking for the apidefs that can be used for Python bindings                       : gcc-LP64 
Checking for internal GCC cxxabi         : complete 
Checking for python module 'pygccxml'    : not found 
Checking for click location              : not found 
Checking for program 'pkg-config'        : /usr/bin/pkg- ,!config 
Checking for 'gtk+-3.0'                  : not found 
Checking for 'libxml-2.0'                : yes 
checking for uint128_t                   : not found 
checking for __uint128_t                 : yes 
Checking high precision implementation   : 128-bit integer ,!(default) 
Checking for header stdint.h             : yes 
Checking for header inttypes.h           : yes 
Checking for header sys/inttypes.h       : not found 
Checking for header sys/types.h          : yes 
Checking for header sys/stat.h           : yes 
Checking for header dirent.h             : yes 
Checking for header stdlib.h             : yes 
Checking for header signal.h             : yes 
Checking for header pthread.h            : yes 
Checking for header stdint.h             : yes 
Checking for header inttypes.h           : yes 
Checking for header sys/inttypes.h       : not found
Checking for library rt                  : yes 
Checking for header sys/ioctl.h          : yes 
Checking for header net/if.h             : yes 
Checking for header net/ethernet.h       : yes 
Checking for header linux/if_tun.h       : yes 
Checking for header netpacket/packet.h   : yes 
Checking for NSC location                : not found 
Checking for 'sqlite3'                   : not found 
Checking for header linux/if_tun.h       : yes 
Checking for python module 'gi'          : 3.26.1 
Checking for python module 'gi.repository.GObject'      : ok 
Checking for python module 'cairo'                      : ok 
Checking for python module 'pygraphviz'                 : 1.4rc1 
Checking for python module 'gi.repository.Gtk'          : ok 
Checking for python module 'gi.repository.Gdk'          : ok 
Checking for python module 'gi.repository.Pango'        : ok 
Checking for python module 'gi.repository.GooCanvas'    : ok 
Checking for program 'sudo'                             : /usr/bin/sudo 
Checking for program 'valgrind'                         : not found 
Checking for 'gsl' : not found python-config            : not found 
Checking for compilation flag -fstrict-aliasing support : ok 
Checking for compilation flag -fstrict-aliasing support : ok 
Checking for compilation flag -Wstrict-aliasing support : ok 
Checking for compilation flag -Wstrict-aliasing support : ok 
Checking for program 'doxygen'                          : /usr/bin/doxygen
---- Summary of optional ns-3 features:
Build profile : optimized
Build directory : 
BRITE Integration : not enabled (BRITE not enabled (see option --with- ,!brite)) 
DES Metrics event collection : not enabled (defaults to disabled) 
Emulation FdNetDevice        : enabled 
Examples                     : enabled 
File descriptor NetDevice    : enabled 
GNU Scientific Library (GSL) : not enabled (GSL not found) 
Gcrypt library               : not enabled
(libgcrypt not found: you can use ,!libgcrypt-config to find its location.) GtkConfigStore               : not enabled (library 'gtk+-3.0 >= 3.0' not fou   nd)
MPI Support                  : not enabled (option --enable-mpi not selected)
ns-3 Click Integration       : not enabled (nsclick not enabled (see option --with- ,!nsclick))
ns-3 OpenFlow Integration   : not enabled (Required boost libraries not found) 
Network Simulation Cradle    : not enabled (NSC not found (see option --with-nsc))
PlanetLab FdNetDevice         : not enabled (PlanetLab operating system not detected ,!(see option --force-planetlab)) PyViz visualizer : enabled 
Python API Scanning Support   : not enabled (Missing 'pygccxml' Python module)
Python Bindings : enabled 
Real Time Simulator           : enabled 
SQlite stats data output      : not enabled (library 'sqlite3' not found)
Tap Bridge                    : enabled 
Tap FdNetDevice               : enabled
Tests                         : enabled 
Threading Primitives          : enabled 
Use sudo to set suid bit   : not enabled (option --enable-sudo not selected)
XmlIo                         : enabled
'configure' finished successfully (6.387s)

請注意上面列表的最後部分。 某些 ns-3 選項預設未啟用或需要係統支援才能正常運作。 例如,要啟用 XmlTo,該程式庫必須存在於系統上 libxml-2.0。 如果未找到該程式庫且未啟用對應的 ns-3 功能,則會顯示一則訊息。 另請注意,可以使用命令 須藤 為某些程式設定 suid 位元「運行時設定群組 ID」。 預設未啟用,因此此功能顯示為“未啟用”。 最後,要取得已啟用選項的列表,請使用 瓦夫 帶參數 --check-config.

現在讓我們返回並切換回包含範例和測試的調試版本。

$ ./waf clean 
$ ./waf configure --build-profile=debug --enable-examples --enable-tests

建置系統現已設定完畢,您只需鍵入以下內容即可建置 ns-3 程式的偵錯版本:

$ ./waf

上述步驟可能迫使您兩次建立 ns-3 系統的一部分,但現在您知道如何變更配置並建立最佳化的程式碼。

若要檢查給定專案配置哪個設定檔處於活動狀態,可以使用下列命令:

$ ./waf --check-profile 
Waf: Entering directory `/path/to/ns-3-allinone/ns-3.29/build' 
Build profile: debug

上述場景 構建.py 也支持論證 --enable-examples и --enable-tests,但還有其他選擇 瓦夫 它不直接支援。 例如,這是行不通的:

$ ./build.py --disable-python

反應會是這樣的:

build.py: error: no such option: --disable-python

但是,特殊運算符 - - 可用於透過以下方式傳遞附加參數 WAF因此,代替上面的命令,以下命令將起作用:

$ ./build.py -- --disable-python

因為它產生了主命令 ./waf 設定 --disable-python。 這裡有一些更多的介紹提示 瓦夫.

處理建置錯誤

ns-3 版本在常見 Linux 和 MacOS 發行版上發佈時可用的最新 C++ 編譯器上進行了測試。 然而,隨著時間的推移,新的發行版會發布新的編譯器,而這些新的編譯器往往對警告更加迂腐。 ns-3 將其建置配置為將所有警告視為錯誤,因此有時如果您在較新的系統上執行舊版本,編譯器警告可能會停止建置。

例如,之前有一個針對 Fedora 3.28 的 ns-28 版本,其中包括一個新的主要版本 GCC (海灣合作委員會-8)。 在 Fedora 3.28 下建置 ns-28 或更早版本,安裝 Gtk2+ 時,會出現以下錯誤:

/usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses ,!in declaration of ‘__gtk_reserved1’ [-Werror=parentheses] void (*__gtk_reserved1);

在從 ns-3.28.1 開始的版本中, 瓦夫 有一個選項可以解決這些問題。 它禁止在 g++ 和 clang++ 中設定「-Werror」標誌。 這是“--disable-werror”選項,必須在配置期間套用:

$ ./waf configure --disable-werror --enable-examples --enable-tests

配置或組裝

一些命令 瓦夫 僅在配置階段有意義,有些僅在建置階段有效。 例如,如果要使用 ns-3 模擬功能,可以啟用該位元設定 SUID 使用 須藤, 如上所述。 這將覆蓋配置步驟命令,因此您可以使用以下命令更改配置,其中還包括範例和測試。

$ ./waf configure --enable-sudo --enable-examples --enable-tests

如果你這樣做 瓦夫 將啟動 須藤更改模擬程式碼套接字建立程式以使用權限運行 。 在 瓦夫 還有許多其他選項可用於配置和建置步驟。 若要探索您的選項,請輸入:

$ ./waf --help

在下一節中,我們將使用一些與測試相關的選項。

組裝型材

我們已經了解如何配置 瓦夫 用於組裝 調試 и 優化:

$ ./waf --build-profile=debug

還有一個中間裝配型材, 釋放。 選項 -d 是一個同義詞 --build-profile。 建置設定檔控制日誌記錄、斷言和編譯器最佳化開關的使用:

ns-3 網絡模擬器教程。 第3章

如您所見,日誌記錄和斷言僅在偵錯版本中可用。 建議的做法是在調試模式下開發腳本,然後在優化的建置設定檔中執行重複運行(用於統計或參數更改)。

如果您的程式碼只能在某些建置設定檔中運行,請使用程式碼包裝器巨集:

NS_BUILD_DEBUG (std::cout << "Part of an output line..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Done: " << timer << std::endl;)

預設, 瓦夫 將建置工件放在建置目錄中。 您可以使用選項指定不同的輸出目錄 - -out例如:

$ ./waf configure --out=my-build-dir

透過將其與建置設定檔結合,您可以輕鬆地在不同的編譯選項之間切換:

$ ./waf configure --build-profile=debug --out=build/debug
$ ./waf build
... 
$ ./waf configure --build-profile=optimized --out=build/optimized 
$ ./waf build
...

這允許您使用多個程序集,而不必每次都重寫最新的程序集。 當您切換到另一個設定檔時, 瓦夫 將僅編譯它,而不完全重新編譯所有內容。

當您以這種方式切換建置設定檔時,您需要小心每次都提供相同的配置選項。 定義幾個環境變數將幫助您避免錯誤:

$ export NS3CONFIG="--enable-examples --enable-tests" 
$ export NS3DEBUG="--build-profile=debug --out=build/debug"
$ export NS3OPT=="--build-profile=optimized --out=build/optimized" 

$ ./waf configure $NS3CONFIG $NS3DEBUG
$ ./waf build 
... 
$ ./waf configure $NS3CONFIG $NS3OPT
$ ./waf build

編譯器和標誌

在上面的例子中 瓦夫 建置 ns-3 使用 GCC 中的 C++ 編譯器( 克++)。 但是,您可以更改您使用的 瓦夫 C++編譯器,透過定義CXX環境變化。 例如,要使用C++編譯器Clang、clang++,

$ CXX="clang++" ./waf configure 
$ ./waf build 

同樣的方式也可以配置 瓦夫 使用分散式編譯 分區:

$ CXX="distcc g++" ./waf configure 
$ ./waf build

有關 distcc 和分散式編譯的更多資訊可以在專案頁面的文檔部分找到。 若要在配置 ns-3 時新增編譯器標誌,請使用 CXXFLAGS_EXTRA 環境變數。

安裝

瓦夫 可用於在系統上的不同位置安裝庫。 預設情況下,編譯的庫和可執行檔位於目錄中 建立,並且由於 Waf 知道這些庫和可執行檔的位置,因此無需在其他地方安裝這些庫。

如果使用者喜歡在建置目錄之外安裝,可以執行命令 ./waf 安裝。 安裝的預設前綴是 在/ usr /本地, 這就是為什麼 ./waf 安裝 將安裝程式 在/ usr / local / bin目錄,圖書館在 在/ usr / local / lib目錄 和頭檔在 /usr/local/包括。 超級用戶權限通常需要設定預設前綴,因此典型的命令是 須藤 ./waf 安裝。 啟動時,Waf 將首先選擇使用建置目錄中的共用程式庫,然後沿著本機環境中配置的庫的路徑尋找庫。 因此,在系統上安裝庫時,最好檢查是否使用了正確的庫。 使用者可以透過在配置期間傳遞選項來選擇使用不同的前綴進行安裝 --prefix例如:

./waf configure --prefix=/opt/local

如果稍後,建置後,使用者輸入安裝命令 ./waf,將使用前綴 /選擇/本地.

團隊 ./waf clean 如果安裝將使用,則必須在重新配置專案之前使用 瓦夫 在不同的前綴下。

因此,要使用 ns-3 無需調用 ./waf install。 大多數用戶不需要此命令,因為 瓦夫 將從建置目錄中取得目前庫,但如果某些使用者的活動涉及使用 ns-3 目錄以外的程序,則某些使用者可能會發現這很有用。

瓦夫單曲

在 ns-3 原始碼樹的頂層,只有一個 Waf 腳本。 一旦開始工作,你會花很多時間在目錄上 scratch/ 或更深入地src/... 同時必須運行 瓦夫。 你只需記住你在哪裡然後跑就可以了 瓦夫 如下所示:

$ ../../../waf ...

但這會很乏味且容易出錯,所以有更好的解決方案。 一種常見的方法是使用文字編輯器,例如 emacs的VIM,其中開啟兩個終端會話,一個用於建立 ns-3,第二個用於編輯原始碼。 如果你只有 壓縮包,那麼環境變數可以幫助:

$ export NS3DIR="$PWD" 
$ function waff { cd $NS3DIR && ./waf $* ; } 

$ cd scratch 
$ waff build

在模組目錄中,可能會很想新增一個簡單的 waf 腳本,例如 exec ../../waf。 “請不要那樣做。” 這會讓新手感到困惑,如果做得不好,會導致難以檢測的建置錯誤。 上面顯示的解決方案是應該使用的路徑。

3.5 測試ns-3

您可以透過執行腳本來執行 ns-3 發行版的單元測試 ./測試.py:

$ ./test.py

這些測試與 瓦夫。 最終您應該看到一條訊息:

92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

這是識別 valgrind 崩潰、崩潰或錯誤的重要訊息,表示程式碼存在問題或工具和程式碼之間不相容。

您還將看到最終輸出 瓦夫 以及運行每個測試的測試人員,看起來像這樣:

Waf: Entering directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
Waf: Leaving directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
'build' finished successfully (1.799s) 

Modules built:
aodv           applications          bridge
click          config-store          core
csma           csma-layout           dsdv
emu            energy                flow-monitor
internet       lte                   mesh
mobility       mpi                   netanim
network        nix-vector-routing    ns3tcp
ns3wifi        olsr                  openflow
point-to-point point-to-point-layout propagation
spectrum       stats                 tap-bridge
template       test                  tools
topology-read  uan                   virtual-net-device
visualizer     wifi                  wimax

PASS: TestSuite ns3-wifi-interference
PASS: TestSuite histogram 

...

PASS: TestSuite object
PASS: TestSuite random-number-generators
92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

使用者通常會執行此命令來快速驗證 ns-3 發行版是否已正確建置。 (請注意,「PASS: ...」行的順序可能不同,這是正常的。重要的是報告末尾的摘要行顯示所有測試都已通過;沒有測試失敗或崩潰。)和 瓦夫測試.py 將在機器的可用處理器核心上並行工作。

3.6 運行腳本

我們通常在控制下運行腳本 瓦夫。 這允許建置系統確保共享庫路徑設定正確並且庫在運行時可用。 要運行該程序,只需使用 瓦夫 帶參數 - -run。 讓我們運行 ns-3 相當於無處不在的程序 你好世界輸入以下內容:

$ ./waf --run hello-simulator

Waf 將首先檢查程式是否正確構建,並在必要時進行構建。 然後 瓦夫 將執行一個產生以下輸出的程式。

Hello Simulator

恭喜! 您現在是 ns-3 使用者了!

如果我沒有看到結果,我該怎麼辦?

如果您看到訊息 瓦夫表明建置成功完成,但您看不到輸出 《你好模擬器》,那麼有可能在 [Build-with-Waf] 部分中您將建置模式切換為 優化,但錯過了切換回模式 調試。 本教程中使用的所有控制台輸出都使用特殊的 ns-3 元件來執行日誌記錄並用於將自訂訊息列印到控制台。 當編譯最佳化程式碼時,該元件的輸出將自動停用 - 它是「最佳化的」。 如果您沒有看到「Hello Simulator」輸出,請輸入以下內容:

$ ./waf configure --build-profile=debug --enable-examples --enable-tests

配置 瓦夫 建構 ns-3 程式的偵錯版本,其中包括範例和測試。 然後,您應該透過鍵入以下內容來重建程式碼的當前偵錯版本

$ ./waf

現在如果你運行該程式 你好模擬器,您應該會看到預期的結果。

3.6.1 命令列參數

若要將命令列參數傳遞給 ns-3 程序,請使用下列模式:

$ ./waf --run <ns3-program> --command-template="%s <args>"

代替到你的程式的名稱和參數。 爭論 - -command-template瓦夫 本質上就是建立實際命令列的秘訣 瓦夫 用於執行程序。 Waf 檢查建置是否完成,設定共用庫路徑,然後使用提供的命令列範本並用程式名稱取代 %s 佔位符來呼叫可執行檔。 如果您發現此語法很複雜,有一個更簡單的版本,其中涉及 ns-3 程式及其用單引號括起來的參數:

$ ./waf --run '<ns3-program> --arg1=value1 --arg2=value2 ...'

另一個特別有用的例子是選擇性地運行測試套件。 我們假設有一個名為 mytest 的測試套件(實際上沒有)。 上面我們使用./test.py腳本並行執行多個測試,其中重複呼叫測試程序 測試運行者。 稱呼 測試運行者 直接執行一個測試:

$ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"

參數將傳遞給程式 測試運行者。 由於 mytest 不存在,因此將產生錯誤訊息。 若要列印可用的測試運行程序選項,請輸入:

$ ./waf --run test-runner --command-template="%s --help"

3.6.2 調試

要在另一個實用程式(例如偵錯器)下執行 ns-3 程式(例如, 數據庫)或記憶體測試工具(例如, 瓦爾格朗德),使用類似的形式 - -command-template = "…"。 例如,在調試器中運行 數據庫 你的 hello-simulator ns-3 程式帶有參數:

$ ./waf --run=hello-simulator --command-template="gdb %s --args <args>"

請注意,ns-3 程式名稱帶有參數 - -run,以及管理實用程式(此處 數據庫) 是參數中的第一個標記 - -command-template。 選項 - -args 報告 數據庫命令列的其餘部分屬於「較低」程序。 (部分版本 數據庫 不明白該選項 - -args。 在這種情況下,從中刪除程式參數 - -command-template 並使用命令集 數據庫 參數.)我們可以結合這個配方和前一個配方在調試器下運行測試:

$ ./waf --run test-runner --command-template="gdb %s --args --suite=mytest --verbose"

3.6.3 工作目錄

Waf 必須從 ns-3 樹頂部的位置啟動。 該資料夾將成為寫入輸出檔案的工作目錄。 但是如果您想將這些檔案保留在 ns-3 原始碼樹之外怎麼辦? 使用參數 - -cwd:

$ ./waf --cwd=...

您可能會發現在工作目錄中取得輸出檔案會更方便。 在這種情況下,以下間接措施會有所幫助:

$ function waff {
CWD="$PWD" 
cd $NS3DIR >/dev/null 
./waf --cwd="$CWD" $*
cd - >/dev/null 
}

該命令的先前版本的此修飾保留了當前工作目錄,並轉到該目錄 瓦夫然後指示 瓦夫 將工作目錄變更回啟動程序之前已儲存的目前工作目錄。 我們提到團隊 - -cwd 為了完整起見,大多數用戶只是從頂級目錄運行 Waf 並在那裡生成輸出檔案。

續:第 4 章

來源: www.habr.com

添加評論