blob: 6561be5acd793d037248e50b0b41be3c18add4be [file] [log] [blame]
Examples
========
.. role:: red
.. note::
:red:`!!! This page only shows up examples of how to config topology and perform basic
operations in ndnSIM (an example equivalent to "Hello, world1") !!! These are **NOT**
examples of real experimentations (just like "Hello, world!" is not a real program).`
.. note::
If you compiled ndnSIM with examples (``./waf configure --enable-examples``) you can
directly run the example without putting scenario into ``scratch/`` folder.
.. _simple-scenario:
Simple scenario
---------------
.. sidebar:: Topology
.. aafig::
:aspect: 60
:scale: 90
+----------+ +--------+ +----------+
| | 1Mbps | | 1Mbps | |
| Consumer |<-------------->| Router |<-------------->| Producer |
| | 10ms | | 10ms | |
+----------+ +--------+ +----------+
The first example (``ndn-simple.cpp``) shows very basics of ndnSIM. In the simulated
topology there are 3 nodes, connected with point-to-point links, one
NDN consumer, and one NDN producer:
Consumer is simulated using :ndnsim:`ConsumerCbr` reference application and generates Interests
towards the producer with frequency of 10 Interests per second (see :doc:`applications`).
Producer is simulated using :ndnsim:`Producer` class, which is used to satisfy all incoming
Interests with virtual payload data (1024 bytes).
FIB on every node is populated using default routes (see :doc:`helpers`) and the content store
structure of the original ndnSIM is used.
The following code represents all that is necessary to run such a
simple scenario
.. literalinclude:: ../../examples/ndn-simple.cpp
:language: c++
:linenos:
:lines: 20-28,49-
:emphasize-lines: 23-24,27-29,42-53
If this code is placed into ``scratch/ndn-simple.cpp`` and NS-3 is compiled in debug mode, you
can run and see progress of the simulation using the following command (in optimized mode
nothing will be printed out)::
NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-simple
.. note::
If you compiled ndnSIM with examples (``./waf configure --enable-examples``) you can
directly run the example without putting scenario into ``scratch/`` folder.
.. _9-node-grid-example:
9-node grid example
-------------------
.. sidebar:: Topology
.. aafig::
:aspect: 60
:scale: 120
/--------\ /-\ /-\
|Consumer|<---->| |<------->| |
\--------/ \-/ \-/
^ ^ ^
| | | 1Mbps/10ms delay
v v v
/-\ /-\ /-\
| |<-------->| |<------->| |
\-/ \-/ \-/
^ ^ ^
| | |
v v v
/-\ /-\ /--------\
| |<-------->| |<---->|Producer|
\-/ \-/ \--------/
This scenario (``ndn-grid.cpp``) simulates a grid topology, which is constructed using
PointToPointLayout NS-3 module.
FIB is populated using :ndnsim:`GlobalRoutingHelper` (see :doc:`helpers`). The content store
structure of NFD is used in all the nodes.
Consumer is simulated using :ndnsim:`ConsumerCbr` reference application and generates Interests
towards the producer with frequency of 100 interests per second (see :doc:`applications`).
Producer is simulated using :ndnsim:`Producer` class, which is used to satisfy all incoming
Interests with virtual payload data (1024 bytes).
The following code represents all that is necessary to run such a simple scenario
.. literalinclude:: ../../examples/ndn-grid.cpp
:language: c++
:linenos:
:lines: 20-29,54-
:emphasize-lines: 24-26,33,36-37,40-42,58,61
If this code is placed into ``scratch/ndn-grid.cpp`` and NS-3 is compiled in debug mode, you
can run and see progress of the simulation using the following command (in optimized mode
nothing will be printed out)::
NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-grid
.. note::
If you compiled ndnSIM with examples (``./waf configure --enable-examples``) you can
directly run the example without putting scenario into ``scratch/`` folder.
.. _9-node-grid-example-using-topology-plugin:
9-node grid example using topology plugin
-----------------------------------------
.. sidebar:: Topology
.. aafig::
:aspect: 60
:scale: 120
/--------\ /-\ /-\
|Consumer|<---->| |<------->| |
\--------/ \-/ \-/
^ ^ ^
| | | 1Mbps/10ms delay
v v v
/-\ /-\ /-\
| |<-------->| |<------->| |
\-/ \-/ \-/
^ ^ ^
| | |
v v v
/-\ /-\ /--------\
| |<-------->| |<---->|Producer|
\-/ \-/ \--------/
Instead of defining topology directly as in :ref:`simple-scenario` or using specialized helpers
as in :ref:`9-node-grid-example`, ndnSIM provides experimental extended versions of
TopologyReader classes: :ndnsim:`AnnotatedTopologyReader` and
:ndnsim:`RocketfuelWeightsReader`.
While :ndnsim:`RocketfuelWeightsReader` is a specialized version intended to be used with
`Rocketfuel <http://www.cs.washington.edu/research/networking/rocketfuel/>`_ topology and link
weights files (examples will be provided later), :ndnsim:`AnnotatedTopologyReader` is a more
general-use class that uses simple user-readable format.
:ndnsim:`AnnotatedTopologyReader` expects the following format:
.. literalinclude:: ../../examples/topologies/topo-grid-3x3.txt
:language: bash
:linenos:
:lines: 1-2,19-
:emphasize-lines: 8,24
This scenario (``ndn-grid-topo-plugin.cpp``) duplicates the functionality of
:ref:`9-node-grid-example` but with the use of :ndnsim:`AnnotatedTopologyReader`.
.. literalinclude:: ../../examples/ndn-grid-topo-plugin.cpp
:language: c++
:linenos:
:lines: 20-27,52-
:emphasize-lines: 15-17,31-33
As you can see, scenario code became more compact and more readable.
:ndnsim:`AnnotatedTopologyReader` provides two ways to access topology nodes. First, you can
use the method :ndnsim:`AnnotatedTopologyReader::GetNodes` which returns NodeContainer.
Alternatively, nodes can be accessed by name using `Names::Find<Node> ("nodename")` call, as in
the above example. For this purpose,:ndnsim:`AnnotatedTopologyReader` automatically registers
all created nodes with names specified in topology file. For more information about `Names`
class, please refer to `NS-3 documentation <http://www.nsnam.org/doxygen/classns3_1_1_names.html>`_.
If the topology file is placed into ``src/ndnSIM/examples/topologies/topo-grid-3x3.txt`` and
the code is placed into ``scratch/ndn-grid-topo-plugin.cpp``, you can run and see progress of
the simulation using the following command (in optimized mode nothing will be printed out)::
NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-grid-topo-plugin
.. note::
If you compiled ndnSIM with examples (``./waf configure --enable-examples``) you can
directly run the example without putting scenario into ``scratch/`` folder.
6-node bottleneck topology
--------------------------
.. sidebar:: Topology
.. aafig::
:aspect: 60
:scale: 90
/------\ /------\
| Src1 |<--+ +-->| Dst1 |
\------/ \ / \------/
\ /
+-->/------\ "bottleneck" /------\<-+
| Rtr1 |<===============>| Rtr2 |
+-->\------/ \------/<-+
/ \
/------\ / \ /------\
| Src2 |<--+ +-->| Dst2 |
\------/ \------/
This scenario (``ndn-congestion-topo-plugin.cpp``) can be used for congestion-related scenarios
.. literalinclude:: ../../examples/topologies/topo-6-node.txt
:language: bash
:linenos:
:lines: 1-2,15-
.. literalinclude:: ../../examples/ndn-congestion-topo-plugin.cpp
:language: c++
:linenos:
:lines: 20-27,48-
To run this scenario and see what is happening, use the following command::
NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-congestion-topo-plugin
.. note::
If you compiled ndnSIM with examples (``./waf configure --enable-examples``) you can
directly run the example without putting scenario into ``scratch/`` folder.
.. _11-node 2-bottleneck topology:
11-node 2-bottleneck topology
------------------------------
.. sidebar:: Topology
.. aafig::
:aspect: 60
:scale: 90
/------\ 0 0 /------\
| c1 |<-----+ +----->| p1 |
\------/ \ / \------/
\ /-----\ /
/------\ 0 \ +==>| r12 |<==+ / 0 /------\
| c2 |<--+ \ / \-----/ \ / +-->| p2 |
\------/ \ \ | | / / \------/
\ | | 1Mbps links | | /
\ 1 v0 v5 1v 2v 3 /
+->/------\ /------\<-+
2| r1 |<===============>| r2 |4
+->\------/4 0\------/<-+
/ 3^ ^5 \
/ | | \
/------\ 0 / / \ \ 0 /------\
| c3 |<--+ / \ +-->| p3 |
\------/ / \ \------/
/ "All consumer-router and" \
/------\ 0 / "router-producer links are" \ 0 /------\
| c4 |<-----+ "10Mbps" +---->| p4 |
\------/ \------/
"Numbers near nodes denote face IDs. Face ID is assigned based on the order of link"
"definitions in the topology file"
Firstly, we define a meaningful topology:
The corresponding topology file (``topo-11-node-two-bottlenecks.txt``):
.. literalinclude:: ../../examples/topologies/topo-11-node-two-bottlenecks.txt
:language: bash
:linenos:
:lines: 1-2,28-
After that, we define the simulation scenario:
Example simulation (``ndn-congestion-alt-topo-plugin.cpp``) scenario:
.. literalinclude:: ../../examples/ndn-congestion-alt-topo-plugin.cpp
:language: c++
:linenos:
:lines: 20-27,60-
To run this scenario and see what is happening, use the following command::
NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-congestion-alt-topo-plugin
You can also run using visualizer module to verify that both bottleneck links are utilized::
./waf --run=ndn-congestion-alt-topo-plugin --visualize
.. note::
If you compiled ndnSIM with examples (``./waf configure --enable-examples``) you can
directly run the example without putting scenario into ``scratch/`` folder.
.. _6-node topology with custom NFD forwarding strategy:
6-node topology with custom NFD forwarding strategy
---------------------------------------------------
.. sidebar:: Topology
.. aafig::
:aspect: 60
:scale: 90
/-----\
| CSU |
+-----> | HUB | <----+
| \-----/ |
| | 1Mbps/10ms delay
v v
/------\ /----------\
| UCLA | | Consumer |
| HUB | | CSU-1 |
+-----> \------/ <-----+ \----------/
| |
| |
v v
/----------\ /----------\
| Producer | | Producer |
| UCLA-1 | | UCLA-2 |
\----------/ \----------/
"All links are 1Mbps with propagation 10ms delay."
"FIB is populated using NdnGlobalRoutingHelper."
This scenario simulates a load balancer topology (using topology reader module). The
corresponding topology file (``topo-load-balancer.txt``):
.. literalinclude:: ../../examples/topologies/topo-load-balancer.txt
:language: bash
:linenos:
:lines: 30-36,43-
After that, we define the simulation scenario:
Example simulation (``ndn-load-balancer.cpp``) scenario:
.. literalinclude:: ../../examples/ndn-load-balancer.cpp
:language: c++
:linenos:
:lines: 20-27,55-
:emphasize-lines: 7,44-45
In this simulation scenario, the node called "UCLA-HUB" implements a random load balancing
strategy for the name prefix "/ucla/hello". In this way, the Interest packets will be
forwarded randomly either to the producer node called "UCLA-1" or the producer node called
"UCLA-2".
To run this scenario and see what is happening, use the following command::
NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-load-balancer
.. note::
If you compiled ndnSIM with examples (``./waf configure --enable-examples``) you can
directly run the example without putting scenario into ``scratch/`` folder.
9-node grid topology with different forwarding strategies per name prefix
-------------------------------------------------------------------------
This scenario simulates a grid topology (using PointToPointGrid module). In this scenario,
thanks to NFD, we can choose a different forwarding strategy for each prefix in each node.
Consumer requests data from producer with frequency 100 interests per second (interests
contain constantly increasing sequence number).
For every received interest, producer replies with a data packet, containing 1024 bytes of
virtual payload.
In this scenario, we choose the broadcast strategy to be installed for the name prefix
"/prefix1" in all the nodes, while for the name prefix "/prefix2", the best-route strategy
will be installed in all the topology nodes.
Example simulation (``ndn-different-strategy-per-prefix.cpp``) scenario:
.. literalinclude:: ../../examples/ndn-different-strategy-per-prefix.cpp
:language: c++
:linenos:
:lines: 20-33,61-
:emphasize-lines: 51-52
To run this scenario and see what is happening, use the following command::
NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-different-strategy-per-prefix
9-node grid topology with different forwarding strategy for each node
---------------------------------------------------------------------
This scenario simulates a grid topology (using PointToPointGrid module). The first six nodes
use the best route forwarding strategy, whereas the three remaining nodes use the broadcast
forwarding strategy.
Consumer requests data from producer with frequency 100 interests per second (interests
contain constantly increasing sequence number).
For every received interest, producer replies with a data packet, containing 1024 bytes of
virtual payload.
Example simulation (``ndn-grid-multiple-strategies.cpp``) scenario:
.. literalinclude:: ../../examples/ndn-grid-multiple-strategies.cpp
:language: c++
:linenos:
:lines: 20-33,61-
:emphasize-lines: 49-58
To run this scenario and see what is happening, use the following command::
NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-grid-multiple-strategies
3-level binary tree with packet-level trace helpers
---------------------------------------------------
:ref:`packet trace helper example`
3-level binary tree with content store trace helper
---------------------------------------------------
:ref:`cs trace helper example`
3-level binary tree with application-level Interest-Data delay tracer
----------------------------------------------------------------------
:ref:`app delay trace helper example`
1-node topology with custom application
---------------------------------------
:ref:`Custom applications`
Simple scenario with pcap dump
------------------------------
The following example (``ndn-simple-with-pcap.cpp``) demonstrates how to dump all simulated
traffic in pcap-formatted data, which can be used for later analysis by conventional tools,
like tcpdump and wireshark.
.. literalinclude:: ../../examples/ndn-simple-with-pcap.cpp
:language: c++
:linenos:
:lines: 20-
:emphasize-lines: 24-43,89-91
If this code is placed into ``scratch/ndn-simple-with-pcap.cpp`` and NS-3 is compiled in debug
mode, you can run and see progress of the simulation using the following command (in optimized
mode nothing will be printed out)::
NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-simple-with-pcap
This will generate ``ndn-simple-trace.pcap``, which can be fed to tcpdump::
tcpdump -r ndn-simple-trace.pcap
.. note::
If you compiled ndnSIM with examples (``./waf configure --enable-examples``) you can
directly run the example without putting scenario into ``scratch/`` folder.
.. _Simple scenario with link failures:
Simple scenario with link failures
----------------------------------
The following example (``ndn-simple-with-link-failure.cpp``) shows how to "fail" links in
ndnSIM simulation. The basic idea is to set ndn::Faces that correspond to the failed link to
DOWN state. ndnSIM now includes a simple helper that simplifies this process.
.. literalinclude:: ../../examples/ndn-simple-with-link-failure.cpp
:language: c++
:linenos:
:lines: 20-31,52-
:emphasize-lines: 56-57
If this code is placed into ``scratch/ndn-simple-with-link-failure.cpp`` and NS-3 is compiled
in debug mode, you can run and see progress of the simulation using the following command (in
optimized mode nothing will be printed out)::
NS_LOG=ndn.Consumer:ndn.Producer:ndn.LinkControlHelper ./waf --run=ndn-simple-with-link-failure
.. note::
If you compiled ndnSIM with examples (``./waf configure --enable-examples``) you can
directly run the example without putting scenario into ``scratch/`` folder.
25-node tree topology with L2Tracer
-----------------------------------
:ref:`Example of packet drop tracer (L2Tracer)`