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는 설치된 BulkSendApplication의 SetMaxBytes() 메소드를 호출하여 설정할 수 있다.
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 queuepfifo_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의 타입을 나타내며, args는 type에 해당하는 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에 의해 관리되는 리스트에 추가된다. 이때 각 프로토콜 스택 객체는 하나의 라우팅 프로토콜을 선택할 수 있다.
GlobalRouteManager는 routing oracle로써 동작하며 모든 노드들 간의 route를 자동으로 생성하는데, 생성된 루트는 노드 어딘가에 저장되어야 한다(즉 라우팅 테이블이 있어야 한다.). 그 저장되는 대상이 바로 IPv4 프로토콜 스택에 대한 글로벌 라우팅 프로토콜 클래스인 Ipv4GlobalRouting이다.
ns3::Ipv4StaticRouting과는 다르게 route가 시뮬레이션 도중에 동적으로 삭제되고 재생성된다.
단순히 .PopulateRoutingTables() 메소드를 그냥 호출해주기만 하면 라우팅 데이터베이스를 만들고, 각 노드들의 라우팅 테이블을 채울 수 있다.
시뮬레이터 관련
Simulator::Schedule()
미래의 이벤트를 스케줄링한다. 프로토타입은 아래와 같다.
EventId ns3::Simulator::Schedule ( const Time & delay,
const Ptr< EventImpl > & event
)
delay는 이벤트가 발생하기까지의 딜레이를 나타내며, event는 발생시킬 이벤트에 대한 포인터다.