NS3 Tutorial 中文版:第三章 快速上手
【聲明】允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。
http://yangfei1.blog.51cto.com/1471532/368586
http://yangfei1.blog.51cto.com/1471532/368587
轉載的文章中給的原文地址已經失效,我這里重新整理了原文地址,方便大家查看對照,如果也失效了,可以直接去官網找Tutorial
官網的英文原文地址:
ns-3 Tutorial https://www.nsnam.org/docs/tutorial/html/
原文目錄如下:
3 快速上手
翻譯: 數字城堡
校稿: Xiaochuan Shen xcs105@zepler.net
編輯: 劉小洋 banana.0420@yahoo.com.cn
3.1 下載ns-3
從現在起,我們假定讀者使用的工作環境為Linux或者仿Linux環境(Linux, Cygwin等等.) 并且已經安裝了可用的GNU工具鏈,而且還安裝了Mercurial(分布式版本控制系統)和Waf軟件。細節已經在ns-3網頁中詳述過,參見以下鏈接:
http://www.nsnam.org/getting_started.html.
ns-3源碼可以在網站http://code.nsnam.org 上的Mercurial源碼庫下載到.你也可以從鏈接http://www.nsnam.org/releases/處下載一個tar格式壓縮包,或者直接使用Mercurial從源碼庫下載。除非有特殊需要,我們推薦使用Mercurial從源碼庫下載。tar格式壓縮包下載,請參見本節最后部分。最簡單的方法就是使用Mercurial源碼庫下載一個ns-3-allinone壓縮包,此壓縮包內含一套腳本集來管理各種子系統下的ns-3下載和安裝。我們推薦你使用這個壓縮包來簡化你的ns-3安裝。
3.1.1 使用Mercurial下載ns-3
作為練習,我們首先在home目錄下建立一個目錄并取名為repos,用來存放本地Mercurial源碼庫,注意:在本教程隨后內容中,我們假定你已經這樣做了。如果使用如下的方法,可以在Linux的shell中下載到一份ns-3-allinone軟件包(假定你已經安裝了Mercurial):
cd 你放置NS3的文件夾 mkdir repos cd repos hg clone http://code.nsnam.org/ns-3-allinone當Mercurail的hg命令執行后,可以看到如下結果:
destination directory: ns-3-allinone
requesting all changes
adding changesets
adding manifests
adding file changes
added 31 changesets with 45 changes to 7 files
7 files updated, 0 files merged, 0 files removed, 0 files unresolved
當clone命令運行結束以后,在前述建立的repos目錄下,會出現一個ns-3-allinone目錄,而且含有如下文件:
build.py* constants.py dist.py* download.py* README util.py
注意:你實際上僅僅下載了一些Python腳本,下一步就是利用這些腳本根據需要下載并來安裝ns-3軟件包。如果你訪問如下鏈接:http://code.nsnam.org/ 就會發現若干源碼庫,其中很多是ns3開發團隊專用的。其中在源碼庫org/ 你會發現名為ns-3.1的源碼庫,這是ns-3的第一個穩定版本。還有一些分散的源碼庫名為ns-3.1-reftraces,它為ns-3.1保留了參考記錄。保持這些文件的一致性是非常重要的,尤其是當你想對源碼庫做一個回歸測試時。至少做一次測試來驗證所有的程序都正確編譯了。
當前的開發版ns-3的快照存放在http://code.nsnam.org/ns-3-dev/中;相關的參考記錄存放在鏈接 http://code.nsnam.org/ns-3-dev-ref-traces/中。 ns3開發人員會盡量保持源碼庫中的代碼處于一致,工作的狀態,但是他們仍在開發中,有一些未發布過的代碼。所以如果你不需要最新的特性的話還是考慮使用發行版。
由于發布版的版本號在變化中,我在指南中還是繼續使用通常不變的ns-3-dev,但是你可以根據自己的需要選擇其他的版本,并替換這里的”ns-3-dev”,(例如, ns-3.6或 ns-3.6-ref-traces),在下文中,你可以通過訪問源碼庫列表或者訪問ns3開始網頁找到最新的ns-3發布版軟件。
當你從源碼庫下載完后,繼續切換進入你自己建立的ns-3-allinone目錄中。 我們現在使用download.py腳本來下載ns-3需要使用的各個部件。繼續在你的shell中輸入以下命令 (如果你想使用任意發行版你可以將ns-3-dev替換為你選擇的發行版的名字,例如”ns-3.6” 和”ns-3.6-reftraces”)。
./download.py -n ns-3-dev -r ns-3-dev-ref-traces注意,-n選項的默認參數為ns-3-dev,-r選項的默認參數為ns-3-dev-ref-traces,所以上述命令中這兩個選項的參數實際上是多余的。我們使用這個例子來描述如何指定源碼庫。你只需簡單鍵入如下命令就可以使用默認參數來下載ns-3-dev:
./download.py當hg (Mercurial)命令執行時,你可以看到如下的信息:
#
# Get NS-3
#
Cloning ns-3 branch
=> hg clone http://code.nsnam.org/ns-3-dev ns-3-dev
requesting all changes
adding changesets
adding manifests
adding file changes
Chapter 3: Getting Started 8
added 4634 changesets with 16500 changes to 1762 files
870 files updated, 0 files merged, 0 files removed, 0 files unresolved
這些輸出信息顯示下載腳本已經從源碼庫中下載到了實際的ns-3源碼,緊接著,你就會看到這樣的信息:
#
# Get the regression traces
#
Synchronizing reference traces using Mercurial.
=> hg clone http://code.nsnam.org/ns-3-dev-ref-traces ns-3-dev-ref-traces
requesting all changes
adding changesets
adding manifests
adding file changes
added 86 changesets with 1178 changes to 259 files
208 files updated, 0 files merged, 0 files removed, 0 files unresolved
這表明下載腳本為你下載了參考記錄文件。下載腳本被設計成自適應的,它能檢測在一些系統平臺上某些ns-3模塊不被支持,在你的系統平臺上,你可能看不到這些系統不支持的源碼被下載。然而,在大多數系統平臺上這樣的過程會顯示如下:
#
# Get PyBindGen
#
Required pybindgen version: 0.10.0.640
Trying to fetch pybindgen; this will fail if no network connection is available. Hit Ctrl-=> bzr checkout -rrevno:640 https://launchpad.net/pybindgen pybindgen
Fetch was successful.
這些信息顯示了下載腳本在為你下載Python綁定生成器的過程,下一步你就可能看到如下的信息(不同的系統平臺表現有所不同),
#
# Get NSC
#
Required NSC version: nsc-0.5.0
Retrieving nsc from https://secure.wand.net.nz/mercurial/nsc
=> hg clone https://secure.wand.net.nz/mercurial/nsc nsc
requesting all changes
adding changesets
adding manifests
adding file changes
added 273 changesets with 17565 changes to 15175 files
10622 files updated, 0 files merged, 0 files removed, 0 files unresolved
這些信息顯示了下載腳本在為你下載網絡仿真器支架程序(NSC)的過程。
當復制命令結束,你在~/repos/ns-3-allinone目錄下會有幾個新目錄:
build.py* constants.pyc download.py* ns-3-dev-ref-traces/ pybindgen/ util.py
constants.py dist.py* ns-3-dev/ nsc/ README util.pyc
繼續進入ns-3-dev目錄,你會見到如下的文件:
AUTHORS examples/ regression/ scratch/ waf*
bindings/ LICENSE regression.py src/ waf.bat*
CHANGES.html ns3/ RELEASE_NOTES utils/ wscript
doc/ README samples/ VERSION wutils.py
現在可以準備編譯ns-3軟件了。
3.1.2 使用Tarball下載ns-3
使用tarball下載ns-3比使用Mercurail下載ns-3要簡單一些,因為需要下載的各個部分都已經預先被打包在一個壓縮包中了,你只需要選擇一個發行版版本,下載并且解壓就可以。如上所述,在Mercurial下載方法中,是在home目錄下創建一個repos目錄,保存本地Mercurial源碼庫。你也可以建立一個tarball目錄來下載。(注意:本教程后面會假定你把它下載到了repoa目錄,所以請留意這個選擇)。如果你選擇了tarballs方法下載,你可以鍵入如下命令來下載一份ns-3的發行版 (當然,可以根據需要選擇你想要的版本):
cd 你放置NS3的文件夾 mkdir tarballs cd tarballs wget http://www.nsnam.org/releases/ns-allinone-3.6.tar.bz2 tar xjf ns-allinone-3.6.tar.bz2如果你切換到ns-allinone-3.6目錄,你會看到下述文件:
build.py* ns-3.6/ nsc-0.5.1/ README
constants.py ns-3.6-ref-traces/ pybindgen-0.12.0.700/ util.py
現在就可以編譯ns-3軟件包了。
3.2 編譯ns-3
3.2.1 使用build.py編譯
如果你是第一次編譯ns-3軟件包,建議使用allinone環境,它會為你以最常用的方式配置工程。
切換到你在上文下載一節中創建的目錄下。如果你使用Mercurial下載,請進入~/repos目錄下的ns-3-allinone目錄,如果你使用tarball下載,找到~/tarballs目錄下類似ns-allinone-3.6的目錄,鍵入如下的命令,并請耐心等待:
./build.py編譯腳本開始編譯下載的ns3時,你會看到大量常見的編譯器輸入信息。最后你會看到如下編譯成功的好消息:
Waf: Leaving directory ‘/home/craigdo/repos/ns-3-allinone/ns-3-dev/build’
’build’ finished successfully (2m30.586s)
一旦工程編譯好,你就可以不再使用ns-3-allinone腳本包了。你已經從其中獲取必要的東西,現在是你直接同Waf交互的時候了,它位于ns-3-dev目錄中,并不在 ns-3-allinone目錄中。切換到ns-3-dev目錄下(或者你下載的版本的相應目錄下):
cd ns-3-dev3.2.2使用Waf編譯
我們使用waf來配置和編譯ns-3工程軟件包,這一點不是嚴格必須的,但是做一個簡單的介紹是很有必要的,起碼可以了解如何修改工程的配置。也許你能做出的最有用的配置修改就是編譯工程的優化版本了,默認你會將你的工程編譯為調試版本,讓我們來使工程做出優化的編譯。
為了通知waf進行優化編譯,你需要執行如下的命令:
./waf -d optimized configure這會Waf可能會切換到其他目錄收集信息. 當編譯系統檢查各種依存關系時,你可以看到類似如下的輸出結果:
Checking for program g++ : ok /usr/bin/g++
Checking for program cpp : ok /usr/bin/cpp
Checking for program ar : ok /usr/bin/ar
Checking for program ranlib : ok /usr/bin/ranlib
Checking for g++ : ok
…………………….
(鑒于長度限制,省略)
……………………..
Checking for program valgrind : ok /usr/bin/valgrind
—- Summary of optional NS-3 features:
Threading Primitives : enabled
Real Time Simulator : enabled
Emulated Net Device : enabled
GNU Scientific Library (GSL) : enabled
Tap Bridge : enabled
GtkConfigStore : enabled
XmlIo : enabled
SQlite stats data output : enabled
Network Simulation Cradle : enabled
Python Bindings : enabled
Python API Scanning Support : enabled
Use sudo to set suid bit : not enabled (option –enable-sudo not selected)
Build examples and samples : enabled
Static build : not enabled (option –enable-static not selected)
’configure’ finished successfully (2.870s)
需要注意輸入的最后一部分。部分ns-3選項并不是默認的,需要底層系統的支持才能夠順利運行。例如:為了運行XmlTo, 系統必須安裝libxml-2.0庫,如果沒有發現這個庫,相應的ns-3特性就不會被激活,這會以消息顯示出來。另一個需要注意的地方是:對于一些特定的程序,需要使用sudo命令來設置該程序的。這個是默認設置為關的,所以此性質會顯示出未激活,現在我們可以進一步返回到調試編譯上來:
./waf -d debug configure此時編譯系統被配置好,你可以編譯ns-3程序的debug版本了,只需簡單的命令如下:
./waf一些waf命令在編譯階段是很重要的,另一些命令是在配置階段有用的,例如,如果你想使用ns-3的仿真(emaulation)特性,你一定要通過上述的sudo來設置用戶標識位(suid)為有效位。這將是一個配置命令,你可以使用如下命令通知Waf來重新設置:
./waf -d debug --enable-sudo configure如果你這樣做,waf會運行sudo以root的權限來改變仿真代碼的socket創建程序。在waf中還有許多其它的配置和編譯選項可用。若要察看詳細的選項,鍵入以下命令:
./waf --help我們將會在下一節中使用測試相關的命令。好的,你已經編譯ns-3兩遍了,現在你知道如何修改配置和編譯優化代碼了。
3.3 測試ns-3
你可以通過運行“./test.py -c core”腳本進行ns-3軟件包單元測試,
./test.py -c core這些測試可以被waf并行執行的,最后你可以看到如下的結果:
47 of 47 tests passed (47 passed, 0 failed, 0 crashed, 0 valgrind errors)
這是條相當重要的信息。
實際中,你看到的可能是類似于如下的信息:
Waf: Entering directory ‘/home/craigdo/repos/ns-3-allinone/ns-3-dev/build’
Waf: Leaving directory ‘/home/craigdo/repos/ns-3-allinone/ns-3-dev/build’
’build’ finished successfully (1.799s)
PASS: TestSuite ns3-wifi-interference
PASS: TestSuite histogram
PASS: TestSuite sample
PASS: TestSuite ipv4-address-helper
PASS: TestSuite devices-wifi
PASS: TestSuite propagation-loss-model
…
PASS: TestSuite object
PASS: TestSuite random-number-generators
47 of 47 tests passed (47 passed, 0 failed, 0 crashed, 0 valgrind errors)
用戶通??梢赃\行此命令來檢查ns-3軟件包是否正確編譯了。
你也可以使用我們的回歸測試包來保證你的發行版和工具鏈產生的二進制文件會產生同參考輸出文件相同的結果。你在運行/download.py過程中會下載這些參考記錄。 (警告: ns-3.2和ns-3.3發布版不使用ns-3-allinone環境,當你進行回歸測試時需要在線環境,因為在直接運行測試之前它們需要同一個在線源碼庫進行參考記錄的動態同步)。
在回歸測試中Waf會允許一系列的測試,這些測試會產生我們所說的記錄文件,記錄文件的內容會和參考記錄相對比,如果它們相同,那么回歸測試會報告一個通過狀態(PASS);如果回歸測試失敗你會看到一個失敗標記(FAIL),和一個指針指向有問題的記錄文件和它的聯合參考記錄文件,還附帶一個差異參數和選項以便檢查哪里出現錯誤了。如果在一個pcap文件中出現錯誤, 在對比之前常使用tcpdump來將pcap文件轉換為文本文件。
如果需要的支持缺失,某些回歸測試會被跳過,測試狀態會被標記為跳過(SKIP)。
注意:回歸測試也是并行的,所以產生的信息也可能是交叉出現的。
要進行回歸測試,需要給Waf提供回歸標記:
./waf --regression可以看到如下信息顯示進行了多項測試:
Entering directory ‘/home/craigdo/repos/ns-3-allinone/ns-3-dev/build’
[647/669] regression-test (test-csma-bridge)
[648/669] regression-test (test-csma-broadcast)
[649/669] regression-test (test-csma-multicast)
[650/669] regression-test (test-csma-one-subnet)
PASS test-csma-multicast
[651/669] regression-test (test-csma-packet-socket)
PASS test-csma-bridge
…
Regression testing summary:
PASS: 22 of 22 tests passed
Waf: Leaving directory ‘/home/craigdo/repos/ns-3-allinone/ns-3-dev/build’
’build’ finished successfully (25.826s)
如果你想看看在回歸測試中有哪些項目測試的例子,可以使用如下命令:
cd build/debug/regression/traces/second.ref tcpdump -nn -tt -r second-2-0.pcap這些結果對于熟悉tcpdump或者網絡嗅探器是很清楚的,在本教程的后半部分我們會更多地提及pcap文件。
在一切完成后,請用cd命令返回頂層ns-3目錄:
cd ../../../../..3.4 運行第一個腳本
我們通常使用Waf運行腳本,這將使編譯系統正確設置共享庫的路徑,并保證這些共享庫在運行時可用,如果要運行一個程序,只需在Waf加入—run選項即可,讓我們在ns-3環境下運行常見的hello world程序試一下:
./waf --run hello-simulatorWaf首先檢查程序正確編譯了,而且還可以根據需要重新執行編譯。
Waf執行了此程序,并輸出如下信息:
Hello Simulator
祝賀你. 你現在是一名ns-3用戶了!
如果你想在其他工具下如gdb或者valgrind下運行程序,可參見本Wiki條目。
總結
以上是生活随笔為你收集整理的NS3 Tutorial 中文版:第三章 快速上手的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快乐的瞎子的随笔
- 下一篇: 第七周--项目1-静态成员应用