The ns-3 simulator is a discrete-event network simulator targeted primarily for research and educational use. The ns-3 project, started in 2006, is an open-source project developing ns-3.
The purpose of this tutorial is to introduce new ns-3 users to the system in a structured way. It is sometimes difficult for new users to glean essential information from detailed manuals and to convert this information into working simulations. In this tutorial, we will build several example simulations, introducing and explaining key concepts and features as we go.
As the tutorial unfolds, we will introduce the full ns-3 documentation and provide pointers to source code for those interested in delving deeper into the workings of the system.
A few key points are worth noting at the onset:
ns-3 has been developed to provide an open, extensible network simulation platform, for networking research and education. In brief, ns-3 provides models of how packet data networks work and perform, and provides a simulation engine for users to conduct simulation experiments. Some of the reasons to use ns-3 include to perform studies that are more difficult or not possible to perform with real systems, to study system behavior in a highly controlled, reproducible environment, and to learn about how networks work. Users will note that the available model set in ns-3 focuses on modeling how Internet protocols and networks work, but ns-3 is not limited to Internet systems; several users are using ns-3 to model non-Internet-based systems.
Many simulation tools exist for network simulation studies. Below are a few distinguishing features of ns-3 in contrast to other tools.
For those familiar with ns-2 (a popular tool that preceded ns-3), the most visible outward change when moving to ns-3 is the choice of scripting language. Programs in ns-2 are scripted in OTcl and results of simulations can be visualized using the Network Animator nam. It is not possible to run a simulation in ns-2 purely from C++ (i.e., as a main() program without any OTcl). Moreover, some components of ns-2 are written in C++ and others in OTcl. In ns-3, the simulator is written entirely in C++, with optional Python bindings. Simulation scripts can therefore be written in C++ or in Python. New animators and visualizers are available and under current development. Since ns-3 generates pcap packet trace files, other utilities can be used to analyze traces as well. In this tutorial, we will first concentrate on scripting directly in C++ and interpreting results via trace files.
But there are similarities as well (both, for example, are based on C++ objects, and some code from ns-2 has already been ported to ns-3). We will try to highlight differences between ns-2 and ns-3 as we proceed in this tutorial.
A question that we often hear is “Should I still use ns-2 or move to ns-3?” In this author’s opinion, unless the user is somehow vested in ns-2 (either based on existing personal comfort with and knowledge of ns-2, or based on a specific simulation model that is only available in ns-2), a user will be more productive with ns-3 for the following reasons:
ns-2 has a more diverse set of contributed modules than does ns-3, owing to its long history. However, ns-3 has more detailed models in several popular areas of research (including sophisticated LTE and WiFi models), and its support of implementation code admits a very wide spectrum of high-fidelity models. Users may be surprised to learn that the whole Linux networking stack can be encapsulated in an ns-3 node, using the Direct Code Execution (DCE) framework. ns-2 models can sometimes be ported to ns-3, particularly if they have been implemented in C++.
If in doubt, a good guideline would be to look at both simulators (as well as other simulators), and in particular the models available for your research, but keep in mind that your experience may be better in using the tool that is being actively developed and maintained (ns-3).
ns-3 is a research and educational simulator, by and for the research community. It will rely on the ongoing contributions of the community to develop new models, debug or maintain existing ones, and share results. There are a few policies that we hope will encourage people to contribute to ns-3 like they have for ns-2:
We realize that if you are reading this document, contributing back to the project is probably not your foremost concern at this point, but we want you to be aware that contributing is in the spirit of the project and that even the act of dropping us a note about your early experience with ns-3 (e.g. “this tutorial section was not clear...”), reports of stale documentation, etc. are much appreciated.
The tutorial assumes that new users might initially follow a path such as the following:
As a result, we have tried to organize the tutorial along the above broad sequences of events.