/ NETWORK

NS-3 API들 정리

예제로 맨땅에 헤딩중인데 모르는 클래스랑 함수가 너무 많다 히잉

네임스페이스가 명시되지 않은 것은 ns3 네임스페이스로 간주한다.


Applications 관련

PacketSinkHelper

대상 IP 주소 및 TCP/UDP 포트로 들어오는 패킷을 단순 수신하는 애플리케이션인 PacketSink를 생성하는 Helper 클래스다.

constructor는 PacketSinkHelper (std::string protocol, Address address)로 되어있는데, protocol은 Transport 계층 프로토콜에 해당하며 어플리케이션에 대한 소켓을 생성하는 데에 사용되는 socket factory 타입에 해당하는 문자열(예:ns3::UdpSocketFactory)을 전달해야 한다. address는 IP주소 및 포트 번호를 나타내는 ns3::InetSocketAddress를 사용한다.

virtual 메소드인 Receive()는 수신 소켓에 대한 callback 함수로써 정의되어 있다.

.Install() 메소드로 argument로 전달된 NodeContainer에 있는 노드들에 PacketSink를 설치할 수 있다.

BulkSendHelper

MaxBytes에 도달할 때까지 (bandwidth를 꽉 채울 때까지) 혹은 어플리케이션이 종료될 때까지(MaxBytes가 0일 때) 최대한 빨리 트래픽을 만들어서 보내는 역할을 하는 어플리케이션인 BulkSendApplication을 생성하는 Helper 클래스다.

MaxBytes는 설치된 BulkSendApplicationSetMaxBytes() 메소드를 호출하여 설정할 수 있다.

PacketSinkHelper의 constructor와 마찬가지로 BulkSendHelper (std::string protocol, Address address) 와 같이 SocketFactory 클래스와 Address 클래스를 인자로 받는다.

.Install() 메소드로 argument로 전달된 NodeContainer에 있는 노드들에 BulkSendApplication을 설치할 수 있다.

의문점: BulkSendApplication 문서를 보면,

Only SOCK_STREAM and SOCK_SEQPACKET sockets are supported. For example, TCP sockets can be used, but UDP sockets can not be used.

위와 같이 적혀있는데, BulkSendHelper의 constructor에서 protocol 인자로 ns3::UdpSocketFactory를 전달해도 문제없이 동작한다. 심지어 BulkSendHelper 문서에서는 protocol 인자로 ns3::UdpSocketFactory를 전달하는 예제가 나와있다. BulkSendApplication 문서에 적혀 있는 ‘UDP 소켓을 사용할 수 없다’는 말은 어떤 맥락에서의 말인지 모르겠다.


Traffic Control 관련

TrafficControlHelper

QueueDisc 객체들을 생성하고 상응하는 디바이스에 맵핑하는 Helper 클래스다. 이 map은 Traffic Control 레이어에 저장되어 있다고 한다.


QueueDisc

QueueDisc 객체는 모든 queueing discipline에 대해 공통된 behavior를 구현하고 인터페이스를 제공하는 abstract base class이다. QueueDisc 객체는 TrafficControlHelper.Install(NetDeviceContainer) 메소드를 통해 각각의 NetDevice에 맵핑되어야 한다. 보통 어플리케이션이나 NetDevice, 프로토콜 스택을 설치할 때 NodeContainor를 전달하여 각 Node에 설치하는 것과 달리 IPv4 주소를 Assign() 메소드를 호출하여 할당할 때처럼 NetDeviceContainer 를 전달하여 NetDevice에 설치한다는 점에 주의하자.


.SetRootQueueDisc 메소드를 통해 주어진 타입 및 어트리뷰트로 root queue disc를 설정할 수 있다.

예를 들면

  • ns3::PfifoFastQueueDisc: 리눅스에서 기본으로 활성화된 기본 priority queue pfifo_fast와 동일한 동작을 하는 queue disc

  • ns3::CoDelQueueDisc: CoDel 패킷 스케줄러를 구현한 queue disc

등을 설정할 수 있다.

.SetRootQueueDisc의 프로토타입은 다음과 같다.

uint16_t ns3::TrafficControlHelper::SetRootQueueDisc ( const std::string &  type,
Args &&...  args 
) 

Args는 name-value 페어들을 나열한 것이다.

type은 queue의 타입을 나타내며, argstype에 해당하는 QueueDisc의 생성자에 전달되는 인자들, 즉 queue의 어트리뷰트에 해당한다.


프로토콜 스택 구현 관련

SocketFactory

어플리케이션에 소켓 API를 제공하는 transport 계층의 인스턴스를 생성하는 Object에 해당한다.

이 베이스 클래스는 소켓 생성을 위한 API를 정의한다.

.CreateSocket() 메소드를 통해 소켓을 생성할 수 있다.

.GetTypeId() 메소드를 통해 SocketFactory의 타입을 얻을 수 있다.

TypeId

인터페이스에 대한 Unique한 ID에 해당한다.

Ipv4GlobalRoutingHelper

ns3::Ipv4GlobalRouting 오브젝트를 생성하는 Helper 클래스다.


Ipv4GlobalRouting

ns3::Ipv4GlobalRouting 클래스를 이해하기 위해서는 ns-3가 어떻게 시뮬레이션 환경에서 라우팅을 구현하는지 알 필요가 있다.

ns-3에서는 pluggable한 라우팅 프로토콜 개념을 채택하고 있다.

라우팅 프로토콜들은 Ipv4L3Protocol에 의해 관리되는 리스트에 추가된다. 이때 각 프로토콜 스택 객체는 하나의 라우팅 프로토콜을 선택할 수 있다.

GlobalRouteManagerrouting oracle로써 동작하며 모든 노드들 간의 route를 자동으로 생성하는데, 생성된 루트는 노드 어딘가에 저장되어야 한다(즉 라우팅 테이블이 있어야 한다.). 그 저장되는 대상이 바로 IPv4 프로토콜 스택에 대한 글로벌 라우팅 프로토콜 클래스인 Ipv4GlobalRouting이다.

ns3::Ipv4StaticRouting과는 다르게 route가 시뮬레이션 도중에 동적으로 삭제되고 재생성된다.


단순히 .PopulateRoutingTables() 메소드를 그냥 호출해주기만 하면 라우팅 데이터베이스를 만들고, 각 노드들의 라우팅 테이블을 채울 수 있다.


시뮬레이터 관련

Simulator::Schedule()

미래의 이벤트를 스케줄링한다. 프로토타입은 아래와 같다.

EventId ns3::Simulator::Schedule ( const Time &  delay,
const Ptr< EventImpl > &  event 
)  

delay는 이벤트가 발생하기까지의 딜레이를 나타내며, event는 발생시킬 이벤트에 대한 포인터다.