OMNeT++란?

생각보다 굉장히 구린 UI..
1. 절대 시뮬레이터 자체가 아니다.
"네트워크 시스템을 가짜 시간 안에서 실험할 수 있게 해주는 모듈 조립식 시뮬레이션 프레임워크"
먼저, 시뮬레이터가 아니라 프레임워크이다. omnetpp(지금부터 OMNeT++을 omnetpp라고 칭하겠음)를 깔았다고 해서, 시뮬레이터가 생긴게 절대 아님.
레고로 예를 들어보자면, omnetpp은 레고 시스템 자체(블록 규격, 끼우는 방식, 설명서), 완성된 레고 작품은 내가 블록을 직접 조립하거나, 남이 만든 블록 세트(INET)를 가져와야 함.
그래서 omnetpp이 직접 제공하는 것들은:
- 시뮬레이션을 굴리는 엔진 (DES 커널)
- 모듈을 만들고 연결하는 틀 (C++ 클래스 + NED 언어)
- 보고 디버깅하는 도구 (Qtenv GUI, 결과 분석)
TCP/Ethernet/RDMA 등등 여러 실제 프로토콜들은 omnetpp 안에 없음. inet같은 라이브러리가 채우거나 내가 짜는 것임
2. Virtual Time이라는 것
실제 시계로 안 돌고, 자기만의 가상 시간을 가진다는 것
omnetpp은 시스템에서 일어나는 모든 일들을 event로 봄. (패킷 도착, 타이머 울림, 큐에서 패킷 꺼냄 등)
각 이벤트엔 timestamp가 찍혀있음. 엔진은 이 이벤트들을 시간이 이른 순서대로 하나씩 꺼내서 처리하고, 꺼낼 때마다 virtual time을 그 시각으로 jump시킴. 이걸 DES (Discrete Event Simulation)이라고 함.
while (still there are evnets):
take next event
current time = event time # (time jump)
handle the event
그래서 이렇게 해서 존재하는 장점은 뭐가 있냐면
1) 이벤트 하나하나, 패킷 하나하나, 큐 한 바이트까지 다 들여볼 수 있음
2) 어떠한 이벤트가 다음 이벤트에 어떤 영향을 미치는지 확인 가능
3. Module 형태라는 것
모듈이라는 블록이 모여서 만들어지는 omnetpp. 모듈은 port를 통해 서로 메시지를 주고 받음. 큰 모듈 안에 작은 모듈을 담아 계층을 만들 수 있고 (호스트 안에 TCP 모듈, 그 안에 ,....), 그래서 모듈 조립식으로 네트워크를 표현할 수 있음
즉, omnetpp은 시뮬레이션을 세 개의 다른 언어, 세 개의 다른 파일로 쪼개서 표현함.
- NED(구조): 어떤 모듈이 어떻게 연결됐나
- C++(동작): 각 모듈이 메시지를 받으면 뭐하나 (진짜 로직 존재)
- ini(설정): 어떤 네트워크를 어떤 파라미터로 얼마나 돌리나
이제 다음 포스팅부턴 구체적인 예시로 한번 진행해보도록 하자.