네트워크 시뮬레이터 NS-3 설치
DES 및 NS-3 개요
NS-3는 C++로 작성된 오픈소스 discrete-event 네트워크 시뮬레이터(Discret-Event Simulator, DES)이다. 이때 discrete-event는 네트워크에서 패킷의 전송, 도착 등을 예로 들 수 있다.
DES의 기본적인 개념은 여러 entity의 집합으로 모델링되는 시스템의 표현이다. 각각의 entity는 여러 속성과 수행 가능한 action을 갖는다. 이러한 action들은 특정한 event에 의해 trigger된다. 시뮬레이션은 시간이 흐름에 따라 event들을 스케줄링하고, 관련된 action이 수행됨에 따라 진행된다.
네트워크 관점에서는 네트워크를 노드들과 link들의 집합으로 표현하여 DES를 모델로 이용할 수 있다. 네트워크 시뮬레이션을 통해 패킷 손실(loss), congestion, delay 등 네트워크의 다양한 현상을 분석할 수 있으며, 서로 다른 네트워크 디자인과 프로토콜들의 성능을 평가할 수 있다.
NS-3는 패킷 데이터 네트워크가 어떻게 동작하는지에 대한 모델을 제공하며, 네트워크 시뮬레이션을 위한 다양한 모듈을 제공하므로, 이를 이용해 네트워크 시뮬레이션을 구현할 수 있다. 주로 인터넷 프로토콜과 네트워크 동작에 대해 초점이 맞춰진 모델이 제공되고 있지만, NS-3의 기능은 인터넷 시스템에 제한되지 않고 non-Internet-based 시스템에도 활용할 수 있다.
소스코드 다운로드
NS-3는 소스코드의 형태로만 배포되고 있다. NS-3의 유저들은 소스코드를 수정한 후 직접 빌드하여 사용하는 경우가 일반적이기 때문에, 아직 pre-built된 프로그램의 형태로는 배포하지 않고 있다고 한다.
그리고 Linux 및 macOS 환경만 공식 지원하고 있으므로, 네이티브 Windows에서는 WSL 등으로 Linux 환경을 준비하지 않는 한 사용 불가하다.
공식 문서에서는 세 가지 설치 방법을 소개하고 있다.
공식 웹사이트에서 소스 압축 파일 다운로드
cd
mkdir workspace
cd workspace
wget https://www.nsnam.org/release/ns-allinone-3.37.tar.bz2
tar xjf ns-allinone-3.37.tar.bz2
Git repository를 통해 다운로드
git clone https://gitlab.com/nsnam/ns-3-allinone.git
git repository를 clone하면 소스코드 압축 파일을 다운로드 받았을 때와 달리 폴더 내에 download.py
가 존재한다. download.py
를 그냥 실행하면 최신 개발 snapshot을 받을 수 있고, -n
플래그와 ns-<릴리즈 버전>
을 명시함으로써 특정한 릴리즈 버전을 받을 수도 있다.
download.py
를 실행하고 나면 ns-3, bake, pybindgen, 그리고 netanim 등 추가적인 repository가 다운로드 된다.
Bake를 이용해 다운로드
Bake는 여러 개의 repository로부터 하나의 소프트웨어를 빌드할 수 있는 도구이며, ns-3 프로젝트를 위해 개발되었다고 한다. ns-3 소프트웨어의 개발자 버전을 받을 수 있고, ns-3에 대한 다양한 extension (ns-3 “apps”) 을 다운로드 및 빌드할 수 있는 기능을 제공한다. ns-3에 다양한 기능을 추가하여 사용할 것이 예상된다면, 이 설치 경로가 권장된다.
최근 릴리즈에서는 공식 웹페이지의 소스 코드 압축파일에도 bake가 기본 제공된다. 해당 릴리즈 버전에 포함된 설정 파일(bakeconf.xml
)은 해당 릴리즈가 제공된 시점에서 가장 최신 버전의 소프트웨어들을 다운받을 수 있도록 되어 있다. 해당 릴리즈 파일이 제공된 시점보다 더 최신의 소프트웨어를 사용하기 위해서는 bakeconf.xml
을 업데이트해야 한다.
bake를 이용해 ns-3을 다운로드받기에 앞서, 다음과 같이 환경 변수를 설정해야 한다.
export BAKE_HOME=<bake 폴더>
export PATH=$PATH:$BAKE_HOME/build/bin
export PYTHONPATH=$BAKE_HOME/build/lib
export LD_LIBRARY_PATH=$BAKE_HOME/build/lib
이제 bake 폴더에서 다음 명령어를 실행한다.
./bake.py configure -e ns-allinone-3.37
다운 가능한 ns-3 버전에는 여러 선택지가 있는데, 이 글에서는 ns-allinone-3.37
을 선택하였다.
./bake.py check
이제 위 명령어를 통해 필요한 도구들이 모두 갖춰졌는지 체크한다.
ns-3의 소스코드는 source
디렉토리에 다운로드된다.
빌드
빌드에도 여러 가지 방식이 있는데, 대부분의 유저는 CMake
에 대한 ns3 wrapper를 사용하게 될 것이라고 한다.
build.py
로 빌드
이 방식은 소스 코드 압축 파일을 통해 다운로드 받았을 때에만 이용 가능하다.
allinone
버전에 포함된 이 build.py
스크립트를 이용해 빌드하면 가장 일반적인 설정으로 간편하게 ns-3 도구를 이용할 수 있다. 그러나 고급 설정으로 ns-3를 이용하려면 CMake를 이용하는 것이 좋다고 한다.
./build.py --enable-examples --enable-tests
공식 튜토리얼에서는 기본 제공되는 예제와 test들을 이용하므로 위 argument를 명시하여 빌드하였다.
bake
로 빌드
bake로 소스 코드를 fetch한 이후,
./bake.py build
위 명령어로 빌드할 수 있다.
빌드 실패 여부나 누락된 dependency에 대해 확인하려면, 다음 명령어를 입력하면 된다.
./bake.py show
ns3 CMake
wrapper로 빌드
위 빌드 툴들은 최상위 디렉토리 아래에 위치한 ns-3.버전명
폴더에서 CMake 빌드 도구를 호출한다. CMake wrapper를 이용하기 위해서는 해당 ns-3.버전명
폴더로 working directory를 변경해야 한다.
해당 폴더 아래에는 ns3
이라는 이름의 프로그램이 있다. 먼저, 다음과 같은 명령어를 입력하여 예제와 test들을 포함하는 최적화된 빌드로 설정할 수 있다.
./ns3 clean
$ ./ns3 configure --build-profile=optimized --enable-examples --enable-tests
build-profile
은 optimized
가 아닌 debug
로 설정할 수도 있다.
권장사항은 먼저 debug
빌드로 시나리오를 개발한 뒤, 반복적인 실행(통계 및 parameter 변경 등) 시에는 optimzed
빌드 프로필을 이용하는 것이라고 한다.
위 명령어를 실행하면 다음과 같은 출력 결과를 볼 수 있다.
$ ./ns3 configure --build-profile=optimized --enable-examples --enable-tests
-- CCache is enabled. Precompiled headers are disabled by default.
-- The CXX compiler identification is GNU 11.2.0
-- The C compiler identification is GNU 11.2.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Using default output directory /mnt/dev/tools/source/ns-3-dev/build
-- Found GTK3_GTK: /usr/lib/x86_64-linux-gnu/libgtk-3.so
-- GTK3 was found.
-- LibXML2 was found.
-- LibRT was found.
-- Visualizer requires Python bindings
-- Found Boost: /usr/lib/x86_64-linux-gnu/cmake/Boost-1.74.0/BoostConfig.cmake (found version "1.74.0")
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.2")
-- GSL was found.
-- Found Sphinx: /usr/bin/sphinx-build
-- Looking for sys/types.h
-- Looking for sys/types.h - found
-- Looking for stdint.h
-- Looking for stdint.h - found
-- Looking for stddef.h
-- Looking for stddef.h - found
-- Check size of long long
-- Check size of long long - done
-- Check size of int128_t
-- Check size of int128_t - failed
-- Check size of __int128_t
-- Check size of __int128_t - done
-- Performing Test has_hash___int128_t
-- Performing Test has_hash___int128_t - Success
-- Check size of unsigned long long
-- Check size of unsigned long long - done
-- Check size of uint128_t
-- Check size of uint128_t - failed
-- Check size of __uint128_t
-- Check size of __uint128_t - done
-- Performing Test has_hash___uint128_t
-- Performing Test has_hash___uint128_t - Success
-- Looking for C++ include inttypes.h
-- Looking for C++ include inttypes.h - found
-- Looking for C++ include stat.h
-- Looking for C++ include stat.h - not found
-- Looking for C++ include dirent.h
-- Looking for C++ include dirent.h - found
-- Looking for C++ include stdlib.h
-- Looking for C++ include stdlib.h - found
-- Looking for C++ include signal.h
-- Looking for C++ include signal.h - found
-- Looking for C++ include netpacket/packet.h
-- Looking for C++ include netpacket/packet.h - found
-- Looking for getenv
-- Looking for getenv - found
-- Processing src/antenna
-- Processing src/aodv
-- Processing src/applications
-- Processing src/bridge
-- Processing src/brite
-- Brite was not found
-- Processing src/buildings
-- Processing src/click
-- Click was not found
-- Processing src/config-store
-- Processing src/core
-- Looking for C++ include boost/units/quantity.hpp
-- Looking for C++ include boost/units/quantity.hpp - found
-- Looking for C++ include boost/units/systems/si.hpp
-- Looking for C++ include boost/units/systems/si.hpp - found
-- Boost Units have been found.
-- Processing src/csma
-- Processing src/csma-layout
-- Processing src/dsdv
-- Processing src/dsr
-- Processing src/energy
-- Processing src/fd-net-device
-- Looking for C++ include net/ethernet.h
-- Looking for C++ include net/ethernet.h - found
-- Looking for C++ include netpacket/packet.h
-- Looking for C++ include netpacket/packet.h - found
-- Looking for C++ include net/if.h
-- Looking for C++ include net/if.h - found
-- Looking for C++ include linux/if_tun.h
-- Looking for C++ include linux/if_tun.h - found
-- Looking for C++ include net/netmap_user.h
-- Looking for C++ include net/netmap_user.h - not found
-- Looking for C++ include sys/ioctl.h
-- Looking for C++ include sys/ioctl.h - found
-- Checking for module 'libdpdk'
-- No package 'libdpdk' found
-- Processing src/flow-monitor
-- Processing src/internet
-- Processing src/internet-apps
-- Processing src/lr-wpan
-- Processing src/lte
-- Processing src/mesh
-- Processing src/mobility
-- Processing src/netanim
-- Processing src/network
-- Processing src/nix-vector-routing
-- Processing src/olsr
-- Processing src/openflow
-- Openflow was not found
-- Processing src/point-to-point
-- Processing src/point-to-point-layout
-- Processing src/propagation
-- Processing src/sixlowpan
-- Processing src/spectrum
-- Processing src/stats
-- Processing src/tap-bridge
-- Processing src/test
-- Processing src/topology-read
-- Processing src/traffic-control
-- Processing src/uan
-- Processing src/virtual-net-device
-- Processing src/wave
-- Processing src/wifi
-- Processing src/wimax
-- ---- Summary of optional NS-3 features:
Build profile : optimized
Build directory : /mnt/dev/tools/source/ns-3-dev/build
BRITE Integration : OFF (missing dependency)
DES Metrics event collection : OFF (not requested)
DPDK NetDevice : OFF (missing dependency)
Emulation FdNetDevice : ON
Examples : ON
File descriptor NetDevice : ON
GNU Scientific Library (GSL) : ON
GtkConfigStore : ON
MPI Support : OFF (not requested)
NS-3 Click Integration : OFF (missing dependency)
NS-3 OpenFlow Integration : OFF (missing dependency)
Netmap emulation FdNetDevice : OFF (missing dependency)
PyViz visualizer : OFF (missing dependency)
Python Bindings : OFF (not requested)
Real Time Simulator : ON
SQLite stats support : ON
Tap Bridge : ON
Tap FdNetDevice : ON
Tests : ON
Modules configured to be 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 netanim
network nix-vector-routing olsr
point-to-point point-to-point-layout propagation
sixlowpan spectrum stats
tap-bridge test topology-read
traffic-control uan virtual-net-device
wave wifi wimax
Modules that cannot be built:
brite click mpi
openflow visualizer
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/dev/tools/source/ns-3-dev/cmake-cache
Finished executing the following commands:
mkdir cmake-cache
cd cmake-cache; /usr/bin/cmake -DCMAKE_BUILD_TYPE=release -DNS3_NATIVE_OPTIMIZATIONS=ON -DNS3_EXAMPLES=ON -DNS3_TESTS=ON -G Unix Makefiles .. ; cd ..
ns-3에서 기본적으로 비활성화되었거나 시스템의 지원을 필요로 하는 옵션은 OFF (not requested)
로 표시된다.
그리고, 서드 파티 라이브러리를 필요로 하는 옵션 중 상응하는 라이브러리가 발견되지 않은 경우 OFF(missing dependency)
로 표시된다.
위와 같이 옵션들의 활성화 여부를 다시 출력하려면 ns3의 show config
옵션을 사용하면 된다.
그리고, 설정이 완료된 프로젝트의 build-profile
을 보기 위해서는 다음 명령어를 입력하면 된다.
./ns3 show profile
./ns3 build
위 명령어로 빌드를 시작할 수 있다.
한편 configure
시에만 설정 가능한 옵션이 있고, build
time에만 설정 가능한 옵션이 있으므로 주의해야 한다. ./ns3 --help
를 통해 확인할 수 있다.
빌드 결과물은 기본값으로 build
폴더 내에 생성된다. configure
시 --out=<경로명>
으로 저장 경로를 변경할 수 있다.
$ ./ns3 configure --build-profile=debug --out=build/debug
$ ./ns3 build
...
$ ./ns3 configure --build-profile=optimized --out=build/optimized
$ ./ns3 build
...
build.py
에서는 ns3
의 일부 빌드 옵션을 지원하지 않으나, 다음과 같이 추가로 --
를 붙여 ns3
를 통해 옵션을 설정하도록 할 수 있다.
./build.py -- --enable-asserts
예를 들면, enable-asserts
는 build.py
에서 지원하지 않는 옵션이므로 위와 같이 --
를 붙여 ns3
을 통해 옵션을 설정하도록 해야 한다.
설치
build
폴더 밖에서도 ns-3를 실행할 수 있도록 /usr/local/
하위에 ns-3를 설치하려면 다음과 같이 입력한다.
sudo ./ns3 install
기본 설치 경로에 접근하기 위해선 루트권한이 필요하므로 일반적으로 sudo
로 명령어를 실행한다.
대부분의 경우 설치까지는 굳이 필요 없다.
빌드 테스트
./test.py --no-build
test.py
를 실행하여 빌드가 정상적으로 이루어졌는지 테스트 가능하다.
스크립트 실행
./ns3 run hello-simulator
이제 드디어 ns-3로 직접 시뮬레이션 스크립트들을 실행 가능하다.
위 명령어는 ns-3
폴더 하위의 examples/tutorial/hello-simulator.cc
에 대응되는 hello-simulator
라는 프로그램을 ns-3로 실행시킨 것이다. 빌드에서 사용한 ns3
실행 파일을 그대로 사용한다.
./ns3 run <ns3-program> --command-template="%s <args>"
실행 시 프로그램 argument를 전달하려면 위와 같이 입력하면 된다.
참고 문헌
-
최신 버전이 업데이트되면 URL이 바뀔 수 있다. ↩