반응형

네트워크 시뮬레이터로로 예전부터 1년반쯤 전까지는 QualNet을 써 오다가, 작년부터는 줄곧 ns-3만 쓰고 있는데, 둘 사이에 장단점을 간단히 비교해 볼 수 있을 것 같았다.


주의사항: 주관적인 관점이라서 다른 사용자 입장에서는 의견이 다를 수 있음.




<비용>

QualNet : ns-3 (압승)


*QualNet

 - 대학교에서 University license로 기본 라이브러리만 구매하면 약 1000만원

 - 기본 제공이 안되는 라이브러리 추가 시 약 100~250만원 정도 예상 (LTE, Zigbee 같은 것들이 여기에 해당 ㅜㅜ)

 - 한 번 라이선스 구입하면 무제한 사용

 - 대신 버전 업그레이드 기간에는 제한이 있음. 문제는 시간이 지날 수록 최신 버전을 써야 할 필요가 생긴다는 것. 2010년쯤에 구입했던 5.1 버전에는 기본 제공하는 와이파이 표준이 802.11a/b/g 밖에 없어서 802.11n이나 ac를 테스트할 수가 없었다. 구 버전 사용자가 최신 버전을 쓰려면 본사에 1000달러를 내면 된다고 한다.

 - 멀티코어를 잘 지원해서 시뮬레이션 성능을 높일 수는 있는데, 라이선스 하나에 코어 2개가 최대임. 코어 수 늘리려면 라이선스 더 사야 함(...)


*ns-3

 - 무료 (오픈소스)

 - 버전 업그레이드 되면 그냥 새로 다운받아서 쓰면 됨

 - 오픈소스라서 실시간으로 수정되는 코드를 버전 관리 시스템에서 바로 받아쓸 수도 있다. (물론 그만큼 버그에는 취약. 공식 릴리즈 공지되는 버전만 써도 무방)




<그래픽 유저 인터페이스(GUI)>


QualNet (압승) : ns-3


*QualNet

 - ns-3에 비해 월등히 좋음.

 - 마우스 클릭만 가지고 가장 기본적인 시뮬레이션 실행이 가능한 수준 ㄷㄷ.

 - 파워포인트에서 도형 배치하고 선 긋듯이 노드들 배치하고, 트래픽은 보내는 곳과 받는 곳 사이에 선을 drag & drop으로 죽 그어 주면 만들어짐. 그 선을 더블클릭해서 패킷 사이즈, 보내는 양, 시작시간 등등 다 설정하면 됨. 각 노드도 더블클릭해서 각각의 네트워크 인터페이스, 프로토콜, IP주소, 그외 각종 설정들 다 바꿀 수 있음.

 - 그림 그리기(?)를 끝내고 시뮬레이션 시작(play 버튼)을 누르면 노드와 노드 사이에 패킷 전달되는 과정, 노드의 움직임, 무선일 경우에는 전송 범위까지 실시간으로 시뮬레이션 시간에 맞춰서 다 표시됨. 보여주는 정보의 종류를 조정할 수 있고, 재생되는 속도도 조정 가능. (물론 최고속도는 컴퓨터의 하드웨어 성능에 비례함)

 - 시뮬레이션 끝나면 결과를 그래프로 볼 수 있는데, L1/L2/L3/L4/어플리케이션 계층 각각에 대해서 통계치를 다 볼 수 있음. 예를 들어 PHY 계층에서 signal 발생시킨 수와 에러율 확인, MAC 계층에서 프레임 전송 수와 실패 재전송 수, 라우팅 계층의 경로 탐색 시도 수, 응용 계층에서의 실제 throughput 이 모든 것을 모든 노드에 대해서 다 확인 가능.

 - 물론 GUI만으로 논문 실험에 쓸 만한 자기만의 방법을 설정해줄 수는 없고, 그 부분은 어쩔 수 없이 코드 수정을 해야 함.


*ns-3

 - GUI가 큰 의미가 없음 (...)

 - 애초에 ns-3에는 시뮬레이션 환경 자체를 설정하는 GUI가 존재하지 않음.

 - C++ 코드로 일단 뭐가 됐든 시뮬레이션을 돌려 본 뒤에야 자신이 만든 네트워크 토폴로지가 어떻게 생겼는지 GUI에서 확인 가능. 왜냐하면 ns-3에서 제공하는 NetAnim 이라는 GUI는 실시간으로 시뮬레이션을 시각화하는 것이 아니고, 시뮬레이션 결과 파일을 읽어들여서 재생하는 역할이기 때문. (스타크래프트의 지난 경기 리플레이로 보는 것과 차이가 없음)

 - 앞으로도 눈으로 보는 대로 시뮬레이션 환경을 만들 수 있도록 돕는 GUI가 나올 확률은 낮음. ㅜㅜ 왜냐하면 퀄넷은 시뮬레이션 환경 자체는 별도의 스크립트 파일로 처리하고, 실제 L1/L2/L3/L4 계층의 행동은 C/C++ 코드로 처리하기 때문에 GUI에서 스크립트 파일을 만들어 주는 것이 가능한 반면에, ns-3는 그냥 모두 다 C++로 코딩해야 되기 때문에.

 - 그나마 ns-3 입장에서 위안이 되는 점은, 토폴로지를 눈으로 확인할 필요가 없고 환경을 조금씩 바꾸면서 수많은 반복 실험을 해야할 때가 되면 GUI를 쓸 필요 없이 커맨드 라인에서 배치(batch)를 돌리게 되니까 퀄넷이나 ns-3나 별 차이가 없게 될 것이라는 점. (퍽이나 ㅠㅠ)




<시뮬레이션 성능(scalability, running time 측면)>


QualNet (우세) : ns-3


*QualNet

 - 애초에 퀄넷이 처음부터 내세우는 장점이 scalability이고, 기본적으로 모든 코드에 MPI 적용이 되도록 만들었기 때문에 (사용자가 새로 만드는 코드까지 전부) 멀티 프로세서 지원의 편의 측면에서 ns-3를 압도함.

 - QualNet 판매하는 회사 이름도 심지어 Scalable Networks임 (...)

 - GUI에서는 시뮬레이션 시작 버튼 옆에 프로세서 개수 칸이 있는데 그냥 숫자 써주면 끝.

 - 커맨드 라인에서는 "-mp 2"라고 쓰면 알아서 듀얼코어 써서 돌림.

 - 그냥 싱글코어로 돌려도 꽤 빠른 편임.

 - 다만 GUI에서 실시간으로 시뮬레이션 진행 중인 애니메이션 화면을 봐 가면서 실행하면 당연히 느림. (...) GUI에서 눈으로 확인이 되었으면 커맨드 라인에서 돌려야 함.

 - 유일한 단점이 있다면, 코어 개수도 현질을 해야 3개 이상 쓸 수 있다는 점.

 - 또한 라이선스 때문에 한번에 여러 머신에서 여러 프로세스를 돌리는 것이 불가능함. (라이선스 서버 1개가 라이선스 1개를 프로세스 1개에 할당하는 방식이고, 그 동안에는 다른 프로세스가 실행될 수 없는 구조 ㅠㅠ 동시에 여러 머신에서 시뮬레이션을 돌리려면 머신 개수만큼 라이선스가 있어야 함.)


*ns-3

 - ns-3도 퀄넷처럼 이벤트 기반 처리 방식으로 시뮬레이션을 실행하고, MPI 라이브러리를 통해서 멀티코어를 사용할 수 있기 때문에, 구조적인 측면에서는 퀄넷과 큰 차이가 없음. 하지만 사용의 편의가 떨어지는 게 문제.

 - ns-3에서 멀티코어를 쓰려면 사용자가 수동으로 mpi 관련 라이브러리를 미리 설치해야 하고, 자신의 시뮬레이션 코드에 MPI를 쓰겠다는 설정을 또 별도로 작성해 줘야 함. 단순히 argument에 숫자 추가만 하면 되는 QualNet에 비해 쓰기 어려울 수밖에 없음. (인터넷에도 MPI 적용이 안돼서 질문하는 글이 많음)

 - 모든 코드가 다 MPI가 되는 것도 아님. 특히 와이파이 같은 무선 쪽은 MPI가 아직 안돼서 무조건 싱글코어로 돌려야 함. 이게 특히 심각해지는 부분이 ns-3가 가상 머신들을 연동해서 돌아갈 때.


 - 다만 ns-3가 퀄넷에 비해 유리한 상황이 있기는 한데, 똑같은 시뮬레이션 인스턴스를 1개가 아니라 조건이 조금씩 다른 수백~수천 개의 시나리오를 순차적으로 처리해야 할 때. 퀄넷은 라이선스 1개당 1개 프로세스만 존재할 수 있지만, ns-3는 오픈소스니까 그런 거 없다. 원하는 만큼 클러스터에 복제해서 원하는 만큼 얼마든지 프로세스를 돌릴 수 있음. 즉, 개별 시뮬레이션 처리 시간이 오래 걸리는 문제를 동시에 여러 머신과 프로세스를 써서 얼마든지 전체 시뮬레이션 시간을 줄일 수 있음.




<외부 프로그램과의 확장성>


QualNet : ns-3 (우세)


*QualNet

 - 외부 프로그램에서 패킷을 만들어서 퀄넷의 시뮬레이션 네트워크에 주입하는 것이 가능한데, 방법이 편하지 않음. 외부 프로그램과 퀄넷 사이에 패킷을 서로 전달해 주는 코드를 하나 더 만들어야 함. (이것도 C언어로)


*ns-3

 - 리눅스 컨테이너(lxc)를 써서 VM을 만들어서 그 VM들 사이의 네트워크를 ns-3가 시뮬레이션할 수 있음!!

 - ns-3 시뮬레이션 코드 위에 아예 실제로 작동하는 프로그램 소스코드를 그대로 컴파일해서 돌리는 것(Direct Code Execution; DCE)도 가능!!


 - 그러나 위 2개 다 아직 한계가 있음 ㅠㅠ

 - VM 방식은 호스트 머신(리눅스)에 브릿지 인터페이스에 tap을 붙여서 ns-3와 연결되는데, 여기서 약간씩 딜레이가 발생함. VM들은 자기들만의 clock을 갖고 있는데 ns-3에 약간이나마 늦게 패킷이 흘러들어오면 그걸 ns-3 프로세스가 시뮬레이션으로 처리하고 다시 VM들에게 돌려주는 과정에서 각 VM은 이미 자기 시간이 흘러가고 있음. 결국 실제 환경에 비해서 delay가 커질 수밖에 없는 구조.

 - 게다가 설상가상으로, 와이파이 같은 무선 네트워크 환경에 저렇게 VM을 붙이면 ns-3가 아직(2017.04.15 기준) 무선 환경을 멀티코어로 처리하지 못하기 때문에 무선 환경의 신호 세기, 간섭, fading, propagation 이런 것들을 다 싱글코어에서 계산해야 됨(......)

 - 그래서 VM 10개를 만들고 와이파이 애드혹 네트워크를 시뮬레이션했더니, 각자 1초에 하나씩 hello 메세지를 broadcast하기만 하는데도 그 상태로 ping을 날리면 20초가 넘어가는(...) 도저히 실험 불가능한 상태가 됨. 지못미 ㅠㅠ

 - VM에 대한 대안으로 나온 것이 DCE인데, 이것도 사실 C++로 개발된 프로그램만 취급함. C++ 소스코드를 가져와서 ns-3에서 호환될 수 있게 g++ 옵션을 조금 추가해서 빌드하면 되는데, 그렇다고 모든 시중의 C++ 프로그램이 다 빌드되는 것도 아님. ns-3 커뮤니티 얘네들은 자랑스럽게 iperf를 소스코드 수정 없이 그대로 빌드해서 갖다쓸 수 있다고 자랑하는데, tcpdump 같이 더 심각한 일을 하는 소스코드는 아예 컴파일 불가능 ㅜㅜ

 - 내가 직접 소켓 프로그래밍으로 C++ 프로그램을 만들어서 돌리려고 해도 생각보다 지원 안되는 코드가 많아서 코딩에도 제약이 있음. 이게 뭐야...


 - 결론적으로, 분명히 확장성이 좋아 보이는데 결국 실제로 제대로 써 보려고 달려들면 퀄넷이나 ns-3나 안되는 건 마찬가지임 ㅠㅠ




<통계(Statistics)>


QualNet : ns-3 (무승부)


시뮬레이션 결과에 대한 통계를 내 주는 부분은 양쪽 다 방식도 다르고 장단점도 분명해서 어느 한 쪽이 유리하다고 볼 수는 없다.


*QualNet

 - 위의 GUI 부분에도 언급되어 있듯이, 물리 계층부터 응용 계층까지 각 계층에서 낼 수 있는 모든 통계를 항상 만들어 줌. GUI에서 그래프를 그려줄 때 참고하는 파일이 .stat 파일이고, 시뮬레이션 1개를 실행하고 나면 자동으로 생성되기 때문에 이 .stat 파일을 직접 파싱해서 원하는 통계치를 계산하는 것도 가능.

 - 모든 계층에 대한 통계가 다 나오는 점이 의외로 디버그에 유용할 때도 있음. 가령 응용 계층에서 패킷을 모두 전송 실패했는데 물리 계층에서 받는 signal이 분명히 기록되어 있다면 중간의 라우팅 계층 같은 부분에서 기대와 다르게 패킷을 drop했을 수 있으므로, 라우팅 계층의 logic을 살펴보는 식의 접근이 가능함.


*ns-3

 - 시뮬레이션 환경에서 생성하는 노드 각각에 대해서 .pcap 파일을 자동으로 만들도록 설정할 수 있는데 (코드에 pcap output을 만들어 달라고 1줄 추가하면 됨), 이 pcap 파일을 Wireshark에서 바로 보거나 그래프를 볼 수도 있고, tcpdump에서 약간의 규칙을 적용해서 원하는 정보를 원하는 포맷으로 만들어 쓸 수 있음.

 - pcap 파일을 기반으로 패킷을 분석하고 통계를 내는 부분은 오픈소스 도구들도 여럿 존재하기 때문에 퀄넷의 자체 포맷(stat)에 비해 유리한 점이 있음.




반응형
블로그 이미지

Bryan_

,
반응형

OS: Ubuntu 14.04.2 LTS (64-bit)

Eclipse: Eclipse IDE for C/C++ Developers, Mars Release (version 4.5.0)

QualNet: QualNet 5.0.1


QualNet 매뉴얼([QUALNET_HOME]/documentation 아래에 위치)에 보면 윈도우(Windows) 환경에서 MS Visual Studio와 연동해서 개발 환경을 구축하는 방법은 스크린샷과 함께 설명되어 있다.

리눅스 환경에서는 MS Visual Studio가 없는 대신 유명한 Eclipse가 있는데, Eclipse CDT와 연동하는 방법은 매뉴얼에 설명되어 있지 않다. (QualNet 5.2 이하 버전 기준)


그런데 Eclipse와 연동하는 방법이 의외로 간단해서 금방 설정할 수 있다. 자세한 방법은 일본어로 된 QualNet 관련 웹사이트(http://www33.atwiki.jp/ku240/pages/16.html)를 참고하였다.


0. 우선 gcc, g++ 등 C/C++ 컴파일러와 함께 QualNet이 설치되어 있어야 한다.

gcc, g++이 없으면 $ sudo apt-get install build-essential로 gcc, g++ 외에도 개발에 필요한 여러가지 도구와 라이브러리들을 한꺼번에 설치해 두면 편하다.



1. 최신 버전의 Eclipse C/C++을 다운로드 받고 설치한다. 다운로드 받은 압축파일을 적당한 곳에 압축만 풀어 두면 된다.

 - http://www.eclipse.org/downloads/

 - Eclipse IDE for C/C++ Developers

 


2. [QUALNET_HOME] 디렉토리에 가서 "Makefile" 이름의 텍스트 파일을 만들고 아래와 같이 작성한다.

all:

cd main; make -f Makefile

clean:

cd main; make clean -f Makefile

cd 글자 앞에는 반드시 탭문자(tab)를 써서 들여쓰기를 해야 한다.


참고로 [QUALNET_HOME]/main 디렉토리 밑에 gcc, glibc 버전과 32/64비트 여부에 따라 여러가지 Makefile이 구비되어 있으므로, 필요에 따라 구체적인 Makefile을 지정해도 된다. 예를 들면:

all:

cd main; make -f Makefile-linux-x86_64-glibc-2.3-gcc-4.0

clean:

cd main; make clean -f Makefile-linux-x86_64-glibc-2.3-gcc-4.0

cd 글자 앞에는 반드시 탭문자(tab)를 써서 들여쓰기를 해야 한다.



3. File > New > C++ Project 선택하고, 대화상자가 뜨면 아래와 같이 입력한다.

 - Project name: 원하는 이름으로 아무 거나

 - Location: QualNet이 설치된 디렉토리 (QUALNET_HOME의 위치)

 - Project type: Makefile project에서 Empty Project 선택

 - Toolchains: Linux GCC 선택




4. Finish 버튼을 누른다. 

Eclipse에서 초반에 소스코드 파일들 인덱싱을 하고 나면 개발환경이 완료된다. Project Explorer에서 방금 추가한 QualNet 프로젝트 이름에 마우스 오른쪽 버튼으로 클릭하고, Clean Project 또는 Build Project를 선택하면 빌드가 진행된다.

사실은 이클립스에서 빌드하는 것이나 콘솔 터미널에서 [QUALNET_HOME]/main에 가서 make 명령 수행하는 것이나 똑같기 때문에 편한 방법을 쓰면 되고, 무엇보다 리눅스 GUI 환경에서도 윈도우와 마찬가지로 소스코드를 편하게 확인할 수 있는 것이 이득이라고 생각된다.






반응형
블로그 이미지

Bryan_

,
반응형

OS: Ubuntu 14.04.2 LTS (64-bit)

QulNet version: 5.0.1


리눅스에서도 QualNet GUI를 쓸 수 있고,

[QUALNET_HOME]/bin/QualNetGUI 파일을 실행하면 된다.

(더블클릭하거나, 콘솔에서 명령어 입력)


그런데 더블클릭해도 아무것도 실행되지 않고, 콘솔에서 시도해 보면 아래와 같은 에러가 나면서 실행이 안될 때가 있다.


user@Linux:~/qualnet/5.0/bin$ ./QualNetGUI 

/home/user/qualnet/5.0/gui/lib/linux64/QualNetGUI: error while loading shared libraries: libjpeg.so.62: cannot open shared object file: No such file or directory


이 때 간단히 libjpeg 라이브러리를 설치하면 해결된다.

$ sudo apt-get install libjpeg62



반응형
블로그 이미지

Bryan_

,
반응형

(환경) QualNet 5.0.1, Windows 7 64bit, Visual Studio 2008


경험으로 볼 때, 리눅스에서는 gcc에서 디버그 옵션을 지정하기 때문에 별다른 설정 없이 그냥 빌드해도 gdb qualnet 명령으로 디버그가 가능했다. 하지만 윈도우 환경에서는 QualNet Makefile에서 기본 설정으로 디버깅 옵션이 꺼져 있다. 매뉴얼에는 runtime efficiency를 위해서 그렇게 했다고 적혀 있다.


윈도우 환경에서 디버깅 옵션을 켜려면, [QUALNET_HOME]\main\Makefile을 열고 아래와 같이 고쳐 준다.

[QUALNET_HOME]\main\Makefile 중에서...


#DEBUG = /Zi  ---------->  DEBUG = /Zi

OPT = /Ox /Ob2  ---------->  #OPT = /Ox /Ob2


만약 main 폴더 안에 Makefile이 없을 경우, 윈도우 버전 및 Visual Studio 버전별로 호환되는 Makefile 예시가 여러 개 있으니(Makefile-windows-vc8, Makefile-windows-x64-vc9 등) 그 중에서 현재 시스템과 호환되는 파일을 복사해서 Makefile로 이름을 변경한다.


추가로, Visual Studio에서 "빌드 > 솔루션 빌드"를 눌렀을 때 수행되는 Makefile은 위의 것이 아니고 [QUALNET_HOME]\Makefile이다. (Programmer's guide에 적힌 visual studio 연동 방법대로 진행한다면 이 위치에 텍스트파일을 만들게 된다.) 그 파일에서 nmake 명령 뒤에 참고하는 파일 이름이 방금 main 폴더에서 새로 복사해서 만든 Makefile인지 확인할 것. 내용이 아래와 같아야 한다.

[QUALNET_HOME]\Makefile

all:

cd main

nmake -f Makefile

rebuild: clean

nmake -f Makefile

clean:

cd main

nmake -f Makefile clean



그리고 Visual Studio에서 다시 빌드하고 나서 "프로젝트 ---> [QualNet 프로젝트 이름] 속성..."에 들어간다.

왼쪽 메뉴에서 "구성 속성 > 디버깅"으로 들어간다.

작업 디렉터리는 실행하고자 하는 시나리오 config 파일이 있는 폴더 위치,

명령 인수에서는 시나리오 config 파일의 이름을 입력한다.



이제 Visual Studio 메뉴에서 "디버그 > 디버깅 시작(F5)" 으로 특정 시나리오에 대해서 디버그할 수 있다.




반응형
블로그 이미지

Bryan_

,
반응형

QualNet 5.0에서 propagation fading model을 None 대신 Rayleigh, Fast Rayleigh 등 다른 것을 선택하고 시뮬레이션을 돌리면  아래 그림과 같이 "PROPAGATION-FADING-GAUSSIAN-COMPONENTS-FILE is missing" 에러가 발생한다.




이 때는 config 파일을 열어서 "Channel Properties" 영역에 아래와 같이 propagation fading model이 필요로 하는 파일을 명시해 주면 되며, 이것은 퀄넷 설치시 테스트용으로 들어 있는 default 시나리오에서 가져올 수 있다.

PROPAGATION-CHANNEL-FREQUENCY[0] 2400000000

PROPAGATION-MODEL[0] STATISTICAL

PROPAGATION-PATHLOSS-MODEL[0] TWO-RAY

PROPAGATION-SHADOWING-MODEL[0] CONSTANT

PROPAGATION-SHADOWING-MEAN[0] 4.0

PROPAGATION-FADING-MODEL[0] FAST-RAYLEIGH

PROPAGATION-LIMIT[0] -111.0

PROPAGATION-MAX-DISTANCE[0] 0

PROPAGATION-COMMUNICATION-PROXIMITY[0] 400

PROPAGATION-PROFILE-UPDATE-RATIO[0] 0.0

PROPAGATION-FADING-GAUSSIAN-COMPONENTS-FILE [QualNet의 home directory]/5.0/scenarios/default/default.fading



또는 QualNet GUI 환경에서 좌측 상단의 Scenario Properties를 눌러서 나오는 대화상자에서 "Channel Properties"에 들어간 후 맨 아래의 "Specify Gaussian Components File" 메뉴 선택을 Yes로 변경하고 default.fading 파일을 선택해 주면 된다.



반응형
블로그 이미지

Bryan_

,