1장 네트워크 시뮬레이터(NS2)

Download Report

Transcript 1장 네트워크 시뮬레이터(NS2)

1장 네트워크 시뮬레이터(NS2) 소개
1. NS2란 무엇인가?
2. NS2 설치 및 시뮬레이션
이 완 직 ([email protected])
2010년 1학기
1. NS2란 무엇인가?
• 1.1 NS2 (Network Simulator version 2) 소개
– 네트워킹을 연구하기 위해 개발된 이벤트 기반(Event-driven)의
시뮬레이터
– 적용범위
•
•
•
•
IP, TCP, UDP, HTTP 등의 TCP/IP 프로토콜 패밀리
라우팅 프로토콜, 멀티캐스트 라우팅 프로토콜
RTP, SRN(Scalable Reliable Network)
Ad-hoc 네트워크, WLAN, Mobile-IP, UMTS
– 동작 환경: 모든 Linux/UNIX 계열의 운영 체제
– 장점: 무상으로 지원됨
2
1.1 NS2 시뮬레이터 소개
• NS2 탄생 배경
– REAL 네트워크 시뮬레이터
• 콜롬비아 대학의 시뮬레이션 테스트베드인 NEST 기반
• 1989년 LBNL(LBL) 연구 그룹이 개발
– NS1
• REAL 기반, VINT 프로젝트 일환, DARPA 자금 지원으로 1995년 개
발
• 확장된 Tcl 스크립트 언어 사용
– NS2
• 1996년 발표, NS1과 Backward 호환성 지원
• MIT가 개발한 Otcl 사용
• NS1에 포함되지 않은 여러 프로토콜, 스케줄링 알고리즘들이 포함
– NS3
• 2006년 발표, 현재 3.04 알파버전 릴리즈
3
1.1 NS2 시뮬레이터 소개
• NS2 추가 기능
–
–
–
–
–
TCP 여러 버전(Reno, Vegas, SACK)
CBQ(Class Based Queueing) 스케줄링 알고리즘
동적 라우팅 알고리즘, Multi-path Routing,
Dense-Mode 멀티캐스팅, Mobile 환경 지원
트래픽 흐름(Traffic Flow) 관리자, Telnet 소스
• 현재도 계속 기능이 추가되며, 성능 개선 작업도 진행 중
• 지금까지 개발된 많은 네트워크 알고리즘 솔루션을 활용
할 수 있음
4
1.2 NS2 시뮬레이터의 기본 구조
• 그림 1-1 참조(pp. 5)
• 특징
– 이벤트 스케줄러(Event Scheduler)와 IP기반의 네트워크 컴포넌트를 기반,
Event-driven 형태의 동작 방식
• 사용 프로그램 언어
– OTCL(Object TCL): 객체 지향 개념의 스크립트 언어
– C++
• TclCl: Otcl과 C++를 연동
• 네트워크 컴포넌트
– 노드(Node), 링크(Link), 큐(Queue), 에이전트(Agent) 등을 포함
• OTCL 클래스 계층구조: 그림 1-2 참조(pp.6)
5
1.3 스크립트 언어와 C++ 클래스
• TCL (Tool Command Language)
– 변수나 제어 구조와 같은 프로그래밍 툴이면서, C 라이브러리 인터
페이스를 활용한 언어 확장성이 높음
– X-Window 툴킷인 tk와 연동하여 쉽게 GUI 사용자 인터페이스 구현
• 그림 1-3 TCL 소스 예제 (pp. 7)
– proc test {}
•
프로시져 정의
– set a 43
• 할당문, a 변수에 43을 할당하라. 할당문에 의해 변수는 자동선언
– [expr …]
• []안의 표현식을 계산하여 리턴
– puts
• 문자열 출력하는 명령어
– 실행
• # ns <파일명>.tcl
6
1.3 스크립트 언어와 C++ 클래스
• OTCL 개념
– OTCL은 TCL에 OOP 개념을 도입, C++에 비해 간결하고 이식이나 상속에
장점
• OTCL과 C++과의 차이점
– 클래스 정의
• 단일 클래스를 사용하는 C++에 비해(?) 여러 개의 클러스 정의가 가능
– 생성자와 소멸자
• 생성자 대신 init instproc 프로시져 사용
• 소멸자 대신 destroy instproc 프로시져 사용
– 메소드 호출
• OTCL에서 메소드는 항상 오브젝트를 통해서만 call
• self 가 C++에서의 this와 유사한 기능을 수행
– 메소드를 찾기 위한 next
• C++에서는 메소드 이름을 통해 숨겨진 메소드를 호출하지만, OTCL에서는 next
를 사용
• next는 숨겨진 (상위 클래스의) 메소드 찾기 위해 상속 그래프를 거슬러 올라가면
서 검색
– 변수 접근과 공유를 위한 $class (?)
• C++에서는 static 메소드와 변수 사용을 피하기 위해 static 문법을 사용
• OTCL에서는 클래스 오브젝트 상에 있는 변수를 접근하거나 공유할때 $class를
사용하며 이는 메소드를 통해서만 가능
7
1.3 스크립트 언어와 C++ 클래스
• OTCL 소스 예제: 그림 1-5 (pp. 11)
– Class mom, Class kid –superclass mom
• mom과 kid 클래스 생성
• kid는 mom의 자식 클래스며 mom으로부터 상속(-superclass)
– mom instproc greet {}
• mom의 멤버함수 greet 정의(instproc)
– $self instvar age_
• self: 현재 클래스를 의미
• instvar: 멤버 변수를 정의, 클래스나 슈퍼클래스에서 이미 명시된
이름인지를 체크, 동일 변수 명이 존재할 경우 참고만 할 뿐, 새로
생성하지 않는다.
– set a [new mom]
• new 명령어를 이용하여 클래스 인스턴스 생성, 변수 a로 명명
– 실행 결과
• 그림 1-6 참조 (pp. 12)
8
1.3 스크립트 언어와 C++ 클래스
• 스크립트 언어와 C++ 상관관계
– C++: 시뮬레이션을 위한 노드와 에이전트 내부 기능 기술, 주로
빠른 처리가 필요한 부분
– OTCL: 시뮬레이션을 위한 이벤트 설정, 기능 구조가 자주 변경
되는 부분
• 하지만 절대적인 것은 아님
– C++과 OTCL의 쌍대성(duality): 그림 1-7 (pp. 13) 참조
• C++에서 먼저 이벤트에 대한 클래스가 정의되면, OTCL에서는 그
클래스에 정의된 함수를 사용하는 상호 관계
– bind(): C++ 멤버함수와 OTCL 오브젝트 함수를 묶어줌 (일종의
인수 전달)
• bind()의 C++ 멤버함수
TcpAgent::TcpAgent() {
bind(“window_”, &wind_);
}
• bind()의 OTCL 스크립트
$tcp set window_ 200
9
1.3 스크립트 언어와 C++ 클래스
• NS2 시뮬레이션 구현 원리
– 앞 페이지의 OTCL의 window_ 의 값을 사용하는 소스는 결국
C++ 구현 소스에 포함
– NS2 확장을 위해서는 이러한 관계를 파악하는 것이 중요
– 그림 1-8(pp. 14)은 NS2의 node에 대한 OTCL과 C++의 관계를
보여줌
– 그림 1-9 (pp. 15)
• ns-allinone-2.27 패키지의 디렉토리 구조
10
1.4 NS2 시뮬레이터의 특징
• NAM (Network AniMator)
– 작성한 스크립트의 시뮬레이션 실행, 결과를 애니메이션 툴로 보
여주는 기능 수행
– Interactive 방식의 시뮬레이션 제어 수행
– 그림 1-10, 1-11 참조 (pp. 16)
• trace-all
– 시뮬레이션 시의 패킷 상태를 추적할 수 있는 자료 생성
– 그림 1-12 (pp. 17)
• xgraph
– trace-all 에서 생성된 패킷 자료를 그래픽 형식으로 표현하는 툴
– 그림 1-13 (pp. 17)
11
2장. NS2 설치 및 시뮬레이션
1. NS2 다운로드 및 설치
2. 간단한 시뮬레이션 실행
3. 시뮬레이션 실행
4. 시뮬레이션의 trace 결과 고찰
5. 시뮬레이션 전체 과정
6. New Elements 추가 및 NS 시뮬레이터 확장
12
2.1 NS2 시뮬레이터 다운로드 및 설치
•
다운로드 사이트
– www.isi.edu/nsnam/ns/tutorial/index.html
– www.ee.surrey.ac.kr/Personal/L.Wood/mirror
•
파일명
– ns-allinone-2.34.tar.gz
•
설치과정
# tar zxvf ns-allinone-2.34.tar.gz
# cd ns-allinone-2.34
# ./install
•
셀에 PATH 명령 추가
# cd
# vi .bash_profile
13
2.2 간단한 시뮬레이션 실행
• 예제 1
– 네트워크 설계 절차
• 네트워크 토폴로지
– 노드 생성 및 링크 설정(대역폭, 지연, 큐 특성 등)
• 네트워크 시나리오
– 노드의 트래픽 에이전트 설정: 전송계층 프로토콜(TCP, UDP) 지정
– 응용 서비스 설정: FTP, HTTP, Telnet, CBR(Constant Bit Rate) 등의 트래
픽 type 지정
– 예제1의 설정 값
• 토폴로지: 그림 2-14 (pp. 25)
• 노드 특성 (표 2-1)
– 송신노드:0, 수신노드:1
– Queue Type: DropTail (Overflow 시에 Drop)
– 패킷 크기: 500 Byte, 인터벌: 5ms
• 링트 특성 (표 2-2)
– Duplex Link, Bandwidth: 1 Mbps, Delay: 10ms
• 프로토콜 설정 (표 2-3)
– 전송계층: UDP, 응용계층: CBR
• 시뮬레이션 시간 (그림 2-15)
– 전체시간: 0 ~ 5 sec
– 트래픽 발생 시간: 0.5 ~ 4.5 sec
14
2.2 간단한 시뮬레이션 실행
• 예제 1: 실행 및 결과는 그림 2-18 ~ 2-20 참조
15
2.2 간단한 시뮬레이션 실행
•
예제2: 시뮬레이션 토폴로지는 그림 2-21, 결과는 그림 2-22 (pp. 35) 참조
16
2.3 시뮬레이션 실행
• 이벤트 추적 및 기록
– 시뮬레이션 시에 패킷에 관한 모든 이벤트를 추적하는 코드 추가
– basic_traceall.tcl
•
•
•
•
2.2절 예제1 basic.tcl에 패킷이벤트를 기록을 위한 코드 첨가
추가 코드는 그림 2-23(pp. 37) 참조
out.tr 파일에 모든 패킷 이벤트를 저장(그림 2-24)
기존 out.nam은 nam에 의해 패킷 전달 과정을 애니메이션으로만
보여줌
• trace 파일 포맷
– 그림 2-25 (pp. 38) 참조
– event
•
•
•
•
“+”: 큐에 들어오는 패킷
“-”: 큐에서 나가는 패킷
“r”: 다른 노드에서 도착한 패킷
“d”: 드롭된 패킷
17
2.3 시뮬레이션 실행
• trace 파일 포맷 (계속)
–
–
–
–
–
–
–
time: 패킷 이벤트 발생 시간
from node/to node: 패킷 이동 경로
pkt type: CBR, TCP, UDP, ACK 등
pkt size
flags: Congestion 관련 등의 flag 표시
fid: flow ID (IPv6)
src addr/dst addr
• node.port 형태
– seq num: 패킷 순서 번호
– pkt id: 패킷의 유일한(unique) ID
18
19
2.4 시뮬레이션의 trace 결과 고찰
• awk, grep: trace 파일의 조작 (필터링/검색/계산)
• xgraph, tracegraph2: trace 결과를 그래픽으로 출력
• “awk”를 이용하여 파일로부터 그래프 그리기
– awk
• trace 파일에서 특정 컬럼을 추출하거나 계산하는 용도로 많이 활용
• awk ‘{print $1, $3}’ awk-ex4.tr | xgraph
– awk-ex4.tr 파일 각 행의 1번, 3번 컬럼만 추출하여 xgraph로 출력
• awk ‘{if ($2 != 0) print $1, 2.0*$5/$2}’ awk-ex4.tr | xgraph
– awk-ex4.tr 파일의 각 행 중, 2번 컬럼이 0이 아니면 1번 컬럼 값과 “2.0*5번컬럼
값/2번컬럼값” 계산 결과를 추출하여 xgraph로 출력
– grep
• trace 파일에서 특정 패턴을 검색하여, 패턴이 존재하는 행만 추출하는 기능
을 수행
• grep “0 1 cbr” out.tr > out1.tr
– xgraph/tracegraph2: 생략
• 교재 참조 (pp. 41~46)
20
2.5 시뮬레이션 전체 과정
•
그림 2-29 (pp. 47) 참조
1) Creating a new simulator object
set ns [new Simulator]
•
시뮬레이터 인스턴스 생성, 패킷 포맷 초기화, 스케줄러 생성
2) Turn on Tracing
–
NS trace를 위한 파일 오픈
set f [open out.tr w]
$ns trace-all $f
–
nam trace를 위한 파일 오픈
set nf [open out.nam w]
$ns namtrace-all $nf
–
사용자 임의의 trace 파일 오픈
set my_f [open my_out.tr w]
puts $my_f “[$ns now] [expr $x(1) + $y(1)]”
21
2.5 시뮬레이션 전체 과정
3) Creating a Network
–
step1: 네트워크 토폴로지 결정: 그림 2-30 (pp. 49) 참조
–
step2: 노드 생성
set node_(h1) [$ns node]
set node_(h2) [$ns node]
set node_(r1) [$ns node]
……
–
step 3: 링크와 큐 생성
$ns duplex-link $node_(h1) $node_(r1) 10Mb 2ms DropTail
$ns duplex-link $node_(h2) $node_(r2) 10Mb 3ms DropTail
$ns duplex-link $node_(r1) $node_(r2) 1.5Mb 20ms DropTail
……
4) 라우팅 프로토콜 정의
–
–
NS2에서는 Unicast Routing/Multicast Routing/Hierarchical Routing 지원
언급이 없을 경우, Unicast Routing 프로토콜이 적용
22
2.5 시뮬레이션 전체 과정
5) Transport Layer 구현
–
TCP agent나 UDP agent 연결 설정(그림 2-31 참조)
set tcp0 [$ns create-connection TCP/Reno $node_(h1) TCPSink/DelAck
$node_(h4) 0]
6) Application Layer 구현
–
–
전송할 트래픽 생성하여 attach 함
예를 들어 FTP 트래픽을 생성 시킬 경우 (그림 2-32 참조)
set ftp0 [$tcp0 attach-app FTP]
7) 에러 모델 추가
set loss_module [new ErrorModel]
$loss_module set rate_ 0.01
// 1% 에러 확률
$loss_module unit pkt
// 기본 에러 단위
$loss_module ranvar [new RandomVariable/Uniform]
$loss_module drop-target [new Agent/Null]
$ns lossmodel $loss_module $n0 $n1
// 에러모듈 삽입
23
2.5 시뮬레이션 전체 과정
8) NS2 시뮬레이터 시작 및 종료
①
트래픽 생성 시간 설정
$ns at 1.0 “$ftp0 start”
②
트래픽 생성 종료 시간 설정
$ns at 17.0 “$ftp0 stop”
③
NS2 시뮬레이터 시작
$ns run
④
// 이 명령어는 반드시 스크립트 코드의 마지막에 위치시킨다.
NS2 시뮬레이터 종료
exit 0
24
2.6 New Elements 추가 및 NS 확장(?)
• 시뮬레이션 확장 절차(그림 2-33, pp. 53)
클래스 계층의 위치 결정
(어떤 클래스에서 파생할 것인지 결정함)
new 패킷 헤더가 필요하다면 이를
생성한다.
C++ 클래스를 생성한 후,
클래스에 메소드를 채워 넣는다.
OTCL 연결(linkage)를 정의한다.
OTCL 코드 작성
Build & Debug
25
2.6 New Elements 추가 및 NS 확장
1) New Elements 추가
<step 1> *.cc C++ 코드
ns-allinone-2.34/ns-2.34/Makefile 내부에 OBJ_CC = ***.o 추가
<step 2> *.h Header 코드
C++ 코드를 추가한 후, new 패킷 타입에서 다루는 자료구조 선언
<step 3> *.tcl OTCL 라이브러리
ns-allinone-2.34/ns-2.34/Makefile 내부에 NS_TCL_LIB = ***.tcl
추가
<step 4> New Application
ns-allinone-2.34/ns-2.34/packet.h 내부에 PT_NEW를 이용하여 새
로운 형태의 패킷 타입 추가
26
2.6 New Elements 추가 및 NS 확장
2) OTCL 및 C++ 확장
– Otcl 내부에서 확장 (라이브러리 확장)
ns-lib.tcl 내부에서 새로 작성된 파일을 source 시킴
source ../yoursrc/msg.tcl
– C++ 에서의 확장
<step 1> Makefile 변경 (?)
NS_TCL_LIB = \
……
tcl/mysrc/msg.tcl
<step 2> make depend 실행 (~/ns-allinone-2.34/ 상에서)
<step 3> make 실행 (~/ns-allinone-2.34/ 상에서)
27
2.6 New Elements 추가 및 NS 확장
3) Example: NS2에 새로운 프로토콜(ping) 추가
– 자세한 ‘ping’ 구현은 교재 12.4절에 설명
– 목적: ping 전송 후, 응답을 받아 RTT 시간 측정
① 헤더 파일
ping.h
Class PingAgent 선언
28
2.6 New Elements 추가 및 NS 확장
② C++ 코드
• C++ 코드와 Tcl 코드 간의 연결(linkage)를 위한 코드
• class PingAgent 의 생성자 코드
- Tcl과 C++에서 공유할 수 있는 변수 바인딩을 수행
29
2.6 New Elements 추가 및 NS 확장
•
PingAgent()::command 메소드
- Tcl 코드가 아래와 같이 구현되었을 경우, 이를 처리하기 위해 코드
set pa [new Agent/Ping]
$pa send
30
2.6 New Elements 추가 및 NS 확장
•
PingAgent()::recv 메소드
tcl.eval() 함수는 Tcl 함수의 recv()를 호출 (how?)
하는데, 이에 대한 코드는  Tcl 코드 부분에서
설명함.
31
2.6 New Elements 추가 및 NS 확장
③ 추가 변경사항
• NS2의 packet.h 파일에 Ping 프로토콜 ID 정의
•
p_info 클래스에 프로토콜 명칭 저장
32
2.6 New Elements 추가 및 NS 확장
•
tcl/lib/ns-default.tcl 수정: Ping에 대한 디폴트 패킷 사이즈 정의
•
tcl/lib/ns-packet.tcl 수정: off_ping_ 엔트리 추가
•
~/ns-allinone-2.34/Makefile 수정: ping.o 추가
33
2.6 New Elements 추가 및 NS 확장
④ Tcl 코드
• echo패킷을 수신하였을 때, 호출되는 recv 프로시져
• 어디서 작성?, 어떻게 호출?
34