NS-NAM은 어떤 구조로 이루어 졌을까?
Network Simulator, NS는 네트워크 시뮬레이션을 위한 컴퓨터 언어 Object-oriented TcL(OTcl)를 컴파일하는 인터프리터(interpreter)입니다. 다시 말해서 NS-2를 사용하기 위해선 OTcl 언어를 사용하여 프로그램을 짜야 합니다. OTcl 스크립트는 프로그램이 이벤트 스케쥴러를 초기화하고 NS-2 라이브러리에 있는 네트워크 토포롤지들을 준비하여 각각의 네트워크 이벤트에 따른 전송 노드에서 수신 노드까지의 데이터의 흐름을 결정하게 됩니다.
NS-2에서 이벤트는 고급 사용자의 경우 기존의 OTcl 모듈들을 새롭게 작성한 OTcl 스크립트와 함께 컴파일하여 네트워크 컴포넌트로 사용하는데 그러기 위해서 새로 작성한 스크립트와 기존의 스크립트는 함께 컴파일되어야 합니다.
독자들이 작성하게 될 OTcl 파일(.tcl)을 컴파일하면 <그림 1>와 같은 이벤트가 일어납니다. 네트워크를 소프트웨어적으로 시뮬레이션한 후 그 결과를 기록한 파일 두 개가 생성되는데 그것이 out.nam과 out.tr입니다. out.nam은 Network-AniMator인 NAM의 실행을 위한 파일이며 out.tr은 네트워크에서 데이트의 흐름을 모니터링하고 시뮬레이션한 데이터의 각각의 이벤트에 따른 생성된 로그라고 할 수 있습니다.
NAM
NAM은 네트워크 디자인의 특성상 쉽게 눈으로 볼 수 없었던 데이터의 흐름과 구현된 네트워크 토폴로지를 애니메이션 효과를 통해 제공하는 툴입니다. 이러한 기능은 .tcl 스크립트가 컴파일된 후 생성된 out.nam이라는 파일을 이용하여 실행되며 디자인된 네트워크의 시각적인 해석을 가능하게 합니다. 여타의 멀티미디어 플레이어와 같은 손쉬운 동작 방법으로 네트워크를 제어할 수 있으며 각각의 링크에 패킷들의 수나 전체 Throughput 등이 쉽게 마우스 동작으로 나타내 집니다. 또한 각각의 노드는 드래그 앤 드롭으로 생성되거나 이동될 수 있는 기능도 있습니다.
X-Graph
X-Graph는 X-윈도우의 응용 프로그램으로 그래핑(graphing) 과 플로팅(plotting)을 할 수 있는 툴입니다. 이러한 코딩은 .tcl 스크립트가 컴파일된 후 생성된 out.tr 파일을 이용하여 나타나며 .tcl 스크립트에서 다음과 같은 약간의 코딩으로 사용될 수 있습니다.
proc finish{} {
global f0 f1 f2
#Close the output files
close $f0
close $f1
close $f2
#call X-Graph to display the results
exec xgraph out0.tr ?geometry 800x400 &
exit 0
}
점대점 노드와 링크 따라하기
이제부터 NS-2로 네트워크를 구성하기 위한 단계입니다. 간단한 예제를 통해 본격적으로 NS-NAM을 실습해 보도록 하겠습니다. 우선 점대점 토폴로지로 이루어진 두 개의 노드와 한 개의 링크를 NS-2로 구현하고 NAM으로 확인해 보도록 하겠습니다. 우리가 구현할 네트워크의 필요사항(requirement)은 두 개의 노드(노드 ‘0’과 ‘1’)가 있고 그 노드 사이에는 듀플렉스(duplex)로 연결된 링크가 있어야 합니다.
그리고 데이터는 UDP(User Defined Protocol, 사용자가 데이터 전송 크기를 정할 수 있는 프로토콜)를 사용하여 보내지며 CBR(Constant Bit Rate, 데이터 전송의 흐름을 항상 일정한 비율로 하는 것)을 사용하여 5초 동안 데이터를 보내야 합니다. 그리고 마지막에 NAM을 호출하여 우리의 실습 네트워크 토폴로지를 눈으로 볼 수 있고 시뮬레이션하도록 합니다. 그럼 노드를 생성하는 것부터 시작해 보겠습니다.
노드 생성과 연결
NS-2에서도 네트워크는 노드와 링크로 이루어진다. 노드와 링크에 패킷 데이터를 보내기 위해서는 NS가 시작되는 시간, 데이터를 보내기 시작하는 시간, 데이터를 전송 마지막 시간 등의 시간에 대한 전체적인 이벤트의 스케쥴을 지정해야 합니다.
시작 오브젝트 생성 -> set ns [new Simulator]
NS 시작 시간 설정 -> $ns at <time> <event>
NS 시작 -> $ns run
노드를 만들기 위해서는 ‘set’이라는 명령어를 사용합니다.
set n0 [$ns node]
set n1 [$ns node]
각각 ‘n0’와 ‘n1’을 지정하고 두 개의 노드 오브젝트를 생성했습니다. NAM에서 네트워크 흐름을 보기 좋게 나타내기 위해서 데이터 플로우에 색을 집어넣기도 하는데 방법은 다음과 같습니다. 색은 검정, 빨강, 파랑, 바다녹색 등이 있습니다.
$n0 color
생성된 노드를 링크로 연결하는 데에는 단 방향 전송(simplex)과 양 방향 전송(duplex)이 있습니다. 각각은 다음과 같이 설정됩니다.
A Simplex link(단 방향) -> $ns simplex-link $n0 $n1
<bandwidth><delay> <queue_type>
A duplex link(양 방향) -> $ns duplex-link $n0 $n1
<bandwidth> <delay> <queue_type>
밴드위스와 딜레이는 각각 1Mb와 10ms로 설정했으며 지난 호에 설명했던 큐는 먼저 들어온 데이터가 먼저 처리되는 FIFO(First In First Out)으로 설정하겠습니다. 이외에도 RED(Random Early Detection), Drop Tail, FQ(Fair Queuing) 등을 사용할 수 있습니다.
Agent와 애플리케이션
NS-2로 생성된 노드 오브젝트는 2개의 클래스를 사용하여 데이터 트래픽(traffic)을 생성합니다. 그것은 the class Agent and the class Application입니다. 각각의 노드는 데이터를 전송하고 수신하는 기능이 필요한데 이러한 일을 하는 것이 Agent입니다. 또한 Agent 위에 애플리케이션을 수행하게 되는 것입니다. 이러한 애플리케이션은 구현될 네트워크에서 데이터 트래픽의 종류를 결정하게 됩니다. NS-2에는 UDP와 TCP의 두 가지 Agent가 있습니다.
UDP
set udp0 [new Agent/UDP]
set null [new Agent/NULL]
$ns attach-agent $n0 $udp0 # udp Agent를 노드 n0에 붙입니다.
$ns attach-agent $n1 $null
$ns connect $udp $null # 2개의 Agent를 연결합니다.
이 코드는 UDP Agent를 만들어서 n0 노드에 붙이고 Null Agent를 만들어서 데이터가 노드 n1에 붙여서 물이 높은 곳에서 낮은 곳으로 흐르듯이 데이터를 흐르게 만들어 줍니다.
TCP
set tcp [new Agent/TCP]
set tcp_sink [new Agent/TCPSink]
$ns attach-agent $n0 $tcp # tcp Agent를 노드 n0에 붙입니다.
$ns attach-agent $n1 $tcp_sink
$ns connect $tcp $tcp_sink # 2개의 Agent를 연결합니다.
이 TCP 코드는 TCP Agent를 우선 생성하여 노드, n0에 붙이고 n1은 TCPSink agent로 설정한 후 데이터가 n0에서 n1로 트래픽이 전송될 수 있도록 합니다. NS-2에서는 TCP, TCP/Reno, TCP/Vegas, TCP/Sack1, TCP/Fack, TCPSink 등의 다양한 TCP 타입이 지정될 수 있습니다.
NS-2에는 데이터를 전송하는 방법에 따라 다른 4개의 트래픽 애플리케이션이 있습니다. 가장 쉽게 사용되는, 항상 일정한 비율로 데이터를 전송한다는 의미의 CBR(Constant Bit Rate)을 살펴보겠습니다. Agent를 생성한 후 파라미터들을 사용하여 새로운 오브젝트를 하나 만듭니다(다음의 경우, my_cbr). 그리고 다시 agent에 연결하여 애플리케이션을 완성합니다. 완성된 애플리케이션은 시간의 변수와 함께 실질적인 데이터 전송 시간을 결정할 수 있습니다.
set my_cbr [new Application/Traffic/CBR]
$my_cbr attach-agent $udp
$ns at <time> $my_cbr start
결정인자
start : 환경 변수에 기준해 패킷들을 보내기 시작하는 시간을 결정
stop : 패킷 전송을 중단
PacketSize_ : 일정하게 생성되는 패킷들의 크기를 결정하는 인자
rate_ : 전송 비율을 결정하는 인자
interval_ : 전송된 두개의 패킷간의 시간
maxpkts_ : 전송하는 최대 패킷 수
결정인자는 NS-2가 소프트웨어 시뮬레이션이기 때문에 매우 신중하고 수학적으로 계산해야 합니다. 적절한 패킷크기 지정과 전송 비율, 인터벌 설정은 다양하고 정확한 응용을 가능하게 해줍니다.
트레이싱
트레이싱(Tracing)은 시뮬레이션을 통해서 생성된 데이터의 로그를 저장하여 분석할 수 있도록 해줍니다. 트레이싱에는 패킷의 전송 시작 시간, 도착 시간, 전송 실패 패킷의 수와 전송로의 상태 등을 동적으로 기록하고 있습니다.
set trace_file [open out.tr w]
$ns trace-all $trace_file
$ns flush-trace
close $trace_file
성공적인 컴파일 후에는 out.tr이라는 trace 파일이 생성되어 다음과 같은 데이터를 저장하게 됩니다. 첫 번째 컬럼의 ‘+’는 큐에 들어오는 과정, ‘-’는 큐에서 나가는 시간, ‘r’은 이벤트가 생성되는 시간, ‘d’는 전송받은 패킷을 큐에서 드롭한 시간을 기록합니다. 11개의 각각의 컬럼에 관한 내용은 <표 1>과 같습니다.
+ 1.84375 0 2 cbr 210 ------- 0 0.0 3.1 225 610
- 1.84375 0 2 cbr 210 ------- 0 0.0 3.1 225 610
r 1.84471 2 1 cbr 210 ------- 1 3.0 1.0 195 600
d 1.84566 2 0 ack 40 ------- 2 3.2 0.1 82 602
<화면 3>은 이상의 내용을 하나에 묶어 hello-ns.tcl 파일로 저장하고 프롬프트 상태에서 ns hello-ns.tcl이라고 실행한 후에 나타난 out.nam 화면입니다. 컴파일이 성공적으로 수행되면 자동으로 out.tr 파일과 out.nam 파일이 생성됩니다. 이제 독자들은 처음으로 만든 시각적인 네트워크를 다양한 기능키를 상용해서 즐겨 볼 수 있습니다. 자유롭게 여러 가지 기능과 인자들을 바꾸어 가면서 다시 컴파일하고 결과를 실행시켜보면 좀 더 쉽게 NS-NAM을 이해할 수 있을 것입니다. 그리고 세 개, 네 개의 노드로 확대해서 더 많은 경험을 쌓아보기 바랍니다.
<출처> http://www.zdnet.co.kr/builder/system/network/0,39031676,39136738,00.htm
* 이 기사는 ZDNet Korea의 제휴매체인 마이크로소프트웨어에 게재된 내용입니다.
Network Simulator, NS는 네트워크 시뮬레이션을 위한 컴퓨터 언어 Object-oriented TcL(OTcl)를 컴파일하는 인터프리터(interpreter)입니다. 다시 말해서 NS-2를 사용하기 위해선 OTcl 언어를 사용하여 프로그램을 짜야 합니다. OTcl 스크립트는 프로그램이 이벤트 스케쥴러를 초기화하고 NS-2 라이브러리에 있는 네트워크 토포롤지들을 준비하여 각각의 네트워크 이벤트에 따른 전송 노드에서 수신 노드까지의 데이터의 흐름을 결정하게 됩니다.
NS-2에서 이벤트는 고급 사용자의 경우 기존의 OTcl 모듈들을 새롭게 작성한 OTcl 스크립트와 함께 컴파일하여 네트워크 컴포넌트로 사용하는데 그러기 위해서 새로 작성한 스크립트와 기존의 스크립트는 함께 컴파일되어야 합니다.
독자들이 작성하게 될 OTcl 파일(.tcl)을 컴파일하면 <그림 1>와 같은 이벤트가 일어납니다. 네트워크를 소프트웨어적으로 시뮬레이션한 후 그 결과를 기록한 파일 두 개가 생성되는데 그것이 out.nam과 out.tr입니다. out.nam은 Network-AniMator인 NAM의 실행을 위한 파일이며 out.tr은 네트워크에서 데이트의 흐름을 모니터링하고 시뮬레이션한 데이터의 각각의 이벤트에 따른 생성된 로그라고 할 수 있습니다.
<그림 1> .tcl 스크립트를 NS에서 실행했을 때의 전체 그림 |
| ||||||
| ||||||
|
NAM
NAM은 네트워크 디자인의 특성상 쉽게 눈으로 볼 수 없었던 데이터의 흐름과 구현된 네트워크 토폴로지를 애니메이션 효과를 통해 제공하는 툴입니다. 이러한 기능은 .tcl 스크립트가 컴파일된 후 생성된 out.nam이라는 파일을 이용하여 실행되며 디자인된 네트워크의 시각적인 해석을 가능하게 합니다. 여타의 멀티미디어 플레이어와 같은 손쉬운 동작 방법으로 네트워크를 제어할 수 있으며 각각의 링크에 패킷들의 수나 전체 Throughput 등이 쉽게 마우스 동작으로 나타내 집니다. 또한 각각의 노드는 드래그 앤 드롭으로 생성되거나 이동될 수 있는 기능도 있습니다.
<화면 1> NAM 설명하기 |
X-Graph
X-Graph는 X-윈도우의 응용 프로그램으로 그래핑(graphing) 과 플로팅(plotting)을 할 수 있는 툴입니다. 이러한 코딩은 .tcl 스크립트가 컴파일된 후 생성된 out.tr 파일을 이용하여 나타나며 .tcl 스크립트에서 다음과 같은 약간의 코딩으로 사용될 수 있습니다.
proc finish{} {
global f0 f1 f2
#Close the output files
close $f0
close $f1
close $f2
#call X-Graph to display the results
exec xgraph out0.tr ?geometry 800x400 &
exit 0
}
<화면 2> X-Graph의 3개의 Trace 분석 화면 |
점대점 노드와 링크 따라하기
이제부터 NS-2로 네트워크를 구성하기 위한 단계입니다. 간단한 예제를 통해 본격적으로 NS-NAM을 실습해 보도록 하겠습니다. 우선 점대점 토폴로지로 이루어진 두 개의 노드와 한 개의 링크를 NS-2로 구현하고 NAM으로 확인해 보도록 하겠습니다. 우리가 구현할 네트워크의 필요사항(requirement)은 두 개의 노드(노드 ‘0’과 ‘1’)가 있고 그 노드 사이에는 듀플렉스(duplex)로 연결된 링크가 있어야 합니다.
그리고 데이터는 UDP(User Defined Protocol, 사용자가 데이터 전송 크기를 정할 수 있는 프로토콜)를 사용하여 보내지며 CBR(Constant Bit Rate, 데이터 전송의 흐름을 항상 일정한 비율로 하는 것)을 사용하여 5초 동안 데이터를 보내야 합니다. 그리고 마지막에 NAM을 호출하여 우리의 실습 네트워크 토폴로지를 눈으로 볼 수 있고 시뮬레이션하도록 합니다. 그럼 노드를 생성하는 것부터 시작해 보겠습니다.
노드 생성과 연결
NS-2에서도 네트워크는 노드와 링크로 이루어진다. 노드와 링크에 패킷 데이터를 보내기 위해서는 NS가 시작되는 시간, 데이터를 보내기 시작하는 시간, 데이터를 전송 마지막 시간 등의 시간에 대한 전체적인 이벤트의 스케쥴을 지정해야 합니다.
시작 오브젝트 생성 -> set ns [new Simulator]
NS 시작 시간 설정 -> $ns at <time> <event>
NS 시작 -> $ns run
노드를 만들기 위해서는 ‘set’이라는 명령어를 사용합니다.
set n0 [$ns node]
set n1 [$ns node]
각각 ‘n0’와 ‘n1’을 지정하고 두 개의 노드 오브젝트를 생성했습니다. NAM에서 네트워크 흐름을 보기 좋게 나타내기 위해서 데이터 플로우에 색을 집어넣기도 하는데 방법은 다음과 같습니다. 색은 검정, 빨강, 파랑, 바다녹색 등이 있습니다.
$n0 color
생성된 노드를 링크로 연결하는 데에는 단 방향 전송(simplex)과 양 방향 전송(duplex)이 있습니다. 각각은 다음과 같이 설정됩니다.
A Simplex link(단 방향) -> $ns simplex-link $n0 $n1
<bandwidth><delay> <queue_type>
A duplex link(양 방향) -> $ns duplex-link $n0 $n1
<bandwidth> <delay> <queue_type>
밴드위스와 딜레이는 각각 1Mb와 10ms로 설정했으며 지난 호에 설명했던 큐는 먼저 들어온 데이터가 먼저 처리되는 FIFO(First In First Out)으로 설정하겠습니다. 이외에도 RED(Random Early Detection), Drop Tail, FQ(Fair Queuing) 등을 사용할 수 있습니다.
Agent와 애플리케이션
NS-2로 생성된 노드 오브젝트는 2개의 클래스를 사용하여 데이터 트래픽(traffic)을 생성합니다. 그것은 the class Agent and the class Application입니다. 각각의 노드는 데이터를 전송하고 수신하는 기능이 필요한데 이러한 일을 하는 것이 Agent입니다. 또한 Agent 위에 애플리케이션을 수행하게 되는 것입니다. 이러한 애플리케이션은 구현될 네트워크에서 데이터 트래픽의 종류를 결정하게 됩니다. NS-2에는 UDP와 TCP의 두 가지 Agent가 있습니다.
UDP
set udp0 [new Agent/UDP]
set null [new Agent/NULL]
$ns attach-agent $n0 $udp0 # udp Agent를 노드 n0에 붙입니다.
$ns attach-agent $n1 $null
$ns connect $udp $null # 2개의 Agent를 연결합니다.
이 코드는 UDP Agent를 만들어서 n0 노드에 붙이고 Null Agent를 만들어서 데이터가 노드 n1에 붙여서 물이 높은 곳에서 낮은 곳으로 흐르듯이 데이터를 흐르게 만들어 줍니다.
TCP
set tcp [new Agent/TCP]
set tcp_sink [new Agent/TCPSink]
$ns attach-agent $n0 $tcp # tcp Agent를 노드 n0에 붙입니다.
$ns attach-agent $n1 $tcp_sink
$ns connect $tcp $tcp_sink # 2개의 Agent를 연결합니다.
이 TCP 코드는 TCP Agent를 우선 생성하여 노드, n0에 붙이고 n1은 TCPSink agent로 설정한 후 데이터가 n0에서 n1로 트래픽이 전송될 수 있도록 합니다. NS-2에서는 TCP, TCP/Reno, TCP/Vegas, TCP/Sack1, TCP/Fack, TCPSink 등의 다양한 TCP 타입이 지정될 수 있습니다.
NS-2에는 데이터를 전송하는 방법에 따라 다른 4개의 트래픽 애플리케이션이 있습니다. 가장 쉽게 사용되는, 항상 일정한 비율로 데이터를 전송한다는 의미의 CBR(Constant Bit Rate)을 살펴보겠습니다. Agent를 생성한 후 파라미터들을 사용하여 새로운 오브젝트를 하나 만듭니다(다음의 경우, my_cbr). 그리고 다시 agent에 연결하여 애플리케이션을 완성합니다. 완성된 애플리케이션은 시간의 변수와 함께 실질적인 데이터 전송 시간을 결정할 수 있습니다.
set my_cbr [new Application/Traffic/CBR]
$my_cbr attach-agent $udp
$ns at <time> $my_cbr start
결정인자
start : 환경 변수에 기준해 패킷들을 보내기 시작하는 시간을 결정
stop : 패킷 전송을 중단
PacketSize_ : 일정하게 생성되는 패킷들의 크기를 결정하는 인자
rate_ : 전송 비율을 결정하는 인자
interval_ : 전송된 두개의 패킷간의 시간
maxpkts_ : 전송하는 최대 패킷 수
결정인자는 NS-2가 소프트웨어 시뮬레이션이기 때문에 매우 신중하고 수학적으로 계산해야 합니다. 적절한 패킷크기 지정과 전송 비율, 인터벌 설정은 다양하고 정확한 응용을 가능하게 해줍니다.
트레이싱
트레이싱(Tracing)은 시뮬레이션을 통해서 생성된 데이터의 로그를 저장하여 분석할 수 있도록 해줍니다. 트레이싱에는 패킷의 전송 시작 시간, 도착 시간, 전송 실패 패킷의 수와 전송로의 상태 등을 동적으로 기록하고 있습니다.
set trace_file [open out.tr w]
$ns trace-all $trace_file
$ns flush-trace
close $trace_file
성공적인 컴파일 후에는 out.tr이라는 trace 파일이 생성되어 다음과 같은 데이터를 저장하게 됩니다. 첫 번째 컬럼의 ‘+’는 큐에 들어오는 과정, ‘-’는 큐에서 나가는 시간, ‘r’은 이벤트가 생성되는 시간, ‘d’는 전송받은 패킷을 큐에서 드롭한 시간을 기록합니다. 11개의 각각의 컬럼에 관한 내용은 <표 1>과 같습니다.
+ 1.84375 0 2 cbr 210 ------- 0 0.0 3.1 225 610
- 1.84375 0 2 cbr 210 ------- 0 0.0 3.1 225 610
r 1.84471 2 1 cbr 210 ------- 1 3.0 1.0 195 600
d 1.84566 2 0 ack 40 ------- 2 3.2 0.1 82 602
| |||||||||||||||||||||||||||
| |||||||||||||||||||||||||||
|
<화면 3>은 이상의 내용을 하나에 묶어 hello-ns.tcl 파일로 저장하고 프롬프트 상태에서 ns hello-ns.tcl이라고 실행한 후에 나타난 out.nam 화면입니다. 컴파일이 성공적으로 수행되면 자동으로 out.tr 파일과 out.nam 파일이 생성됩니다. 이제 독자들은 처음으로 만든 시각적인 네트워크를 다양한 기능키를 상용해서 즐겨 볼 수 있습니다. 자유롭게 여러 가지 기능과 인자들을 바꾸어 가면서 다시 컴파일하고 결과를 실행시켜보면 좀 더 쉽게 NS-NAM을 이해할 수 있을 것입니다. 그리고 세 개, 네 개의 노드로 확대해서 더 많은 경험을 쌓아보기 바랍니다.
<화면 3> 두 개의 노드와 듀플렉스 연결 |
| ||
| ||
<출처> http://www.zdnet.co.kr/builder/system/network/0,39031676,39136738,00.htm
* 이 기사는 ZDNet Korea의 제휴매체인 마이크로소프트웨어에 게재된 내용입니다.
반응형