/ NETWORK

네트워크 시뮬레이터 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

1

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-profileoptimized가 아닌 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-assertsbuild.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를 전달하려면 위와 같이 입력하면 된다.


참고 문헌

  1. 최신 버전이 업데이트되면 URL이 바뀔 수 있다.