개인 공부

NS-3 독학 - 1. First.cc

Beige00 2024. 1. 11. 15:47

- VS code에서 ns-3를 돌릴 예정이다. 따라서 vs code에 ns-3가 설치된 Linux를 연결해줄 필요가 있다.

 

1. VS code 설치

https://code.visualstudio.com/

 

2. WSL 원격 연결, C,C++ Extension 설치 (python으로 해도 되는 것 같지만 나는 C++이 더 편해서 .cc code들로 진행을 했다.)

WSL 원격 연결 툴
초록색 부분 클릭 -> 배포판을 이용하여 연결 -> ns-3가 설치된 배포판 선택
C/C++ extension 등 개인적으로 필요한 확장 설치

 

3. Terminal에서 필요한 패키지 설치 및 ns-3가 설치된 경로에서 VS code 실행

 

 - sudo apt-get update -y

 - sudo apt-get install xdg-utils -y

 - sudo apt-get install gcc -y

 - sudo apt-get install gdb

 - code . (WSL 환경에서 VSCode 실행) (현재 경로는 ns-3가 설치된 경로여야함. ex: ns-allinone-3.40/ns-3.40/ns-3-dev)

ns-3.40-branch로 VS code WSL 원격 연결을 했다.


2. ns-3 명령어

configure./ns3 configure
make./ns3
make clean./ns3 clean
•build → ./ns3 build

• ./ns3 run (실행 파일 명)

( ns-3.36  업데이트가 이루어지며 waf build system이 삭제되었다. 이는 ns3 script로 대체됨.)

3. First.cc 분석

./ns-allinone-3.40/ns-3.40/examples/tutorial 에 위치한 tutorial 용 코드들 중 first~sixth 까지 번역을 해보며 ns-3 사용법을 익혀볼 생각이다.

바로 First.cc 부터 살펴보도록 하겠다.

이제 코드를 순서대로 뜯어보겠다.

First.cc의 network scenario topology

NS_LOG_COMPONENT_DEFINE("FirstScriptExample");

=> 해당 매크로는 특정 모듈에 대한 로깅을 정의하고 초기화한다. 본 파일은 First.cc이므로 FirstScriptExample로 LOG 이름을 초기화한 것 같다.

int
main(int argc, char* argv[])
{
    CommandLine cmd(__FILE__);
    cmd.Parse(argc, argv);

    Time::SetResolution(Time::NS);
    LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
    LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);

    NodeContainer nodes;
    nodes.Create(2);

    PointToPointHelper pointToPoint;
    pointToPoint.SetDeviceAttribute("DataRate", StringValue("5Mbps"));
    pointToPoint.SetChannelAttribute("Delay", StringValue("2ms"));

    NetDeviceContainer devices;
    devices = pointToPoint.Install(nodes);

    InternetStackHelper stack;
    stack.Install(nodes);

    Ipv4AddressHelper address;
    address.SetBase("10.1.1.0", "255.255.255.0");

    Ipv4InterfaceContainer interfaces = address.Assign(devices);

    UdpEchoServerHelper echoServer(9);

    ApplicationContainer serverApps = echoServer.Install(nodes.Get(1));
    serverApps.Start(Seconds(1.0));
    serverApps.Stop(Seconds(10.0));

    UdpEchoClientHelper echoClient(interfaces.GetAddress(1), 9);
    echoClient.SetAttribute("MaxPackets", UintegerValue(1));
    echoClient.SetAttribute("Interval", TimeValue(Seconds(1.0)));
    echoClient.SetAttribute("PacketSize", UintegerValue(1024));

    ApplicationContainer clientApps = echoClient.Install(nodes.Get(0));
    clientApps.Start(Seconds(2.0));
    clientApps.Stop(Seconds(10.0));

    Simulator::Run();
    Simulator::Destroy();
    return 0;
}

 

이는 First.cc의 전문이다.

 

1. CommandLine cmd(__FILE__); : command line interface를 초기화한다. 

더보기

해당 코드는 NS-3에서 사용되는 커맨드 라인 인터페이스를 초기화하는 부분이다.

주로 프로그램이 실행될 때 커맨드 라인에서 전달된 옵션 및 인자들을 처리하기 위해 사용되는 부분이다.

여기서 __FILE__은 C++에서 빌드된 현재 소스 파일의 경로 및 이름을 나타내는 매크로이다.

CommandLine 클래스는 NS-3에서 제공되는 클래스로써, 커맨드 라인 옵션을 처리하고 파싱하는데 사용된다.

따라서 '__FILE__'을 이용해 현재 소스 파일의 정보를 전달하면, NS-3는 해당 정보를 기반으로 커맨드 라인 옵션을 설정한다.

2. cmdParse(argc,argv); : 커맨드 라인에서 전달된 인자들을 파싱하여 프로그램에 적용한다.

 

3. Time::SetResolution(Time::NS); : 시뮬레이션에서 사용할 시간 Resolution을 NanoSec으로 설정한다.

 

4. LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);

  LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO)

Client, Server 는 Topology에서 따로 TCP protocol을 사용한다고 하지 않았고, 소스코드에 UdpEchoServer,Client 모듈의 log level을 INFO로 설정하므로, UDP protocol을 사용하는 것 같다.

더보기

LogComponentEnable 함수는 NS-3에서 로깅 시스템을 활성화하는데 사용되는 함수이다.

이 함수는 특정 모듈에 대한 로깅을 어떤 레벨로 출력할 것인지 설정한다.

"UdpEchoServerApplication", "UdpEchoClientApplication" 모듈에 대한 로깅을 INFO level로 설정하므로 해당 모듈들이 생성하는 로그 메시지 중 INFO 레벨 이상의 메시지만 출력된다.

(* TRACE, DEBUG, INFO, WARN, ERROR, FATAL 등의 레벨이 있다.)

5. NodeContainer nodes; nodes.Create(2); : 시뮬레이션에 사용할 노드 2개를 생성한다.

 

6. PointToPointHelper pointToPoint; : 생성한 두 노드 간의 point to point link를 나타내는 객체를 생성한다.

 

7. pointToPoint.SetDeviceAttribute("DataRate", StringValue("5Mbps"));

pointToPoint.SerChannelAttribute("Delay", StringValue("2ms")); :

pointTopoint 링크의 DataRate, Delay 값을 설정해준다.

더보기

왜 5Mbps, 2ms로 설정한지 First topology에는 링크의 특성이 자세히 기록되어있지 않아 그냥 그렇게 했나보다. 하고 넘어갔다. 

그 후 계속 신경이 쓰여 다른 tutorial .cc 파일들을 찾아보니 fifth.cc에 다음과 같은 Topology가 제시되어있음을 볼 수 있었다.

여기서는 Point to point Link의 특성이 자세히 기록되어있었고, 그냥 해당 link attribute 값이 일반적이여서 default 값으로 사용하는 것 같다는 결론을 내었다..

8. NetDeviceContainer devices; 

devices = pointToPoint.Install(nodes); :

point-to-point link를 nodes에 설치하고, 생성된 network devices들을 devices에 할당한다.

 

9. InternetStackHelper stack; stack.Install(nodes); :

각 노드에 인터넷 스택을 설치한다.

노드에 인터넷 스택을 설치하는 것은 해당 노드에서 다양한 네트워크 프로토콜을 사용한다는 것이다.

인터넷 스택이 없는 경우, 노드는 기본적으로 어떤 네트워크 프로토콜도 지원하지 않는다.

더보기
현재까지 구성된 Topology 상태. 이 nodes들은 NetDeviceContainer devices에 할당 되었다.

10. Ipv4AddressHelper address; address.SetBase("10.1.1.0", "255.255.255.0"); :

Topology를 보면 해당 Point-to-point link에 연결된 node들은 IPv4 address 10.1.1.0을 사용한다. 따라서 서브넷 마스크는 "255.255.255.0" 이 될 것이다. 이 정보를 담을 Ipv4AddressHelper 객체를 생성해 set 해준다.

 

11. Ipv4InterfaceContainer interfaces = address.Assign(devices); :10. 에서 생성한 address를 node interface 에 할당한다.

 

12. UdpEchoServerHelper echoServer(9); :모듈을 UdpEcho로 사용하기로 했으므로 Port 9 에서 동작하는 UDP 에코 서버를 생성한다.

 

13. ApplicationContainer serverApps = echoServer.Install(nodes.Get(1)); :node 1에 설정해둔 echoServer를 설치한다.따라서 이 시점부터 node 1은 Port 9에서 동작하는 Udp echo server이다.

 

14. serverApps.Start(Seconds(1.0)); serverApps.Stop(Seconds(10.0)); :설치한 에코 서버(node 1)를 1초 후에 시작하고 10초 후에 종료한다.

 

15. UdpEchoClientHelper echoClient(interfaces.GetAddress(1), 9); :node 1의 IP 주소와 포트 9로 향하는 UDP echo clinet를 생성한다.

 

16. echoClient.SetAttribute("MaxPackets", UintegerValue(1));

echoClient.SetAttribute("Interval", TimeValue(Seconds(1.0)));

echoClient.SetAttribute("PacketSize", UintegerValue(1024)); :

생성될 UdpEchoClientHelper 객체 echoClient의 전송할 최대 패킷 수를 1, 패킷 간 간격을 1, 각 패킷의 크기를 1024 byte로 설정한다. 이 객체는 node 0에게 할당될 것이다.

 

17. ApplicationContainer clientApps = echoClient.Install(nodes.Get(0)); :

이렇게 초기화한 echoClientHelper를 node 0 에 할당한다.

 

18. clientApps.Start(Seconds(2.0)); clientApps.Stop(Seconds(10.0)); :

2초 후 시작, 10초 후 종료를 설정해준다.

더보기
최종 구성.

* 요약

node 0 은 UDPEchoClientHelper로 attribute를 초기화 한 echoClient를 설치했다. (ApplicationContainer 활용)

node 1 은 UDPEchoServerHelper로 attribute를 초기화 한 echoServer를 설치했다. (ApplicationContainer 활용)

시간 단위는 NanoSecond이며, LOG_LEVEL_INFO로 log를 기록한다.

통신 line의attribute는 point to point 연결을 하므로 PointToPointHelper pointToPoint 객체를 생성하여 초기화하였다.

그리고 해당 line은 NetDeviceContainer devices에 설치했고, 여기에 nodes를 등록했다.

그리고 node 0, node 1을 가지고 있는 NodeContainer nodes에 InternetStackHelper로 인터넷 프로토콜을 설치했다.

마지막으로 Ipv4AddressHelper를 통해 IP 주소와 서브넷 마스크를 초기화하고 divices에 할당했다.

 

(본 구현을 참조하면 Helper는 특정 객체를 초기화하기 위해 attribute를 설정하고, 이를 node에 옮겨주는 Interface 역할이고, Container는 해당 특성을 지니는 객체들을 모아두는 저장소라고 생각할 수 있다.)


* 실행 결과

first.cc result

2초에 client가 켜져 server에게 패킷을 보내 주고 받는 모습이다.

MaxPacket을 1로 설정했으므로 한번만 주고 받는다.

MaxPacket 값을 5로 설정하면, 5번 주고받을 것이다.

'개인 공부' 카테고리의 다른 글

NS-3 독학 - 5.fifth.cc  (0) 2024.01.15
NS-3 독학 - 4.fourth.cc(Tracing)  (0) 2024.01.13
NS-3 독학 - 3.Third.cc  (0) 2024.01.12
NS-3 독학 - 2. Second.cc  (0) 2024.01.11
NS-3 독학 - 0. 설치하기  (0) 2024.01.10