컴퓨터네트워크

컴퓨터네트워크 시뮬레이션 - OMNET++ 가이드

Recfli 2023. 10. 29. 16:42

 요즘 한동안 시험기간이랑 과제들이 바뻐서 많은 걸 신경쓰지 못했다. 특히 컴퓨터네트워크 강의 교수님이 IoT 네트워크 통신에 대해서 연구를 하시는 분인데 이걸 과제로 주셨다. 이거 솔직히 해당 연구자가 아닌 이상 쓸 일도 없고 실제로도 별로 안 쓰는 것 같다 인터넷 상에 자료가 거의 없어서 omnet++에서 제공하는 기본 가이드와 기본 코드를 보면서 익혔다. 나도 정확하게 모르고 그냥 흐름에 대해서만 알려줄 수 있을 것 같다. 나중에 배우는 사람이 조금이나마 이해를 하는 데에 도움이 되었으면 좋겠다.

 

 참고로 해당 과제 내는 교수님은 한 명 밖에 없고 나한테 질문하지 않았으면 좋겠다. 조교님께 물어보길 바란다.

 

 우선 omnet++의 시뮬레이션 가이드 코드는 https://docs.omnetpp.org/tutorials/tictoc/  해당 사이트에서 볼 수 있다.

 

Introduction - OMNeT++ Technical Articles

 Introduction This tutorial guides you through building and working with an example simulation model, showing you along the way some of the commonly used OMNeT++ features. The tutorial is based on the Tictoc example simulation, which you can find in the

docs.omnetpp.org

 

그리고 함수별 document는 다음 장소에서 다운로드 받을 수 있다. api reference에 가면 class 내의 어떤 함수가 존재하고 사용법이 어떻게 되는 지 알 수 있다.

 

https://omnetpp.org/documentation/

 

OMNeT++ Documentation

OMNeT++ Documentation Introductions Tutorial TicToc Tutorial is an introductory tutorial that guides you through the process of constructing and running simulation models. It starts from a simple model and makes it progressively more sophisticated. Documen

omnetpp.org

 

OMNET++의 시뮬레이션 구조

우선 구조에 대해서 말을 하면 omnet++의 구조는 모듈, 메시지, 시뮬레이션 모델로 구분되어있다.

 

모듈은 Tic.cc와 Tic.h 같이 c++로 작성이 되어있는데 실제 사회에서 사용되는 거로 따지면 router, base station, mobile기기 같은 단위 시스템을 만드는 곳이라고 생각을 할 수 있다.

 

메시지는 packet이라고 생각을 하면 된다. .msg파일로 되어있으며 복잡성에 따라 다른 이름으로 --- Frame 이런 파일이 모두 이것을 표현한 부분이다. 컴퓨터 네트워크를 공부해보면 알겠지만 network layer층에서 전송되는 packet을 작성하는 장소 쯤이라고 생각하는 게 맞는 것 같다.

 

시뮬레이션 모델은 .ned 파일과 해당 시뮬레이션과 연결된 omnetpp.ini 파일에서 사용할 수 있다. 모듈 사이의 관계를 표현함으로써 실제 시뮬레이션을 할 수 있으며 GUI가 이 부분은 굉장히 잘되어있어서 Design칸에 가서 직접 마우스로 이동시키면 시뮬레이션 모델 파일에 적용이 된다.  시뮬레이션 부분에 대한 예시이다.

 

 

시뮬레이션 구조에 대해서 연관도 어느정도 있다. (모듈, 메시지)가 세트이고 (모듈, 시뮬레이션)이 세트이다. 

 

모듈과 메시지

모듈과 메시지의 관계에 대해서 나타내는 함수는 cSimpleModule이라는 class 공식문서를 읽어보면 이해를 할 수 있다. 해당 class는 4가지 함수만 일단 알면 되고 이 외의 세세한 내용은 한 번 천천히 읽어보길 바란다. 

 

4가지 구성 요소: cSimpleModule constructor(module 이름이 Tic이면 이건 Tic을 의미), initialize, handleMessage, finish()로 되어있다.

 

constructor 부분은 별 거 없고 initialize 부분은 내가 h에서 설정한 값들에 대해서 초기화를 해주는 부분이다.

 

handleMessage는  해당 moudule이 메시지를 받으면 다음 어딘가로 보낼 때 어떤 정보를 가져오고 어떤 정보를 내보낼지를 결정한다. 그렇기 때문에 해당 함수에서 받는 것도 msg 내보내는 것도 msg이다. 어느 module에 보낼지 아니면 broadcast할 지는 ned 파일과 ini 파일에서 설정할 수 있으며 해당 연결의 이동은 실제로 연결을 본인이 직접 설정하면 gate를 통해서 이동한다. broadcast가 아닌 경우에는 in gate로 부터 받아서 outgate로 설정한 부분으로 메시지를 내보낸다.

 

finish()는 모든 시뮬레이션이 끝나고 나서 어떻게 할 지에 대한 부분이다. 문서 상에서는 주고 받은 내역에 관해서 .h 파일에서 설정한 queue나 count 값들을 최종적으로 통계 자료로 내보내준다. 단, 최종 기록을 확인하기에는 좋지만 이외의 부분에서는 그렇게 좋은 구성인지는 모르겠다.

 

모듈과 시뮬레이션

모듈 각각을 만들었고 해당 모듈이 어떻게 메시지를 처리할 지 알았다면 handleMessage에서 처리한 메시지가 어디서 들어오고 어디서 나갈지는 시뮬레이션 파일인 .ned 파일과 .ini 파일에서 설정할 수 있다.

 

 연결 부분은 connections에서 설정할 수 있으며 gui를 통해서 설정하는 것을 추천한다. 해당 connection에서 module.??? 이렇게 connection 구조가 되어있는데 ??? 부분은 해당 모듈의 게이트이며 해당 게이트 설정과 관련된 부분은 tictoc예시를 보면 쉽게 이해할 수 있다. 또한 latency도 여기에서 지정할 수 있다.

 

그리고  해당 구조에 대해서도 똑같이 ini파일에서 connection을 c++로 작성을 해주어야하며 해당 mudule의 개수 별 초기 세팅할 값들에 대해서 작성할 수 있다. 예를 들면 해당 모듈의 고정적 장소 혹은 port 번호, 해당 모듈과 연결될 모듈 수, 모듈의 신호세기,  통계와 관련된 세팅, 시뮬레이션 자체 parameter 등을 작성할 수 있으며 이 부분도 tictoc 예시를 통해서 이해할 수 있다.

 

시뮬레이션에서 해야 할 일

 이제 해당 부분을 tictoc10의 예시까지 공부를 해보면 대충 어떤 흐름인지 알 수 있다. 함수에서 모르는 부분은 위에서 올린 공식문서를 통해서 공부를 해보아라. 이제 내가 어떤 정보를 뽑아와야 할 지에 대해서 이해를 완벽하게 했다면 데이터를 가지고 와야한다. 공식 문서상으로는 cVector, cHistogram, packet 메시지를 send를 통해서 추적하는 방법, WATCH함수를 통해서 기본 parameter를 추적하는 방법 등 다양한 방법이 있다. 해당 목적에 따라 다르기도 하고 아니면 handler 부분에서 본인이 받은 데이터에 따라서 직접 txt 혹은 csv 파일을 작성할 수도 있다. 전자의 방법이 어떻게 보면 명확하긴 한데 뽑힌 데이터를 2차로 가공을 해줘야한다.

 

 그러니 추천하는 방법은 코드를 자세하게 보고 Handler에서 메시지가 날라왔을 때 어디서 날라오는지 어디로 날라온 건지에 대한 Info나 msg내의 구조체를 찾아보자. 실제 data에서 TCP 전송 header처럼 해당 구조체가 header의 역할로 지금 handling하고 있는 메시지가 어디서 날라왔고 어디로 날려보낸 건지에 대한 정보가 모두 들어있다. 해당 부분을 log로 찍어서 시뮬레이션을 돌려서 확인한 뒤 다시 데이터를 뽑아오면 조금 더 문제가 쉽게 풀릴 것이다.

 

 본인이 무엇을 하는지에 따라서 다르겠지만 이 글을 읽고 조금이나마 전체적인 흐름을 이해하는데에서는 문제가 없었으면 좋겠다. 참고로 에러 메시지가 나오긴 하는데 솔직히 해당 오픈소스를 확장한 오픈소스의 개발자들이 error처리를 정말 욕나오게 대충한 것 같다는 생각이 든다. simu5g, sumo 같은 데서 cMoudule에서 벗어난 class에 있어서 에러가 생기면 사실상 에러를 찾지 못한다고 보면 된다. 그래도 omnet++ 자체의 error handling은 굉장히 잘되어있으니 해당 오류는 금방 찾을 수 있다.