360 likes | 1.16k Views
1 장 네트워크 시뮬레이터 (NS2) 소개 1. NS2 란 무엇인가 ? 2. NS2 설치 및 시뮬레이션. 이 완 직 ( wjlee@pnu.ac.kr ) 2010 년 1 학기. 1. NS2 란 무엇인가 ?. 1.1 NS2 (Network Simulator version 2) 소개 네트워킹을 연구하기 위해 개발된 이벤트 기반 (Event-driven) 의 시뮬레이터 적용범위 IP, TCP, UDP, HTTP 등의 TCP/IP 프로토콜 패밀리 라우팅 프로토콜 , 멀티캐스트 라우팅 프로토콜
E N D
1장 네트워크 시뮬레이터(NS2) 소개1.NS2란 무엇인가? 2.NS2 설치 및 시뮬레이션 이 완 직 (wjlee@pnu.ac.kr) 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 계열의 운영 체제 • 장점: 무상으로 지원됨
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 알파버전 릴리즈
1.1 NS2 시뮬레이터 소개 • NS2 추가 기능 • TCP 여러 버전(Reno, Vegas, SACK) • CBQ(Class Based Queueing) 스케줄링 알고리즘 • 동적 라우팅 알고리즘, Multi-path Routing, • Dense-Mode 멀티캐스팅, Mobile 환경 지원 • 트래픽 흐름(Traffic Flow) 관리자, Telnet 소스 • 현재도 계속 기능이 추가되며, 성능 개선 작업도 진행 중 • 지금까지 개발된 많은 네트워크 알고리즘 솔루션을 활용할 수 있음
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)
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
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를 사용하며 이는 메소드를 통해서만 가능
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)
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
1.3 스크립트 언어와 C++ 클래스 • NS2 시뮬레이션 구현 원리 • 앞 페이지의 OTCL의 window_ 의 값을 사용하는 소스는 결국 C++ 구현 소스에 포함 • NS2 확장을 위해서는 이러한 관계를 파악하는 것이 중요 • 그림 1-8(pp. 14)은 NS2의 node에 대한 OTCL과 C++의 관계를 보여줌 • 그림 1-9 (pp. 15) • ns-allinone-2.27 패키지의 디렉토리 구조
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)
2장. NS2 설치 및 시뮬레이션1. NS2 다운로드 및 설치 2. 간단한 시뮬레이션 실행 3. 시뮬레이션 실행 4. 시뮬레이션의 trace 결과 고찰 5. 시뮬레이션 전체 과정 6. New Elements 추가 및 NS 시뮬레이터 확장
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
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
2.2 간단한 시뮬레이션 실행 • 예제 1: 실행 및 결과는 그림 2-18 ~ 2-20 참조
2.2 간단한 시뮬레이션 실행 • 예제2: 시뮬레이션 토폴로지는 그림 2-21, 결과는 그림 2-22 (pp. 35) 참조
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”: 드롭된 패킷
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
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)
2.5 시뮬레이션 전체 과정 • 그림 2-29 (pp. 47) 참조 • Creating a new simulator object set ns [new Simulator] • 시뮬레이터 인스턴스 생성, 패킷 포맷 초기화, 스케줄러 생성 • 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)]”
2.5 시뮬레이션 전체 과정 • 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 …… • 라우팅 프로토콜 정의 • NS2에서는 Unicast Routing/Multicast Routing/Hierarchical Routing 지원 • 언급이 없을 경우, Unicast Routing 프로토콜이 적용
2.5 시뮬레이션 전체 과정 • Transport Layer 구현 • TCP agent나 UDP agent 연결 설정(그림 2-31 참조) set tcp0 [$ns create-connection TCP/Reno $node_(h1) TCPSink/DelAck $node_(h4) 0] • Application Layer 구현 • 전송할 트래픽 생성하여 attach 함 • 예를 들어 FTP 트래픽을 생성 시킬 경우 (그림 2-32 참조) set ftp0 [$tcp0 attach-app FTP] • 에러 모델 추가 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 // 에러모듈 삽입
2.5 시뮬레이션 전체 과정 • NS2 시뮬레이터 시작 및 종료 • 트래픽 생성 시간 설정 $ns at 1.0 “$ftp0 start” • 트래픽 생성 종료 시간 설정 $ns at 17.0 “$ftp0 stop” • NS2 시뮬레이터 시작 $ns run // 이 명령어는 반드시 스크립트 코드의 마지막에 위치시킨다. • NS2 시뮬레이터 종료 exit 0
2.6 New Elements 추가 및 NS 확장(?) • 시뮬레이션 확장 절차(그림 2-33, pp. 53) 클래스 계층의 위치 결정 (어떤 클래스에서 파생할 것인지 결정함) new 패킷 헤더가 필요하다면 이를 생성한다. C++ 클래스를 생성한 후, 클래스에 메소드를 채워 넣는다. OTCL 연결(linkage)를 정의한다. OTCL 코드 작성 Build & Debug
2.6 New Elements 추가 및 NS 확장 • 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를 이용하여 새로운 형태의 패킷 타입 추가
2.6 New Elements 추가 및 NS 확장 • 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/ 상에서)
2.6 New Elements 추가 및 NS 확장 • Example: NS2에 새로운 프로토콜(ping) 추가 • 자세한 ‘ping’ 구현은 교재 12.4절에 설명 • 목적: ping 전송 후, 응답을 받아 RTT 시간 측정 • 헤더 파일 ping.h Class PingAgent 선언
2.6 New Elements 추가 및 NS 확장 • C++ 코드 • C++ 코드와 Tcl 코드 간의 연결(linkage)를 위한 코드 • class PingAgent 의 생성자 코드 • Tcl과 C++에서 공유할 수 있는 변수 바인딩을 수행
2.6 New Elements 추가 및 NS 확장 • PingAgent()::command 메소드 • Tcl 코드가 아래와 같이 구현되었을 경우, 이를 처리하기 위해 코드 set pa [new Agent/Ping] $pa send
2.6 New Elements 추가 및 NS 확장 • PingAgent()::recv 메소드 tcl.eval() 함수는 Tcl 함수의 recv()를 호출 (how?) 하는데, 이에 대한 코드는 Tcl 코드 부분에서 설명함.
2.6 New Elements 추가 및 NS 확장 • 추가 변경사항 • NS2의 packet.h 파일에 Ping 프로토콜 ID 정의 • p_info 클래스에 프로토콜 명칭 저장
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 추가
2.6 New Elements 추가 및 NS 확장 • Tcl 코드 • echo패킷을 수신하였을 때, 호출되는 recv 프로시져 • 어디서 작성?, 어떻게 호출?