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
는 발생시킬 이벤트에 대한 포인터다.