blob: 6fe0533032ff8bb7159e9645ec98dd60770731cb [file] [log] [blame]
Alexander Afanasyeve6852122013-01-21 11:54:47 -08001.. _applications:
2
Alexander Afanasyev6315ef72012-06-01 20:56:31 -07003ndnSIM applications
4===================
5
6ndnSIM includes a few reference applications that can be used as a base for NDN simulations.
7
8Reference applications
9++++++++++++++++++++++
10
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -070011ConsumerCbr
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -080012^^^^^^^^^^^
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070013
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -070014:ndnsim:`ConsumerCbr` an application that generates Interest traffic with predefined pattern (constant frequency, constant average rate with inter-Interest gap distributed uniformly at random, exponentially at random, etc.).
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070015
16.. code-block:: c++
17
18 // Create application using the app helper
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -080019 AppHelper helper("ns3::ndn::ConsumerCbr");
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070020
21This applications has the following attributes:
22
Alexander Afanasyev13800102012-12-25 00:30:31 -080023* ``Frequency``
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070024
25 .. note::
26 default: ``1.0`` (1 per second)
27
28 Either exact (for contant version) or expected (for randomized version) frequency with which Interests are generated
29
30 .. code-block:: c++
31
32 // Set attribute using the app helper
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -080033 helper.SetAttribute("Frequency", DoubleValue (1.0));
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070034
Alexander Afanasyev13800102012-12-25 00:30:31 -080035* ``Randomize``
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070036
37 .. note::
38 default: ``"none"``
39
40 Specify whether to do randomization for inter-Interest gap or not. The following variants are currently supported:
Alexander Afanasyeve6852122013-01-21 11:54:47 -080041
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070042 - ``"none"``: no randomization
Alexander Afanasyeve6852122013-01-21 11:54:47 -080043
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070044 - ``"uniform"``: uniform distribution in range (0, 1/Frequency)
45
46 - ``"exponential"``: exponential distribution with mean 1/Frequency
47
48 .. code-block:: c++
49
50 // Set attribute using the app helper
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -080051 helper.SetAttribute("Randomize", StringValue("uniform"));
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070052
Alexander Afanasyev13800102012-12-25 00:30:31 -080053ConsumerZipfMandelbrot
54^^^^^^^^^^^^^^^^^^^^^^
55
56.. note::
57 Author: Xiaoke Jiang
58
Alexander Afanasyeve6852122013-01-21 11:54:47 -080059An app that requests contents (names in the requests) following Zipf-Mandelbrot distribution (number of Content frequency Distribution).
Alexander Afanasyev13800102012-12-25 00:30:31 -080060This class is a subclass of :ndnsim:`ConsumerCbr`.
61
62.. code-block:: c++
63
64 // Create application using the app helper
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -080065 ndn::AppHelper helper("ns3::ndn::ConsumerZipfMandelbrot");
Alexander Afanasyev13800102012-12-25 00:30:31 -080066
Alexander Afanasyeve6852122013-01-21 11:54:47 -080067``Frequency`` and ``Randomize`` attributes can be used in the same way as in the base :ndnsim:`ConsumerCbr` applications.
Alexander Afanasyev13800102012-12-25 00:30:31 -080068
69Additional attributes:
70
71* ``NumberOfContents``
72
73 .. note::
74 default: 100
75
76 Number of different content (sequence numbers) that will be requested by the applications
77
78
79THE following pictures show basic comparison of the generated stream of Interests versus theoretical `Zipf-Mandelbrot <http://en.wikipedia.org/wiki/Zipf%E2%80%93Mandelbrot_law>`_ function (``NumberOfContents`` set to 100 and ``Frequency`` set to 100)
80
81.. image:: _static/apps/zipf-n100-frq100-duration10.png
82 :alt: Comparsion between simulation and theory with simulation duration 10 seconds
83
84.. image:: _static/apps/zipf-n100-frq100-duration50.png
85 :alt: Comparsion between simulation and theory with simulation duration 50 seconds
86
87.. image:: _static/apps/zipf-n100-frq100-duration100.png
88 :alt: Comparsion between simulation and theory with simulation duration 100 seconds
89
90.. image:: _static/apps/zipf-n100-frq100-duration1000.png
91 :alt: Comparsion between simulation and theory with simulation duration 1000 seconds
92
93
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -070094ConsumerBatches
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070095^^^^^^^^^^^^^^^^^^^
96
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -070097:ndnsim:`ConsumerBatches` is an on-off-style application gen- erating a specified number of Interests at specified points of simulation.
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070098
99.. code-block:: c++
100
101 // Create application using the app helper
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800102 ndn::AppHelper consumerHelper("ns3::ndn::ConsumerBatches");
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700103
104This applications has the following attributes:
105
Alexander Afanasyev13800102012-12-25 00:30:31 -0800106* ``Batches``
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700107
108 .. note::
109 default: Empty
110
Alexander Afanasyeve6852122013-01-21 11:54:47 -0800111 Specify exact pattern of Interest packets, specifying when and how many Interest packets should be sent.
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700112 The following example defines that 1 Interest should be requested at time 1s, 5 Interests at time 5s, and 2 Interests at time 10s.:
113
114 .. code-block:: c++
115
116 // Set attribute using the app helper
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800117 helper.SetAttribute("Batches", StringValue("1s 1 2s 5 10s 2"));
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700118
119
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700120ConsumerWindow
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700121^^^^^^^^^^^^^^^^^^
122
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800123:ndnsim:`ConsumerWindow` is an application generating a variable rate Interest traffic. It implements a simple sliding-window-based Interest generation mechanism.
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700124
125.. code-block:: c++
126
127 // Create application using the app helper
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800128 AppHelper consumerHelper("ns3::ndn::ConsumerWindow");
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700129
130
131This applications has the following attributes:
132
Alexander Afanasyev13800102012-12-25 00:30:31 -0800133* ``Window``
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700134
135 .. note::
136 default: ``1``
137
138 Initial number of Interests that will be send out without waiting for the data (number of outstanding Interests)
139
Alexander Afanasyev13800102012-12-25 00:30:31 -0800140* ``PayloadSize``
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700141
142 .. note::
143 default: ``1040``
144
145 Expected size of the Data payload (necessary only when Size is specified)
146
Alexander Afanasyev13800102012-12-25 00:30:31 -0800147* ``Size``
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700148
149 .. note::
150 default: ``-1``
151
152 Amount of data to be requested (will stop issuing Interests after ``Size`` data is received)
153
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700154 If ``Size`` is set to -1, Interests will be requested till the end of the simulation.
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700155
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700156Producer
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700157^^^^^^^^^^^^
158
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700159:ndnsim:`Producer` a simple Interest-sink application, which replying every incoming Interest with Data packet with a specified size and name same as in Interest.
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700160
161.. code-block:: c++
162
163 // Create application using the app helper
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800164 AppHelper consumerHelper("ns3::ndn::Producer");
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700165
Alexander Afanasyev71278d42012-12-12 19:16:54 -0800166.. _Custom applications:
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700167
168Custom applications
169+++++++++++++++++++
170
Alexander Afanasyeve6852122013-01-21 11:54:47 -0800171Applications interact with the core of the system using :ndnsim:`AppFace` realization of Face abstraction.
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700172To simplify implementation of specific NDN application, ndnSIM provides a base :ndnsim:`App` class that takes care of creating :ndnsim:`AppFace` and registering it inside the NDN protocol stack, as well as provides default processing for incoming Interest and Data packets.
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700173
Alexander Afanasyev5b054aa2012-08-13 18:56:17 -0700174.. Base App class
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700175.. ^^^^^^^^^^^^^^^^^^
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700176
177
Alexander Afanasyev6dbacda2012-10-23 17:20:18 -0700178Customer example
179^^^^^^^^^^^^^^^^
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700180
Alexander Afanasyev71278d42012-12-12 19:16:54 -0800181The following code shows how a simple ndnSIM application can be created, and how an application can send Interests and respond with ContentObjects to incoming interests.
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700182
Alexander Afanasyev71278d42012-12-12 19:16:54 -0800183When this application starts it sets "interest filter" (install FIB entry) for /prefix/sub, as well as sends Interest for this prefix.
184When an Interest is received, it is replied with a ContentObject with 1024-byte fake payload.
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700185
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800186For more details refer ``examples/ndn-custom-apps/custom-app.hpp``, ``examples/ndn-custom-apps/custom-app.cpp`` and API documentation of ndnSIM and NS-3.
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700187
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800188Header file ``examples/ndn-custom-apps/custom-app.hpp``:
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700189
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800190.. literalinclude:: ../../examples/ndn-custom-apps/custom-app.hpp
Alexander Afanasyev71278d42012-12-12 19:16:54 -0800191 :language: c++
192 :linenos:
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800193 :lines: 20-28,39-
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700194
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800195Source file ``examples/ndn-custom-apps/custom-app.cpp``:
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700196
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800197.. literalinclude:: ../../examples/ndn-custom-apps/custom-app.cpp
Alexander Afanasyev71278d42012-12-12 19:16:54 -0800198 :language: c++
199 :linenos:
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800200 :lines: 20-
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700201
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800202Example how to use custom app in a scenario (``ndn-simple-with-custom-app.cpp``):
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700203
Alexander Afanasyeve6852122013-01-21 11:54:47 -0800204 .. * +------+ <-----> (CustomApp1)
205 .. * | Node |
Alexander Afanasyev71278d42012-12-12 19:16:54 -0800206 .. * +------+ <-----> (CustomApp2)
207 .. *
Alexander Afanasyevd4e97b32012-06-04 15:09:50 -0700208
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800209.. literalinclude:: ../../examples/ndn-custom-apps.cpp
Alexander Afanasyev71278d42012-12-12 19:16:54 -0800210 :language: c++
211 :linenos:
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800212 :lines: 20-27,37-
Alexander Afanasyev71278d42012-12-12 19:16:54 -0800213
214To run this scenario, use the following command::
215
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800216 NS_LOG=CustomApp ./waf --run=ndn-custom-apps
Alexander Afanasyev71278d42012-12-12 19:16:54 -0800217
Alexander Afanasyev6dbacda2012-10-23 17:20:18 -0700218
219Producer example (Interest hijacker)
220^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
221
222The following code demonstrates how to implement a basic producer application that "hijacks" all incoming Interests.
223
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800224Header file ``examples/ndn-custom-apps/hijacker.hpp``:
Alexander Afanasyev6dbacda2012-10-23 17:20:18 -0700225
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800226.. literalinclude:: ../../examples/ndn-custom-apps/hijacker.hpp
Alexander Afanasyev71278d42012-12-12 19:16:54 -0800227 :language: c++
228 :linenos:
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800229 :lines: 20-
Alexander Afanasyev71278d42012-12-12 19:16:54 -0800230
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800231Source file ``examples/ndn-custom-apps/hijacker.cpp``:
Alexander Afanasyev71278d42012-12-12 19:16:54 -0800232
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800233.. literalinclude:: ../../examples/ndn-custom-apps/hijacker.cpp
Alexander Afanasyev71278d42012-12-12 19:16:54 -0800234 :language: c++
235 :linenos:
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800236 :lines: 20-
Alexander Afanasyev6dbacda2012-10-23 17:20:18 -0700237
238
239After defining this class, you can use it with :ndnsim:`ndn::AppHelper`. For example:
240
241.. code-block:: c++
242
243 ...
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800244 ndn::AppHelper producerHelper("Hijacker");
245 producerHelper.Install(producerNode);
Alexander Afanasyev6dbacda2012-10-23 17:20:18 -0700246 ...