tcpdump -nn -tt -r myfirst-0-0.pcap

35
NS-3 Tutorial 2013.05.16 Hojin Lee

Upload: ngocong

Post on 06-Feb-2017

227 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: tcpdump -nn -tt -r myfirst-0-0.pcap

NS-3 Tutorial

2013.05.16Hojin Lee

Page 2: tcpdump -nn -tt -r myfirst-0-0.pcap

내용• NS-3 현황 / 설치• 핵심 클래스• 보조 클래스• 간단 예제• 로그• 트레이스• 그 외 ..

Page 3: tcpdump -nn -tt -r myfirst-0-0.pcap

시작하기 전에…• 이 슬라이드는 제가 만든 부분도 있지만 , 인터넷에서 검색되는 다른 분이 만든 슬라이드도 많이 이용했습니다 .

• 그 분들께 심심한 감사를…

Page 4: tcpdump -nn -tt -r myfirst-0-0.pcap

NS-3• Ns-3 is targeted at networking research.

Discrete event simulator

Packet level simulator

Layered architecture

Wired and wireless network

Page 5: tcpdump -nn -tt -r myfirst-0-0.pcap

NS-3 status• Periodic update

– Latest version is ns-3.17 (May 2013)

• Supporting platform– FreeBSD, Linux, SunOS, Solaris, Windows (cygwin), OS X

• Free, open source software project

• Website– http://www.nsnam.org/– Can find the doxygen, reference manual, and tutorial

Page 6: tcpdump -nn -tt -r myfirst-0-0.pcap

NS-3 components• Ns-3 simulator

• Pre-processing– Traffic / topology generation– Alignment with real systems (sockets, device driver interfaces)

• Post-processing– Ns-3 output file (trace file) analysis

• Throughput, delay, jitter, drop– Various tracing system– Graph

• xgraph, gnuplot

Page 7: tcpdump -nn -tt -r myfirst-0-0.pcap

NS-3 all-in-one package Directory Struc-ture

ns-allinone-3.12.1

ns-3.12.1 nsc-0.5.2 Pybindgen-0.15.0.795

bindings examplesbuild src

. . .

. . .

error-model

mobility

. . .. . .

network

csma

. . .

Example simulation scripts

Page 8: tcpdump -nn -tt -r myfirst-0-0.pcap

How to Install NS-3• Ns-3 download: http://www.nsnam.org/download.html

• ns-allinone-3.12.1.tar.bz2– [root@mwnl ~]# tar xvf ns-allinone-3.12.1.tar.bz2– [root@mwnl ~]# cd ns-allinone-3.12.1

• Building– [root@mwnl ~/ns-allinone-3.12.1]# ./build.py

• Setting environment – [root@mwnl ~/ns-allinone-3.12.1/ns-3.12.1]# ./waf –d optimized configure– [root@mwnl ~/ns-allinone-3.12.1/ns-3.12.1]# ./waf –d debug configure – [root@mwnl ~/ns-allinone-3.12.1/ns-3.12.1]# ./waf– [root@mwnl ~/ns-allinone-3.12.1/ns-3.12.1]# ./test.py –c core

Page 9: tcpdump -nn -tt -r myfirst-0-0.pcap

Simple Example• cd ns-allinone-3.12.1/ns-3.12.1• /ns-3.12.1$ ./waf --run scratch/scratch-simulator

• Output

Page 10: tcpdump -nn -tt -r myfirst-0-0.pcap

Workspace• /ns-allinone-3.12.1/ns-3.12.1/scratch

• Run program only in the scratch folder

• Run program by the commands be-low– ./waf --run scratch/example– (or) ./waf --run example

Page 11: tcpdump -nn -tt -r myfirst-0-0.pcap

핵심 클래스• Node

– 패킷을 주고 받는 노드– 이 자체는 특별한 기능이 없음– 여기에 네트워크 장치 , 네트워크 프로토콜 스택 등을 설치해야 함

• NetDevice– 네트워크 장치– PointToPointNetDevice, CsmaNetDevice, WifiNetDevice, …

• Channel– 네트워크 채널 : 정보가 흘러가는 논리적 경로– 일반적으로 NetDevice 와 1:1 대응– PointToPointChannel, CsmaChannel, WifiChannel, …

• Application– 응용– UdpEchoSever, UdpEchoClient, OnOffApplication, BulkSendApplication,

Page 12: tcpdump -nn -tt -r myfirst-0-0.pcap

NS-3 기본 모델

ApplicationApplication

Protocolstack

Node

NetDeviceNetDevice

ApplicationApplication

Protocolstack

Node

NetDeviceNetDevice

Sockets-like API

Channel

Channel

Packet(s)

Page 13: tcpdump -nn -tt -r myfirst-0-0.pcap

보조 클래스• 핵심클래스 + @ 로부터 시뮬레이션 시나리오 작성을 도와주는 클래스• XXXContainer

– 그릇 : 벡터를 품고 있음 일괄작업 용이• std::vector<Ptr<XXX> >

– 주요 멤버함수• Ptr<XXX> Get (uint32_t)• uint32_t GetN ()

– NodeContainer, NetDeviceContainer, Ipv4InterfaceContainer, Applica-tionContainer

• XXXHelper– 생성 및 설치를 도움

• 생성 : 공장 (ObjectFactory) 을 품고 있음– 주요 멤버함수

• SetYYY (…): 찍어낼 객체의 속성을 정함• Install (…): 객체를 생성해서 설치 (생성된 객체를 담아서 XXXContainer 로 리턴 )

Page 14: tcpdump -nn -tt -r myfirst-0-0.pcap

간단 예제 (1/3)

#include "ns3/core-module.h" #include "ns3/network-module.h" #include "ns3/internet-module.h" #include "ns3/point-to-point-module.h" #include "ns3/applications-module.h"

using namespace ns3; NS_LOG_COMPONENT_DEFINE ("FirstScriptExample"); int main (int argc, char *argv[])

{ LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO); LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO); NodeContainer nodes; nodes.Create (2); PointToPointHelper pointToPoint; pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps")); pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms")); NetDeviceContainer devices; devices = pointToPoint.Install (nodes);

• 노드 2 개 사이에 point-to-point 링크 , 패킷 한 개 echo

Page 15: tcpdump -nn -tt -r myfirst-0-0.pcap

간단 예제 (2/3) InternetStackHelper stack; stack.Install (nodes); Ipv4AddressHelper address; address.SetBase ("10.1.1.0", "255.255.255.0"); Ipv4InterfaceContainer interfaces = address.Assign (devices); UdpEchoServerHelper echoServer (9); ApplicationContainer serverApps = echoServer.Install (nodes.Get (1)); serverApps.Start (Seconds (1.0)); serverApps.Stop (Seconds (10.0)); UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9); echoClient.SetAttribute ("MaxPackets", UintegerValue (1)); echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.))); echoClient.SetAttribute ("PacketSize", UintegerValue (1024)); ApplicationContainer clientApps = echoClient.Install (nodes.Get (0)); clientApps.Start (Seconds (2.0)); clientApps.Stop (Seconds (10.0)); Simulator::Run (); Simulator::Destroy (); return 0; }

Page 16: tcpdump -nn -tt -r myfirst-0-0.pcap

간단 예제 (2/3)

• ../ns-3.12.1] ./waf –-run scratch/ex-ample1

• OutputSent 1024 bytes to 10.1.1.2Received 1024 bytes from 10.1.1.1Received 1024 bytes from 10.1.1.2

Page 17: tcpdump -nn -tt -r myfirst-0-0.pcap

로그 (1/2)• 맞게 잘 짰나?• 어 , 왜 안되지……?

– gdb– printf

• 컴포넌트별로 , 수준별로 로그를 on/off

• src/applications/model/udp-echo-client.ccNS_LOG_COMPONENT_DEFINE ("UdpEchoClientApplication");…void UdpEchoClient::Send (void) {NS_LOG_FUNCTION (this);…if (Ipv4Address::IsMatchingType (m_peerAddress)){NS_LOG_INFO ("At time " << Simulator::Now ().GetSeconds () << "s client sent " << m_size << " bytes to " << Ipv4Address::ConvertFrom (m_peerAddress) << " port " << m_peerPort);}…}

Page 18: tcpdump -nn -tt -r myfirst-0-0.pcap

로그 (2/2)• 로그 매크로

– NS_LOG_ERROR– NS_LOG_WARN– NS_LOG_DEBUG– NS_LOG_INFO– NS_LOG_FUNCTION– NS_LOG_LOGIC– NS_LOG_ALL– NS_LOG_UNCOND

• 로그 켜기– 시나리오 스크립트 수정 : LogComponent (“ 컴포넌트명” , 로그수준 )

• 로그 수준 : NS_ 제외 , LOG_LEVEL_XXX 로 하면 누적– 환경변수 : export 컴포넌트명 = 로그수준

• 로그수준 : 소문자 , NS_LOG_ 제외 , level_xxx 로 하면 누적

Page 19: tcpdump -nn -tt -r myfirst-0-0.pcap

트레이스• 시뮬레이션의 목적 – 성능 평가

– 트레이스로부터…• High level

– 시뮬레이터에서 제공하는 종합적인 트레이스 이용– 트레이스 파일을 나의 목적에 맞게 parsing 해야 함

• Low level– 내가 원하는 자료만 출력이 되도록 매번 직접 소스 코드를 수정

• Mid level– ???

Page 20: tcpdump -nn -tt -r myfirst-0-0.pcap

High Level (1/3)• IP 이상 계층

– void InternetStackHelper::EnableAsciiIpv4All (std::string pre-fix)

– void InternetStackHelper::EnablePcapIpv4All (std::string pre-fix)

• Mac 이상 계층– void AsciiTraceHelperForDevice::EnableAscii (std::string pre-

fix) – void PcapHelperForDevice::EnableAscii (std::string prefix)

+ 2 /NodeList/0/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Enqueue ns3::PppHeader (Point-to-Point Protocol: IP (0x0021)) ns3::Ipv4Header (tos 0x0 ttl 64 id 0 protocol 17 offset 0 flags [none] length: 1052 10.1.1.1 > 10.1.1.2) ns3::UdpHeader (length: 1032 49153 > 9) Payload (size=1024)- 2 /NodeList/0/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Dequeue ns3::PppHeader (Point-to-Point Protocol: IP (0x0021)) ns3::Ipv4Header (tos 0x0 ttl 64 id 0 protocol 17 offset 0 flags [none] length: 1052 10.1.1.1 > 10.1.1.2) ns3::UdpHeader (length: 1032 49153 > 9) Payload (size=1024)

Page 21: tcpdump -nn -tt -r myfirst-0-0.pcap

High Level (2/3)• PCAP Tracing

– .pcap file format– Traffic trace analyze– pointToPoint.EnablePcapAll (“myfirst”);

• Reading output with tcpdump$ tcpdump -nn -tt -r myfirst-0-0.pcapreading from file myfirst-0-0.pcap, link-type PPP (PPP)2.000000 IP 10.1.1.1.49153 > 10.1.1.2.9: UDP, length 10242.514648 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, length 1024

$ tcpdump -nn -tt -r myfirst-1-0.pcapreading from file myfirst-1-0.pcap, link-type PPP (PPP)2.257324 IP 10.1.1.1.49153 > 10.1.1.2.9: UDP, length 10242.257324 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, length 1024

Page 22: tcpdump -nn -tt -r myfirst-0-0.pcap

High Level (3/3)• Reading output with Wireshark• http://www.wireshark.org/download.html

Page 23: tcpdump -nn -tt -r myfirst-0-0.pcap

Mid Level• Trace source 와 trace sink 의 분리

– Trace source• 원천 , • 관심이 있는 상태의 변화가 발생하거나 , 관심 있는 데이터 변경 시 그 이벤트를 생성 • 평소에는 비활성화 , trace sink 와 연결 (connect) 해야 활성화 됨• 미리 프로그램되어 있음

– Trace sink• 이벤트 및 관련 정보를 소비• 사용자가 추가

Page 24: tcpdump -nn -tt -r myfirst-0-0.pcap

Mid Level• Callback

– The object is to allow a piece of code to call a function without any spe-cific inter-module dependency

– Treat the address of the called function as a variable, i.e. a pointer-to-function variable

– Decouple the calling function from the called class completely

• Relation between tracing system and callback– A trace source is a callback– When a trace sink wants to know information given by a trace source, it

add its own function to the callback list.

• It is good for students who want to know callbacks further to refer callback part in ns-3 manual pp.12-14.

Page 25: tcpdump -nn -tt -r myfirst-0-0.pcap

간단 예제 (1/2)#include "ns3/object.h"#include "ns3/uinteger.h"#include "ns3/traced-value.h"#include "ns3/trace-source-accessor.h"#include <iostream>

using namespace ns3;class MyObject : public Object{public: static TypeId GetTypeId (void) { static TypeId tid = TypeId ("MyObject") .SetParent (Object::GetTypeId ()) .AddConstructor<MyObject> () .AddTraceSource ("MyInteger",

"An integer value to trace.", MakeTraceSourceAccessor (&MyObject::m_myInt)) ; return tid; } MyObject () {} TracedValue<int32_t> m_myInt;};

Provides the “hooks” used for connecting the trace source to the outside the config system

Provides the infrastructure that overloads the operators and drives callback process

Page 26: tcpdump -nn -tt -r myfirst-0-0.pcap

간단 예제 (2/2)voidIntTrace (int32_t oldValue, int32_t newValue){std::cout << "Traced " << oldValue << " to " << newValue << std::endl;}

intmain (int argc, char *argv[]){ Ptr<MyObject> myObject = CreateObject<MyObject> (); myObject->TraceConnectWithoutContext ("MyInteger", MakeCallback(&IntTrace)); myObject->m_myInt = 1234;}

Trace sink; callback function: this function will be called whenever the overloaded operators of the TracedValue is excuted

Connect between trace source and trace sink

Operator”=” invoke the Callback

Page 27: tcpdump -nn -tt -r myfirst-0-0.pcap

Mid Level• TracedValue <xxx>

– 연산자 overloading– Callback 함수의 인자가 고정

• TracedCallback <…>– TracedValue 보다 flex-

ible

Page 28: tcpdump -nn -tt -r myfirst-0-0.pcap

TracedCallback 간단 예제voidCourseChange (std::string context, Ptr<const MobilityModel> model){ Vector position = model->GetPosition (); NS_LOG_UNCOND (context << " x = " << position.x << ", y = " << position.y);}

//Trace Sink

std::ostringstream oss;oss << "/NodeList/" << wifiStaNodes.Get (nWifi - 1)->GetId () << "/$ns3::MobilityModel/CourseChange";//Config Path

Config::Connect (oss.str (), MakeCallback (&CourseChange));//Connection between Trace Source and Sink

Output Result:/NodeList/7/$ns3::MobilityModel/CourseChange x = 7.27897, y = 2.22677…

Page 29: tcpdump -nn -tt -r myfirst-0-0.pcap

Mid Level• bool ObjectBase::TraceConnectWithoutContext

(std::string name, const CallbackBase& cb)

• void Config::ConnectWithoutContext (std::string path, const Callback& cb)– 멤버 함수 아님 (Config – namespace)

• path

• Trace sources– http://www.nsnam.org/docs/release/3.16/doxygen/group___

trace_source_list.html

Page 30: tcpdump -nn -tt -r myfirst-0-0.pcap

Config• name, full name attribute system

• void Config::SetDefault (std::string name, const AttributeValue& value)

• void Config::Set (std::string path, const At-tributeValue& value)

• AttributeValue– IntegerValue, UintegerValue, DoubleValue,

StringValue, …

Page 31: tcpdump -nn -tt -r myfirst-0-0.pcap

NS-3 Type System• The aggregation mechanism needs information about

the type of objects at runtime• The attribute mechanism needs information about

the attributes supported by a specific object• The tracing mechanism needs information about the

trace sources supported by a specific object

• All this information is stored in NS-3::TypeId;– The parent type– The name of the type– The list of attributes (their name, their type, etc.)– The list of trace sources (their name, their type, etc.)

NS-3 31

Page 32: tcpdump -nn -tt -r myfirst-0-0.pcap

시뮬레이션 파라미터 설정 (1/2)• 명령행 인자로 시뮬레이션 파라미터를 바꿀 수 있음• main 함수 내에 아래 두 줄 추가

CommandLine cmd;cmd.Parse (argc, argv);

• 예제– ./waf --run "scratch/example1 --PrintHelp”– ./waf –-run “scratch/example1 --

PrintAttributes=ns3::PointToPointNetDevice”– ./waf --run “scratch/example1 --

ns3::PointToPointNetDevice::DataRate=5Mbps –ns3::PointToPointChannel::Delay=2ms”

Page 33: tcpdump -nn -tt -r myfirst-0-0.pcap

시뮬레이션 파라미터 설정 (2/2)• 명령행 인자 변수를 추가할 수 있음

– cmd.AddValue (…) 이용

• 예제int main (int argc, char *argv[]){

uint32_t nPackets =1;

CommandLine cmd;cmd.AddValue("nPackets", "Number of packets to echo", nPackets);Cmd.Parse (argc, argv);…echoClient.SetAttribute (“MaxPackets”, UintegerValue (nPackets));

• ./waf --run “scratch/example1 --nPackets=2”

Page 34: tcpdump -nn -tt -r myfirst-0-0.pcap

TIPs• 작은 걸음• Refactoring

– 중복제거 , 가독성– 부채

• 사람의 실수가 개입할 여지가 없게• 구체화와 추상화

Page 35: tcpdump -nn -tt -r myfirst-0-0.pcap

추천 도서• 실용주의 프로그래머

• 리팩터링 : 코드 품질을 개선하는 객체지향 사고법

• 임베디드 C를 위한 TDD

• 테스트 주도 개발

• 익스트림 프로그래밍