## ns-3介紹
[ns-3](https://www.nsnam.org/) 是一個離散事件網路模擬器,主要用於研究和教育用途。它是一個開源軟體,目標是建立一個開放的網路模擬環境。
你可以在其中模擬各種網路場景,例如:
* 不同的網路拓撲結構(例如:星狀、網狀、樹狀)
* 不同的網路協定(例如:TCP、UDP、IP)
* 不同的網路流量模式
* 無線網路環境
* 網路效能評估
### 1. ns-3 的核心概念:
* **節點 (Node):** 代表網路中的裝置,例如電腦、路由器、交換器等。每個節點可以擁有多個網路介面。
* **網路介面 (NetDevice):** 連接節點到通道的介面卡。不同的網路技術(例如乙太網路、Wi-Fi)有不同的網路介面。
* **通道 (Channel):** 節點之間通訊的媒介。通道定義了資料如何在節點之間傳輸,例如有線或無線通道。
* **協定 (Protocol):** 定義了網路通訊的規則,例如 TCP、UDP、IP 等。ns-3 提供了豐富的協定庫,也允許使用者自行定義新的協定。
* **應用程式 (Application):** 在節點上執行的程式,負責產生和接收網路流量。例如,網頁瀏覽器或檔案傳輸程式。
* **封包 (Packet):** 在網路中傳輸的資料單位。
* **事件 (Event):** ns-3 使用離散事件模擬,模擬的進行基於事件的發生和處理。每個事件都有一個時間戳記。
* **助手 (Helper):** 提供簡化設定的工具類別,例如協助建立節點、通道、協定和應用程式。
### 2. ns-3 的架構:
ns-3 採用模組化和物件導向的設計,使其具有高度的靈活性和可擴充性。其主要組件包括:
* **核心 (Core):** 提供基本的模擬功能,例如事件排程、記憶體管理等。
* **網路 (Network):** 包含節點、通道、網路介面等網路拓撲的相關類別。
* **協定 (Protocols):** 實作各種網路協定,例如 TCP/IP、UDP、IPv6 等。
* **應用程式 (Applications):** 提供各種網路應用程式,例如流量產生器、客戶端/伺服器應用程式等。
* **統計 (Statistics):** 提供收集和分析模擬結果的工具。
### 3. 使用 ns-3 的基本流程:
1. **建立模擬物件:** 使用助手類別或直接建立物件,設定模擬環境,例如建立節點、通道、協定等。
2. **配置節點和通道:** 將節點連接到通道,並配置節點的 IP 位址、路由等。
3. **安裝協定和應用程式:** 在節點上安裝所需的協定和應用程式。
4. **設定模擬時間:** 設定模擬的總時間。
5. **執行模擬:** 啟動模擬。
6. **收集和分析結果:** 使用追蹤檔案或統計工具收集模擬結果,並進行分析。
## ns-3 mac安裝指南
### 前置作業
1. Homebrew
```bash
# 安裝 Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 設定 Homebrew 的環境變數
(echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> $HOME/.zprofile
```
2. Xcode
```bash
xcode-select --install # 安裝xcode
```
3. Python3: 從官網下載
4. 安裝必要的套件
```bash
brew install cmake ninja gnuplot ccache
```
這個命令會安裝:
- cmake:編譯工具
- ninja:構建系統
- gnuplot:繪圖工具
- ccache:編譯快取工具
### 安裝ns-3 (需使用ns-3.42)
1. 安裝 wget 並下載 ns-3:
```bash
brew install wget
wget https://www.nsnam.org/releases/ns-allinone-3.42.tar.bz2
```
2. 解壓並安裝 ns3:
```bash
tar jxvf ns-allinone-3.42.tar.bz2 # 解壓檔案
cd ns-allinone-3.42/ # 進入目錄
./build.py --enable-examples --enable-tests # 開始編譯安裝
```
3. 測試安裝是否成功:
```bash
cd ns-3.42/
./ns3 run hello-simulator # 運行測試程式
./ns3 run first # 運行第一個範例
./ns3 run second # 運行第二個範例
```
### 安裝5G-LENA
5G-LENA 是一個基於 ns-3 平台開發的外接模組,主要是用來模擬 5G NR 環境。
1. 安裝 NR module
```bash
cd contrib
git clone https://gitlab.com/cttc-lena/nr.git
cd nr
git checkout -b 5g-lena-v3.3.y origin/5g-lena-v3.3.y
```
2. 編譯專案
```bash
# 回到 ns-3 目錄
cd ../..
./ns3 configure --enable-examples --enable-tests
./ns3 build
```
3. 結果顯示如下
```
Modules configured to be built:
antenna aodv applications
bridge buildings config-store
core csma csma-layout
dsdv dsr energy
flow-monitor internet internet-apps
lr-wpan lte mesh
mobility netanim network
nix-vector-routing nr olsr
point-to-point point-to-point-layout propagation
sixlowpan spectrum stats
test topology-read traffic-control
uan virtual-net-device wifi
wimax
Modules that cannot be built:
brite click fd-net-device
mpi openflow tap-bridge
visualizer
```
4. 運行 NR module 中的example腳本,確認是否正確構建
```bash
./ns3 run cttc-nr-demo
```
5. 目前ns-3和5G-LENA的版本對照
```
## ns-3 + nr installation
| nr version | ns-3 version | Build system | Release date |
| :------------: | :-----------:| :-----------: |--------------------|
| 5g-lena-v3.3.y | ns-3.42 | cmake | October 15, 2024 |
| 5g-lena-v3.2.y | ns-3.42 | cmake | September 25, 2024 |
| 5g-lena-v3.1.y | ns-3.42 | cmake | July 19, 2024 |
| 5g-lena-v3.0.y | ns-3.41 | cmake | February 16, 2024 |
| 5g-lena-v2.6.y | ns-3.40 | cmake | November 30, 2023 |
| 5g-lena-v2.5.y | ns-3.39 | cmake | July 26, 2023 |
| 5g-lena-v2.4.y | ns-3.38 | cmake | April 5, 2023 |
| 5g-lena-v2.3.y | ns-3.37 | cmake | November 23, 2022 |
| 5g-lena-v2.2.y | ns-3.36.1 | cmake | June 03, 2022 |
| 5g-lena-v2.1.y | ns-3.36 | cmake | May 06, 2022 |
| 5g-lena-v2.0.y | ns-3.36 | cmake | April 21, 2022 |
| 5g-lena-v1.3.y | ns-3.35 | waf | April 7, 2022 |
| 5g-lena-v1.2.y | ns-3-dev | waf | June 4, 2021 |
| 5g-lena-v1.1.y | ns-3-dev | waf | March 2, 2021 |
| 5g-lena-v1.0.y | ns-3-dev | waf | September 16, 2020 |
| 5g-lena-v0.4.y | ns-3-dev | waf | February 13 2020 |
| 5g-lena-v0.3.y | ns-3-dev | waf | August 27 2019 |
| 5g-lena-v0.2.y | ns-3-dev | waf | February 1 2019 |
```
### 安裝NetAnim (視覺化工具)
1. 首先安裝 Qt:
```bash
brew install qt
```
2. 建置步驟(Linux/Mac):
```bash
cd netanim-3.109 # 進入 netanim 目錄
qmake NetAnim.pro # 使用 qmake 產生 Makefile
make # 編譯
```
3. 執行方式:
```bash
./NetAnim
```
### 如何運行 ns-3 的單元測試:
運行測試的命令:
```bash
./test.py --no-build
```
關於這個命令:
- `--no-build` 參數表示直接運行測試,不重新編譯代碼
- 測試會並行執行,以節省時間
測試結果:
```bash
865 of 865 tests passed (865 passed, 0 skipped, 0 failed, 0 crashed, 0 valgrind errors
```
### 常見問題與解決方案
1. 找不到 C++ 標準庫文件(ostream、algorithm 等):
```bash
# 重新安裝 Command Line Tools
sudo rm -rf /Library/Developer/CommandLineTools
xcode-select --install
# 清理並重新配置 ns-3
cd ns-3.42
./ns3 clean
# 使用更明確的 C++ 標準庫設定進行配置
./ns3 configure --build-profile=debug -- -DCMAKE_CXX_FLAGS="-stdlib=libc++ -isystem /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1"
```
2.若在編譯 netanim 時遇到了編譯錯誤:
```
fatal error: 'type_traits' file not found
```
這個錯誤通常發生在 C++ 標準函式庫的標頭檔無法被正確定位。根據你的路徑顯示你使用的是 macOS 系統,並且是 arm64 架構,解決方案如下:
```bash
# 確保你已經正確安裝了 Xcode Command Line Tools
xcode-select --install
# 重新安裝 Qt
brew reinstall qt
# 確保 CPLUS_INCLUDE_PATH 包含正確的路徑
export CPLUS_INCLUDE_PATH="/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1:$CPLUS_INCLUDE_PATH"
# 重新編譯
qmake NetAnim.pro # 使用 qmake 產生 Makefile
make # 編譯
```
3. 若在編譯 netanim 時遇到了編譯錯誤,`make` 沒有找到需要編譯的目標。這可能是因為 `qmake` 沒有正確生成 Makefile。
```bash
# 首先清除之前的編譯文件
make clean
rm -rf Makefile
# 重新執行 qmake(使用忽略 SDK 版本警告的選項)
qmake NetAnim.pro CONFIG+=sdk_no_version_check
# 再次執行 make
make
```