1 / 49

Network Simulator ns-2: An Overview and Tutorial

This tutorial provides an overview of the network simulator ns-2, its features, and how to use it for performance evaluation and protocol development. It includes examples and step-by-step instructions.

delavega
Download Presentation

Network Simulator ns-2: An Overview and Tutorial

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 15-744: Computer Networking L-3 The network simulator ns-2 Slides loosely based on a tutorial by Polly Huang, ETH Zurich.

  2. What is ns? • Network simulator • VINT Project -- Virtual Internet Testbed • Collaboration of many institutes • AT&T • UC Berkeley • XEROX PARC • ETH • Goals

  3. ns --- what is it good for? Used to: • Evaluate performance of existing • network protocols. • Prototyping and evaluation of new protocols. • Large-scale simulations not possible • in real experiments.

  4. ns • Event-driven simulator • Packet level • Link layer and up How does it work:

  5. Otcl / Tcl tclcl C++ Development Status • 100K lines of C++ code • 70K lines of otcl code • 20K lines of documentation Current status:

  6. Pure C++ objects Pure OTcl objects C++/OTcl split objects OTcl C++ ns otcl and C++: The Duality Your ns-script

  7. Class mom mom instproc init {age} { $selfinstvar age_ set age_ $age } mom instproc greet {} { $selfinstvar age_ puts “$age_ years old mom: How are you doing?” } set a [new mom 45] $a greet Basic otcl • instead of single class declaration multiple definitions • instproc adds method • instvar adds instance variable • methods are always called through object ( $self) • init instproc instead of constructor

  8. Class kid -superclass mom kid instproc greet {} { $selfinstvar age_ puts “$age_ years old kid: What’s up, dude?” } set b [new kid 15] $b greet Basic otcl - inheritance

  9. Basic structure of ns-scripts • Creating the event scheduler • [Tracing] • Creating network topology • Creating Transport Layer - Agents • Creating Applications - Applications • Events!

  10. Creating Event Scheduler • Create scheduler • set ns [new Simulator] • Schedule event • $ns at <time> <event> • <event>: any legitimate ns/tcl commands • Start scheduler • $ns run

  11. “Hello World” in ns simple.tcl set ns [new Simulator] $ns at 1 “puts \“Hello World!\”” $ns at 1.5 “exit” $ns run gs116% ns simple.tcl Hello World! gs116%

  12. Creating Network • Nodes • set n0 [$ns node] • set n1 [$ns node] • Links & Queuing • $ns duplex-link $n0 $n1 <bandwidth> <delay> <queue_type>

  13. Transport Layer Class Agent Agent/UDP Agent/TCP (=Tahoe) … Other TCP flavors

  14. The transport layer: UDP • UDP • set udp [new Agent/UDP] • set null [new Agent/NULL] • $ns attach-agent $n0 $udp • $ns attach-agent $n1 $null • $ns connect $udp $null

  15. The transport layer: TCP • TCP • set tcp [new Agent/TCP] • set tcpsink [new Agent/TCPSink] • $ns attach-agent $n0 $tcp • $ns attach-agent $n1 $tcpsink • $ns connect $tcp $tcpsink

  16. Transport Layer Class Agent Agent/UDP Agent/TCP (=Tahoe) … Other TCP flavors Agent/TCP/FullTCP

  17. Two-way TCP • FullTcp connection • set tcp1 [new Agent/TCP/FullTcp] • set tcp2 [new Agent/TCP/FullTcp] • $ns attach-agent $n1 $tcp1 • $ns attach-agent $n2 $tcp2 • $ns connect $tcp1 $tcp2 • $tcp2 listen

  18. Application Layer Class Application {Traffic generators} (on top of UDP) {Simulated Applications} (on top of TCP)

  19. Creating Traffic: On Top of TCP FTP • set ftp [new Application/FTP] • $ftp attach-agent $tcp • $ns at <time> “$ftp start” Telnet • set telnet [new Application/Telnet] • $telnet attach-agent $tcp

  20. Creating Traffic: On Top of UDP • CBR • set src [new Application/Traffic/CBR] • Exponential or Pareto on-off • set src [new Application/Traffic/Exponential] • set src [new Application/Traffic/Pareto]

  21. Attaching a traffic source • set cbr [new Application/Traffic/CBR] • $cbr attach-agent $udp • $ns at <time> “$cbr start”

  22. Tracing Trace packets on all links: • set f[open out.tr w] • $ns trace-all $f • $ns flush-trace • close $f <event> <time> <from> <to> <pkt> <size>--<flowid> <src> <dst> <seqno> <aseqno> + 1 0 2 cbr 210 ------- 0 0.0 3.1 0 0 - 1 0 2 cbr 210 ------- 0 0.0 3.1 0 0 r 1.00234 0 2 cbr 210 ------- 0 0.0 3.1 0 0 Is tracing all links allways the best thing to do?

  23. More Tracing • Tracing specific links • $ns trace-queue $n0 $n1 $f • Tracing variables • set cwnd_chan_ [open all.cwnd w] • $tcp trace cwnd_ • $tcp attach $cwnd_chan

  24. Putting it all together set ns [new Simulator] set n0 [$ns node] set n1 [$ns node] $ns duplex-link $n0 $n1 1.5Mb 10ms DropTail Creating Topology set tcp [$ns create-connection TCP $n0 TCPSink $n1 0] Creating Transport layer set ftp [new Application/FTP] $ftp attach-agent $tcp Creating Applications $ns at 0.2 "$ftp start“ $ns at 1.2 ”exit“ Schedule Events $ns trace-queue $n0 $n1 $f $ns run

  25. nam – the network animator n0 n1 • set nf [open out.nam w] • $ns namtrace-all $nf • exec nam out.nam & …

  26. Computing routes • Unicast • $ns rtproto <type> • <type>: Static, Session, DV.

  27. Network Dynamics: Link failures • $ns rtmodel-at <time> <up|down> $n0 $n1 • $ns rtmodel Trace <config_file> $n0 $n1 • $ns rtmodel <model> <params> $n0 $n1 <model>: Deterministic, Exponential

  28. Agent/FTP Agent/FTP Agent/FTP Agent/FTP Issues in Simulations • Suppose you want to study the way TCP sources share a bottleneck link… Which topology? Background Traffic? Which traffic sources? When to start sources? What else affects results?

  29. Another practical issue: Memory • Avoid trace-all • Use arrays for a sequence of variables • Instead of n$i, say n($i) ~ns/tcl/ex/cmcast-150.tcl: 150 nodes, 2200 links => 53MB 2420 nodes, 2465 linkd => 800MB

  30. Basic ns-2: Not Covered • mobile IP • multicasting • satellite • emulation

  31. Pure C++ objects Pure OTcl objects C++/OTcl split objects OTcl C++ ns Making changes to ns – where??? • Where would you implement • one-time configuration variables • complex procedures • per packet action

  32. ns directory structure ns-allinone Tcl8.0 TK8.0 OTcl tclcl ns-2 nam-1 ... tcl Makefile.in C++ code mcast ... ex test lib examples validation tests OTcl code

  33. New component purely in Otcl ns-allinone Tcl8.0 TK8.0 OTcl tclcl ns-2 nam-1 ... tcl Makefile.in C++ code mcast lib ... ex test mysrc msg.tcl validation tests examples OTcl code source msg.tcl

  34. New component in C++ • Create C++ class, fill in methods • Define otcl linkage • Write otcl code (if any) • Build (and debug)

  35. Pure OTcl objects Pure C++ objects C++/OTcl split objects C++ OTcl ns How does linkage work? • how to access Tcl variables from C++ • how is C++ object created from interpreter • ……

  36. TclObject: Hierarchy and Shadowing C++ class hierarchy otcl class hierarchy TclObject TclObject Agent Agent TcpAgent Agent/TCP *tcp _o123 Agent/TCP otcl shadow object Agent/TCP C++ object

  37. TclObject • Example set tcp [new Agent/TCP] => how is corresponding C++ object created? $tcp set window_ 500 => how is corresponding C++ variable set? $tcp advance 5000 => how is C++ procedure called?

  38. TclObject: Hierarchy and Shadowing C++ class hierarchy otcl class hierarchy TclObject TclObject Agent Agent TcpAgent Agent/TCP *tcp _o123 Agent/TCP otcl shadow object Agent/TCP C++ object

  39. TclObject::bind() • Link C++ member variables to otcl object variables • C++ TcpAgent::TcpAgent() { bind(“window_”, &wnd_); … … } • bind_time(), bind_bool(), bind_bw() • otcl $tcp set window_ 200

  40. TclObject::command() • Implement otcl methods in C++ • Trap point: otcl method cmd{} • Send all arguments after cmd{} call to TclObject::command()

  41. TclObject::command() OTcl space no such procedure $tcp advance TclObject::unknown{} $tcp cmd advance C++ space TcpAgent::command() match “advance”? Yes No Invoke parent: return Agent::command() process and return

  42. TclObject::command() • otcl set tcp [new Agent/TCP] $tcp advance 10 • C++ int TcpAgent::command(int argc, const char*const* argv) { if (argc == 3) { if (strcmp(argv[1], “advance”) == 0) { int newseq = atoi(argv[2]); …… return(TCL_OK); } } return (Agent::command(argc, argv); }

  43. TclObject • Example set tcp [new Agent/TCP] => how is corresponding C++ object created? $tcp set window_ 500 => how is corresponding C++ variable set? $tcp advance 5000 => how is C++ procedure called? ?

  44. Agent/TCP constructor parent constructor TclObject constructor invoke parent constructor create C++ object which C++ object to create? – TclClass complete initialization complete initialization create OTcl shadow object parent (Agent) constructor AgentTCP constructor TclObject (C++) constructor invoke parent constructor invoke parent constructor do nothing, return bind variables and return bind variables and return TclObject: Creation and Deletion invoke parent constructor OTcl C++

  45. TclClass • Static class TcpClass : public TclClass { • public: • TcpClass() : TclClass(“Agent/TCP”) {} • TclObject* create(int, const char*const*) { • return (new TcpAgent()); • } • } class_tcp;

  46. Class Tcl • Singleton class with a handle to Tcl interpreter • Usage • Invoke otcl procedure • Obtain otcl evaluation results • Pass a result string to otcl • Return success/failure code to otcl

  47. Class Tcl Tcl& tcl = Tcl::instance(); if (strcmp(argv[1], “now”) == 0) { tcl.resultf(“%g”, clock()); return TCL_OK; } if (strcmp(argv[1], “helloworld”) { tcl.evalc(“puts stdout Hello World”); return TCL_OK; } Passing results to the interpreter: Executing Otcl commands from C++

  48. Class TclCommand • C++ implementation of global otcl commands class RandomCommand : public TclCommand { public: RandomCommand() : TclCommand("ns-random") {} virtual int command(int argc, const char*const* argv); }; int RandomCommand::command(int argc, const char*const* argv) { Tcl& tcl = Tcl::instance(); if (argc == 1) { sprintf(tcl.buffer(), "%u", Random::random()); tcl.result(tcl.buffer()); }

  49. Summary

More Related