【致謝】: 感謝關注NS3 Tutorial中文版的廣大網友們,感謝NS3翻譯小組,感謝初稿的翻譯者們,感謝審稿和編輯們!!! (詳細的名單請查看博文翻譯Tutorial)
聲明:引用和轉載相關內容,請尊重作者、翻譯者和審稿者的辛勤付出,我們堅信開源的思想,我們希望自己的工作可以爲更多的人提供幫助,我們不希望成爲隨意粘貼和任意複製的對象。
(點擊以下目錄,可以查看相應的英文原文)
1. Introduction | ||
2. Resources | ||
3. Getting Started | ||
4. Conceptual Overview | ||
5. Tweaking ns-3 | ||
6. Building Topologies | ||
7. The Tracing System | ||
8. Closing Remarks | ||
Index |
1 簡介 http://www.nsnam.org/docs/release/tutorial/tutorial_1.html#Introduction
翻譯: 伍迪 劉小洋 |
|
校稿: Xiaochuan Shen |
|
編輯: ProbibidoAmor |
NS-3的主文檔由四部份組成:
l NS-3維基百科
本指南的目的是向NS-3新用戶以結構化的方式介紹NS-3系統。常常,新用戶很難通過繁冗的參考手冊收集到對當前仿真任務有用的實質信息。在本教程中,我們將通過幾個仿真實例向讀者介紹和闡釋NS-3的主要概念和特點。
隨着本教程的深入,我們會介紹完整的NS-3文檔,並指出源代碼的具體位置,以便於對NS-3軟件系統運行機制感興趣的研究者做深入的鑽研。
開始之前,有幾個要點需要讀者注意:
l NS-3並不是NS-2的擴展,而是一個全新的模擬器。雖然二者都由C++編寫,但NS-3並不支持NS-2的API 。NS-2中的一些模塊已經被移植到了NS-3。在NS-3開發的過程中,NS-3項目組會繼續維護NS-2,同時也會研究過渡和整合機制。
l NS-3是開源的。NS-3項目努力爲研究者提供一個開放的環境來共享他們自己的軟件。
1.1 致NS-2用戶
對於熟悉NS-2的讀者來說,NS-3和NS-2最明顯的區別是腳本語言的選擇。NS-2使用OTcl腳本語言,仿真的結果可以通過網絡動畫器nam(Network Animator nam)來演示。在NS-2中,如果僅使用C++語言而不用OTcl,仿真過程是不可能運行起來的(即,只有main()函數而沒有任何OTcl語句)。另外,NS-2的許多模塊由C++編寫,其他的用OTcl語言編寫。而在NS-3中,仿真器全都由C++編寫,僅僅帶有可選擇性的Python語言綁定。因此,仿真腳本可以由C++或者Python語言編寫。某些仿真結果可以通過nam演示,但是新的動畫演示器也正在開發之中。由於NS-3可以生成pcap包trace文件,也可以利用其他工具通過trace文件來分析仿真過程。在本教程中,我們先重點講解使用C++編寫腳本,並通過trace文件來分析仿真結果。
NS-3和NS-2也有一些相似之處 (比如二者都是基於C++對象,一些NS-2的模塊已移植到了NS-3上)。在本教程中,我們將強調NS-3和NS-2的區別。
我們經常聽到一個疑問:“我到底是要繼續使用NS-2,還是轉向NS-3呢?”
答案視情況而定。雖然NS-3現在還沒有包含所有的NS-2模塊,但是另一方面,NS-3也有一些新的功能(比如,能正確地處理節點上的多重接口,使用IP地址,與因特網協議和設計保持一致,以及更加詳細的802.11模塊等)。NS-2的模塊可以被移植到NS-3中(移植幫助文檔正在準備之中)。NS-3的多個前端也正在積極開發中。同時,NS-3開發者也相信(部分早期用戶也已證明)NS-3已經可以充分使用,也是用戶進行新仿真項目時的一個富有吸引力的選擇。
1.2 共享 contributing
NS-3是由學術研究者開發和使用的用於網絡科研和教學的仿真器。它依賴於研究者們持續不懈地努力,開發新模塊、調試和維護已有模塊、並共享成果。爲了鼓勵研究者像支持NS-2那樣支持NS-3,我們希望NS-3的開發者遵守下面幾條規則:
l 基於GNU GPLv2兼容性的開放源碼許可
l Src/contrib. 目錄(我們會保留您共享的代碼)
l 開放的錯誤追蹤器(bug tracker)
我們也意識到,如果您正在讀本教程,對NS-3項目的共享或許還不在您當前最關心的事,但是我們希望您知道,“共享”是NS-3項目的靈魂。即使是給我們寫一個關於您使用NS-3的經驗便條(例如:“這個教程的章節條理不夠清晰”),通知某些文檔已過時等等,我們將會感激之至。
1.3 教程內容組織
本指南假定新用戶可能會順着以下思路瞭解NS-3:
l 嘗試下載和編譯NS-3
l 嘗試運行幾個簡單的示例程序
l 查看仿真結果並試圖調整仿真
因此,我們將大體按照這個順序來組織本教程。
2 資源 http://www.nsnam.org/docs/release/tutorial/tutorial_5.html#Resources
2.1 網絡資源
NS-3用戶有必要知道幾個重要的網站:
2.2 源碼管理系統Mercurial
複雜的軟件系統需要一種途徑,用於管理和組織對現有代碼和文檔的修改。有很多種方法可以實現這種管理,讀者可能已聽說過某些版本控制軟件,CVS(Concurrent Version System)或許是其中最常見的一個。
NS-3項目採用Mercurial系統作爲它的源碼管理系統。儘管讀者在閱讀本教程時不需要知道太多的Mercurial相關知識,但我們建議讀者能夠熟悉Mercurial,並用於查看 NS-3源碼。Mercurial的網址爲http://www.selenic.com/mercurial/,讀者可以從上面獲取到這個軟件配置管理系統(Software Configuration management, SCM)的二進制程序和源碼。Mercurial的開發者Selenic提供了一個Mercurial教程,網址爲http://www.selenic.com/mercurial/wiki/index.cgi/Tutorial/,以及快速入門指南:http://www.selenic.com/mercurial/wiki/index.cgi/QuickStart/ .
在NS-3的主頁上,讀者也可以獲取到有關Mercurial和NS-3配合使用的最常用信息。
2.3 編譯系統Waf
讀者下載NS-3的源碼到本地系統之後,需要對源碼進行編譯來生成可執行程序。正如源碼管理方式多種多樣,編譯源碼也有多種工具。最常用的工具是make. Make最出名的一點:它可能是編譯大型和高可配置型系統最難的一種方法。因此,有很多替代工具被開發出來。最近,大型高可配置系統的編譯工具大多選擇用Python語言來開發。
NS-3的編譯系統採用了Waf。它是用Python開發的新一代編譯管理系統。讀者不必掌握python,即可編譯現有的NS-3項目。如果讀者想要擴展現有的NS-3系統,大多數情況只需瞭解Python知識的很少且非常直觀的一個子集。
2.4 開發環境
正如以上所述,NS-3的腳本由C++或者Python編寫。從NS-3.2開始,NS3的API提供了python語言接口,但是所有的模塊都是由C++編寫的。這裏,我們假定讀者掌握C++知識和了解面向對象的相關概念。我們將在用到一些高級的概念或者讀者可能不熟悉的語言特性、習慣用語或設計模式時適當地花些時間複習它們。但是我們也不希望本教程變成C++教程,所以我們希望讀者能夠掌握基本的C++命令。在網站上和書籍中,你可以找到無數的關於C++知識的信息。
NS-3系統開發過程中使用了許多的GNU 工具鏈(toolchain)組件。所謂軟件的工具鏈是指在給定環境中可用編程工具的集合。如果讀者想要快速地瞭解一下GNU 工具鏈所包含的內容,請瀏覽http://en.wikipedia.org/wiki/GNU_toolchain . NS-3使用gcc,GNU binutils,以及gdb. 但是,我們並不使用GNU編譯系統工具(build system tools),既不用make,也不用autotools,而是使用Waf來作爲編譯管理工具。
通常,NS-3使用者的工作環境爲Linux或者類Linux系統。對於Windows環境,有幾種可以不同程度模擬Linux環境的軟件,比如Cygwin。NS-3支持在Cygwin環境下的開發。Windows用戶可以瀏覽http://www.cygwin.com/ 獲取該軟件(雖然有許多工程維護者使用MinGW,但是MinGW現在還沒有得到官方支持)。Cygwin可以提供許多流行的Linux系統命令。但是,某些情況下它也會出現問題,因爲它畢竟只是Linux系統的模擬。Cygwin和Windows中其他程序的交互也有可能會導致程序出現問題。
搜索Logitech並閱讀FAQ條目:“爲什麼當我編譯源碼時,make經常崩潰,留下一個sh.exe.stackdump文件”。無論您相信與否,當運行Logitech時,Logitech 進程監視器潛入了每個正在系統中運行的動態連接庫(DLL)當中。它可能導致您的Cygwin或者MinGw的動態連接庫奇怪地中止,常常也會阻止調試器的運行。所以當運行Cygwin的時候,一定要小心您的Logitech軟件。
替代Cygwin的一種選擇是安裝虛擬機,比如在VMware上安裝Linux虛擬機。
2.5 套接字編程
我們假定讀者對本教程所舉例子中的Berkeley套接字API 基本熟悉。如果您不瞭解套接字,我們建議您學習一下這些API 和一些常見的使用例程。TCP /IP Sockets in C這本書可以幫助您很好地理解TCP /IP套接字。
如果讀者理解了該書中的前四章(如果讀者沒有這本書的話,可以看上面網站中的源代碼),您會更好的理解本教程的內容。這裏還有一本關於多播套接字(Multicast Sockets)的書籍(Multicast Sockets, Makofske and Almeroth)。如果您想學習本書中有關多播的例子,該書裏面有些資料您可能需要了解。