You are on page 1of 43

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

NS-3
Documentacin

Versin:

1.0 Preliminar

Creado:

Gastn N. Cangemi

ltima actualizacin:
Fecha de impresin:
Revis
Aprob

Tabla de Control de Cambios

Revisin

Fecha

Responsable

Descripcin
39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Contenido
Introduccin........................................................................................................ 5
Glosario............................................................................................................. 5
Alcance.............................................................................................................. 5
Instalacin del simulador NS-3.........................................................................6
Pre-requisitos de paquetes a tener instalado para la distribucin UBUNTU.....6
Descargar paquete NS-3........................................................................................................ 6

Via Mercurial.............................................................................................. 6
Via TarBall.................................................................................................. 6
Generar ns-3 con ns-allinone-3.10 mtodo (Tarball).........................................................7
Generar ns-3-dev mtodo va Mercurial..............................................................................7

Conceptos Generales....................................................................................... 8
Nodo................................................................................................................. 8
Aplicacin......................................................................................................... 8
Canal................................................................................................................ 9
Dispositivo de red (Net device)........................................................................9
Ayudantes Topologa (Topology Helpers)........................................................10
Un primer Script NS-3.................................................................................... 10
Libreras incluidas.......................................................................................... 11
Espacio de nombre NS-3(NS-3 Namespace)...................................................11
Logging.......................................................................................................... 11
Funcin principal............................................................................................ 12
Topology Helpers............................................................................................ 12
NodeContainer............................................................................................... 12
PointToPointHelper......................................................................................... 12
NetDeviceContainer....................................................................................... 13
InternetStackHelper....................................................................................... 14
Ipv4AddressHelper......................................................................................... 14
Aplicacin....................................................................................................... 15
UdpEchoServerHelper.................................................................................... 15
UdpEchoClientHelper..................................................................................... 15
Simulacin...................................................................................................... 16

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Logging.......................................................................................................... 17
Habilitar loggin............................................................................................... 17
Usando parmetros de lnea de comando......................................................20
Poner sus propios valores............................................................................... 21
Sistema de Seguimiento o traza (System Tracing).........................................22
Traza en formato ASCII (ASCII Tracing)...........................................................22
Analizar la traza Ascii..................................................................................... 23
Traza Pcap...................................................................................................... 24
Lectura del archivo pcap con tcpdump..........................................................25
Construyendo una topologa..........................................................................25
Construyendo una topologia de red Wireless.................................................35

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Introduccin
El ns-3 es un simulador de eventos discretos que se basa en C++ para la implementacin de los
modelos de la simulacin. Sin embargo, ns-3 ya no utiliza secuencias de comandos oTcl para
controlar la simulacin, abandonando as los problemas que fueron presentados por la
combinacin de C++ y oTcl en ns-2.
En cambio, las simulaciones de red en ns-3 pueden ser implementadas en C++ puro, y
opcionalmente partes de la simulacin se puede realizar utilizando Python. Estas decisiones de
diseo se hicieron a expensas de la compatibilidad. De hecho, los modelos de ns-2 tienen que
ser portados a ns-3 de una manera manual. El simulador ns-3 tiene modelos para todos los
elementos que conforman una red de computadoras, por ejemplo, dispositivos de red que
representan los dispositivos fsicos que conectan un nodo con el canal de comunicacin.
Esto puede ser una simple tarjeta de red Ethernet o algo ms complejo como un dispositivo
inalmbrico IEEE 802.11.

Propsito del documento


El presente documento tiene como objetivo dar una introduccin al uso del simulador de redes
de eventos discretos ns-3

Glosario
Grupo

Termino

Definicin

Alcance
El alcance de este documento, abarca la instalacin del simulador, conceptos generales de
dispositivos, canales y ayudantes (Helpers), que son usados para modelar una red, y el proceso
de creacin de una topologa de red con niveles crecientes de complejidad, por ejemplo mixta
Ethernet, punto a punto y wifi.

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Instalacin del simulador NS-3


Pre-requisitos de paquetes a tener instalado para la
distribucin UBUNTU

Minimos requerimientos para Python: gcc g++ python python-dev


Debugging y GNU Libreria de soporte cientifico(GSL): gdb valgrind gsl-bin
libgsl0-dev libgsl0ldbl
Simulador de red Cradle (nsc): flex bison
Lectura de trafico de paquetes pcap: tcpdump
Soperte para bases de datos static framework:sqlite sqlite3 libsqlite3-dev
Xml-based version of the config store: libxml2 libxml2-dev
GTK-based configuration system: libgtk2.0-0 libgtk2.0-dev

sudo apt-get install gcc g++ python python-dev gdb \


valgrind gsl-bin libgsl0-dev libgsl0ldbl flex bison tcpdump \
sqlite sqlite3 libsqlite3-dev libxml2 libxml2-dev \
libgtk2.0-0 libgtk2.0-dev vtun lxc \
doxygen graphviz imagemagick texlive \
texlive-latex-extra texlive-generic-extra \
texlive-generic-recommended texinfo dia \
texlive-extra-utils texi2html python-pygraphviz \
python-kiwi python-pygoocanvas libgoocanvas-dev \
mercurial bzr libboost-all-dev

Descargar paquete NS-3


Via Mercurial
cd
mkdir repos
cd repos
hg clone http://code.nsnam.org/ns-3-allinone
cd ns-3-allinone
./download.py -n ns-3.10

Via TarBall
cd
mkdir repos
cd repos
wget http://www.nsnam.org/releases/ns-allinone-3.10.tar.bz2
tar xjf ns-allinone-3.10.tar.bz2

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Generar ns-3 con ns-allinone-3.10 mtodo (Tarball)


1) Usar el script build.py para crear waf
cd repos/ns-allinone-3.10
./build.py
2) Validar instalacin
cd ns-3.10
./test.py

3)

Ejecutar Hello Simulator

./waf --run hello-simulator

Generar ns-3-dev mtodo va Mercurial


1) Donwload ns-3
cd
mkdir repos
cd repos
hg clone http://code.nsnam.org/ns-3-allinone
cd ns-3-allinone
./download.py -n ns-3-dev

2) Usar el script build.py para crear waf


cd repos/ns-3-allinone
./build.py -enable-examples -enable-tests
3) Validar Instalacin
cd ns-3-dev
./test.py

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Conceptos Generales
Nodo
En la jerga de Internet, un dispositivo informtico que se conecta a una red se denomina host o a
veces un sistema final. Debido que ns-3 es un simulador de redes, no especficamente un
simulador de internet, que intencionalmente no usamos el trmino de host ya que est
estrechamente relacionado con el Internet y sus protocolos. En su lugar, se utiliza un trmino
ms genrico utilizado tambin por otros simuladores que se origina en la Teora de Grafos - el
nodo.
En ns-3 el dispositivo de abstraccin de base informtica se denomina nodo. Esta abstraccin se
representa en C++ por la clase Nodo. La clase Nodo proporciona mtodos para administrar las
representaciones de dispositivos informticos en las simulaciones.
Debe pensar en un nodo como un equipo al que va a agregar funcionalidad. Se aade cosas
como aplicaciones, pilas de protocolos y tarjetas de perifricos con sus conductores asociados
que permitan a la computadora para hacer un trabajo til. Utilizamos el mismo modelo bsico en
ns-3.

Aplicacin
Por lo general, los programas informticos se dividen en dos grandes clases, sistemas Software,
que organizan diferentes recursos de la computadora, como la memoria, los ciclos de
procesador, disco, red, etc, de acuerdo con algunos modelos de computacin. El software del
sistema por lo general no utiliza esos recursos para completar las tareas que benefician
directamente a un usuario. Un usuario suele ejecutar una aplicacin que adquiere y utiliza los
recursos controlados por el software del sistema para lograr algn objetivo.
A menudo, la lnea de separacin entre el sistema y el software de aplicacin se realiza en el
cambio de nivel de privilegio que sucede en las trampas del sistema operativo. En ns-3 no existe
un concepto real del sistema operativo y sobre todo el concepto de niveles de privilegio o
llamadas de sistema. Nosotros, sin embargo, tenemos la idea de una aplicacin. Al igual que las
aplicaciones de software se ejecutan en los ordenadores para realizar tareas en el mundo real
Las aplicaciones ns-3 se ejecutan en los Nodos para conducir simulaciones en el mundo
simulado.
En ns-3 la abstraccin de base para un programa de usuario que genera alguna actividad a
simular es la aplicacin (Application). Esta abstraccin se representa en C++ por la clase
Application. La clase Application proporciona mtodos para administrar las representaciones de
nuestra versin de las aplicaciones a nivel de usuario en las simulaciones. Se espera que los
desarrolladores especialicen la clase Application, en el sentido de la programacin orientada a
objetos para crear nuevas aplicaciones. En este tutorial, vamos a utilizar especializaciones de
clase Application llamadas UdpEchoClientApplication y UdpEchoServerApplication. Como
era de esperar, estas aplicaciones se componen de un conjunto de aplicaciones cliente / servidor
que se utiliza para generar y hacerse eco de los paquetes de red simuladas.

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Canal
En el mundo real, se puede conectar un equipo a una red. A menudo, los medios de
comunicacin sobre el que fluyen los datos en estas redes se denominan canales. Al conectar el
cable Ethernet al enchufe en la pared, se est conectando el equipo a un canal de comunicacin
Ethernet. En el mundo simulado de ns-3, uno conecta un nodo a un objeto que representa un
canal de comunicacin. Aqu la comunicacin bsica de la abstraccin de subred, se denomina
Canal (Channel) y se representa en C++ por la clase Channel. La clase Channel proporciona
mtodos para gestionar los objetos de comunicacin de subred y conectar nodos a ellos. Los
canales tambin pueden especializarse por los desarrolladores en el sentido de la programacin
orientada a objetos. Una especializacin de un canal puede modelar algo tan simple como un
alambre. El canal especializado tambin puede modelar cosas tan complicadas como un gran
switch Ethernet, o un espacio tridimensional llena de obstculos en el caso de las redes
inalmbricas. Vamos a utilizar versiones especializadas del canal llamado CsmaChannel,
PointToPointChannel y WifiChannel en este tutorial. El CsmaChannel, por ejemplo, modela
una versin de una subred de comunicacin que implementa acceso mltiple con deteccin de
portadora. Esto nos da la funcionalidad Ethernet.

Dispositivo de red (Net device)


La tarjeta de red NIC (Network interface controller), no funciona sin un software driver para
controlar el hardware. En unix (o Linux), un hardware perifrico es clasificado como un
dispositivo (device). Los dispositivos son controlados usando drivers para dispositivos y los
dispositivos de red (NICs) son controlados usando drivers de dispositivo de red, generalmente
llamado net divices. En unix o Linux se hace referencia a estos dispositivos de red (net divices)
con nombres como eth0.
En ns-3, la abstraccin del dispositivo de red (net divice) abarca tanto el controlador de software
y el hardware simulado. Un dispositivo de red es instalado en un Nodo, con el fin de posibilitar
que el nodo se comunique con otros nodos en la simulacin a travs de canales (Channels).
La abstraccin del dispositivo de red es representada en C++ por la clase NetDevice. La clase
NetDevice provee mtodos para manejar las conexiones a los nodos y canales; y puede ser
especializado por los desarrolladores en el sentido de la programacin orientada a objetos.
Vamos usar varias versiones especializadas de NetDevice llamado CsmaNetDevice,
PointToPointNetDevice y WifiNetDevice en este tutorial. Solo como una NIC Ethernet es
diseada para trabajar con una red ethernet, el CsmaDevice es diseado para trabajar con un
CsmaChannel; el PointToPointNetDevice es diseado para trabajar con un
PointToPointChannel y un WifiNetDevice es diseado para tranajar con un WifiChannel.

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Ayudantes Topologa (Topology Helpers)


En una red real encontramos computadoras (host) con NICs agregadas o integradas. En NS-3
deberamos encontrar Nodos (Nodes) unido a dispositivos de red (NetDevices). En una gran red
simulada tendr que organizar muchas conexiones entre Nodos (Nodes), dispositivos de red
(NetDevices) y canales (Channels).
Dado que las conexiones de dispositivo de red (NetDevice) a nodos (Nodes), dispositivos de
red (NetDevice) a canales (Channels), asignar direcciones IP, etc es tan comn en NS3.Ofrecemos los llamados ayudantes de topologa (Topology Helpers) para hacer esto lo ms
fcil posible. Por ejemplo, es posible que muchas de las diferentes operaciones esenciales de
NS-3 para crear un dispositivo de red (NetDevice), agregar una direccin MAC, instalar el
dispositivo de red en un nodo, configurar la pila de protocolos del nodo, y luego conectar el
dispositivo de red (NetDevice) a un canal(Channel). Incluso ms operaciones seran necesarios
para conectar varios dispositivos en los canales multipunto y para conectar redes individuales
juntas en rede de trabajo. Ofrecemos objetos de ayuda de topologa que combinan estas
distintas operaciones de fcil uso para su conveniencia.

Un primer Script NS-3


En el directorio ./examples/tutorial hay un archivo llamado first.cc, este es un simple script punto
a punto entre dos nodos que envan un paquete entre los dos nodos, a continuacin
explicaremos paso a paso este script.
La primera lnea del archivo es un modo de lnea emac.
/* -*- Mode:C++; c-file-style:gnu; indent-tabs-mode:nil; -*- */
Las siguientes lineas son comentarios con respecto a las licencia GNU, en todos los archivos de
ns-3 se vern estas lneas.
/*
* This program is free software; you can redistribute it and/or
modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 021111307 USA
*/

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Libreras incluidas
El cdigo correcto comienza con varias sentencias de inclusin
#include
#include
#include
#include
#include

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

Para ayudar a los usuarios frente a la cantidad de archivos a incluir, se ofrece un nico archivo
que carga recurrentemente todos los archivos necesarios en cada mdulo.
Cada uno de los archivos incluidos NS-3 es alojado en el directorio llamado ns-3 (debajo del
directorio de construccin),

Espacio de nombre NS-3(NS-3 Namespace)


La siguiente lnea del archivo first.cc, es la declaracin de espacio de
nombre
using namespace ns3;
El proyecto ns-3 es implementado en C++ con un espacio de nombre denominado ns3.

Logging
La siguiente lnea del script es la siguiente:
NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");
Se define un componente de Log con un nombre especfico. Esta macro debera ser usada al
comienzo de cada archivo que quiera usar la macro NS_LOG. Esta macro define un nuevo
componente de log que puede ser activado o desactivado usando las funciones:
ns3::LogComponentEnable y ns3::LogComponentDisable o con la variable de ambiente
NS_LOG.

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Funcin principal
La siguiente lnea del script encontrara lo siguiente:
int main (int argc, char *argv[]){
Esto es solo la declaracin de la funcin principal del programa (script). Al igual que todo
programa de C++, se necesita definir una funcin principal que ser el primero en ejecutarse.
Las siguientes dos lneas del script son usada para habilitar dos componentes de loggeo que
construyen el Eco del cliente y del servidor de aplicaciones:
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);

Topology Helpers
NodeContainer
La siguiente dos lneas del cdigo del script crear objetos nodos NS-3, que representarn las
computadoras en la simulacin.
NodeContainer nodes;
nodes.Create(2);
Usted puede recordar que una de nuestras abstracciones clave es el Nodo. Esto representa un
equipo al que vamos a aadir cosas como las pilas de protocolos, aplicaciones y tarjetas de
perifricos. El NodeContainer (Topology helper), proporciona una manera conveniente para
crear, gestionar y acceder a todos los objetos del nodo que creamos con el fin de ejecutar una
simulacin. La primera lnea simplemente declara una NodeContainer que llamamos nodos. La
segunda lnea llama al mtodo Create del objeto nodos y pide al contenedor para crear dos
nodos. Como se describe en la Doxygen, el contenedor llama hacia abajo en el sistema de ns-3
adecuado para crear dos objetos de nodo y almacena punteros a los objetos internos.

PointToPointHelper
Estamos construyendo un enlace punto a punto, y un patrn que se har muy familiar para
usted, es utilizar un objeto topology helper para hacer el trabajo de bajo nivel necesario para
poner el enlace juntos. Recordemos que dos de nuestras abstracciones fundamentales son los
Netdevice y el Channel. En el mundo real, estos trminos corresponden ms o menos a las
tarjetas de perifricos y los cables de la red. Normalmente estas dos cosas estn ntimamente
unidas entre s y uno no puede esperar para intercambiar, por ejemplo, los dispositivos Ethernet
y canales inalmbricos. Nuestros ayudantes Topologa siguen este acoplamiento ntimo y por lo
tanto
se
utiliza
una
solo
PointToPointHelper
para
configurar
y
conectar
PointToPointNetDevice y los objetos PointToPointChannel en este script.

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Las siguientes tres lneas en el script son:


PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
La primera lnea instancia un objeto PointToPointHelper en la pila.
PointToPointHelper pointToPoint;
Desde una perspectiva de alto-nivel la siguiente lnea dice que el objeto PointToPointHelper usa
el valor de 5Mbps (cinco mega bits por segundo), como la velocidad de datos (dateRate) cuando
es creado el objeto PointToPointNetDevice.
pointToPoint.SetDeviceAttribute("DataRate", StringValue ("5Mbps"));
Desde una perspectiva ms detallada, la cadena DataRate corresponde a lo que llamamos un
atributo del PointToPointNetDevice. Si nos fijamos en el Doxygen para la clase
ns3::PointToPointNetDevice la documentacin para el mtodo GetTypeId, tiene una lista de
atributos definidos para el dispositivo. Entre ellos se encuentra el atributo DataRate. La
mayora de los mtodos visibles tienen listas similares de atributos. Nosotros utilizamos este
mecanismo para configurar fcilmente simulaciones sin necesidad de recompilar como se ver
en la siguiente seccin.
Similar que el DateRate en el PointToPointNetDevice ver un atributo asociado Delay con el
PointToPointChannel. Al final de la linea.
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
Esto dice que PointToPointHelper usa el valor de 2ms (dos milisegundos) como el valor de
retardo en la transmisin de cada punto a punto del canal que se crea posteriormente.

NetDeviceContainer
En este punto del script, tenemos un NodeContainer que contiene dos nodos. Tenemos un
PointToPointHelper que est preparado y listo para hacer objetos PointToPointNetDevices y
un canal PointToPointChannel entre ellos. Solo usamos el NodeContainer para crear los nodos
de nuestra simulacin, le pediremos a el PointToPointHelper para hacer el trabajo necesario para
crear, configurar e instalar los dispositivos para nosotros. Tendremos que tener una lista de todos
los objetos netdevice que se crean, as que usamos un NetDeviceContainer para mantenerlos
igual que nosotros utilizamos un NodeContainer para mantener los nodos que hemos creado.
Las siguientes dos lneas de cdigo,
NetDeviceContainer devices;
devices = pointToPoint.Install(nodes);

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

La primera lnea declara el contenedor dispositivo mencionado anteriormente y el segundo hace


el trabajo pesado. El mtodo install del PointToPointHelper toma un NodeContainer como un
parmetro. Internamente, se crea un NetDeviceContainer. Para cada nodo del NodeContainer
(debe ser exactamente dos para un enlace punto a punto) un PointToPointNetDevice se crea y
se guarda en el contenedor del dispositivo. Un PointToPointChannel se crea y los dos
PointToPointNetDevices se agregan. Cuando los objetos son creados por el
PointToPointHelper, los atributos previamente establecidos en el ayudante se utilizan para
inicializar los atributos correspondientes en los objetos creados.
Despues de ejecutar el pointToPoint.Install(nodes) tendremos dos nodos, cada uno con un
dispositivo de red punto a punto y u
n solo canal punto a punto instalado entre ellos. Ambos
dispositivos se pueden configurar para transmitir datos a cinco megabits por segundo a travs
del canal que tiene un retardo de transmisin de dos milisegundos.

InternetStackHelper
Ahora tenemos nodos y dispositivos configurados, pero no tenemos ninguna pila de protocolo
instalado en nuestros nodos. Las siguientes dos lneas de cdigo se encargan de eso:
InternetStackHelper stack;
stack.Install (nodes);

El InternetStackHelper es un ayudante de topologia (topology helper) para la pila del protocolo


de internet, el PointToPointHelper es para el dispositivo de red punto a punto. El mtodo install
toma un Nodocontainer como parmetro, cuando es ejecutado, instalar una pila de internet
(TCP,UDP,IP,etc) en cada nodo en el nodo container.

Ipv4AddressHelper
Lo siguiente que necesitamos es asociar el dispositivo de nuestros nodos con direcciones IP. Se
provee de un ayudante de topologa para manejar la asignacin de direcciones IP.
La nica API visible para el usuario es configurar la direccin IP de base y la mscara de red
para utilizar cuando se realiza la asignacin de direcciones actual (que se realiza a un nivel
inferior dentro de la ayuda).
Ipv4AddressHelper address;
address.SetBase("10.1.1.0", "255.255.255.0");
Declarar un objeto ayudante de direccin y decirle que debe comenzar la asignacin de
direcciones IP de la red 10.1.1.0 con la mscara 255.255.255.0 para definir los bits asignables.
Por defecto, las direcciones asignadas comenzarn a uno y aumentar montonamente, por lo
que la primera direccin asignada de esta base ser 10.1.1.1, 10.1.1.2 seguido, etc. El bajo nivel
del sistema ns-3 en realidad recuerda todas las direcciones IP asignadas y generar un error
grave si accidentalmente asigna la misma direccin que se generara dos veces (lo cual es muy
difcil de depurar errores, por cierto).

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

La siguiente lnea de cdigo:


Ipv4InterfaceContainer interfaces = address.Assign (devices);

Realiza la asignacin de la direccin real. En ns-3 hacemos la asociacin entre una direccin IP
y un dispositivo que utiliza un objeto Ipv4Interface. As como a veces necesitamos una lista de
dispositivos de red creados por un ayudante para referencia futura a veces necesitamos una lista
de objetos Ipv4Interface. El Ipv4InterfaceContainer proporciona esta funcionalidad.
Ahora tenemos construido una red punto a punto, con las pilas instaladas y las direcciones IP
asignadas. Lo que necesitamos en este momento son las aplicaciones para generar trfico.

Aplicacin
Otro de las abstracciones del sistema NS-3 es la aplicacin. En este script usamos dos
especializaciones
de
la
clase
Application
del
core
de
ns-3,
llamadas
UdpEchoServerApplication y UdpEchoClientApplication. As como tenemos nuestros objetos
de
ayuda
aqu
tambin
usamos Ayudantes
como
UdpEchoServerHelper
y
UdpEchoClientHelper para hacer la vida ms fcil.

UdpEchoServerHelper
Las siguientes lneas de cdigo de nuestro ejemplo, first.cc, son usados para configurar una
aplicacin UDP echo server en uno de los nodos que previamente hemos creado.
UdpEchoServerHelper echoServer(9);
ApplicationContainer serverApps = echoServer.Install(nodes.Get(1));
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));
La primera lnea del cdigo del fragmento anterior declara el UdpEchoServerHelper. Como es
usual, esta no es la aplicacin en s, es un objeto usado para crear la actual aplicacin. Una de
nuestras convenciones es colocar atributos requeridos en el constructor del helper. En este caso,
el helper no puede hacer nada til, a menos que disponga de un nmero de puerto que tambin
el cliente conozca.
Similar a otros muchos objetos helper, el UdpEchoServerHelper tiene un mtodo install. Es la
ejecucin de este mtodo que realmente hace que la aplicacin del servidor de eco subyacente a
ser instanciado y unido a un nodo.
La aplicacin requiere un tiempo para comenzar la generacin de trfico y otro tiempo para
terminar. Estos tiempos se establecen utilizando los mtodos start y stop del
ApplicationContainer.

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

UdpEchoClientHelper
La aplicacin echoClient tiene un mtodo sustancialmente similar al del servidor. Hay un
UdpEchoClientApplication subyacente que es administrado por un UdpEchoClientHelper.
Para el echo client, sin embargo, tenemos que establecer cinco atributos diferentes. Los dos
primeros atributos se establecen durante la construccin de la UdpEchoClientHelper. Pasamos
los parmetros que se utilizan (internamente para el ayudante) para establecer los atributos
RemoteHost RemoteAddress de acuerdo con la convencin de hacer obligatorios los
parmetros de atributos en los constructores del helper.
Recordemos que hemos utilizado un Ipv4InterfaceContainer para realizar un seguimiento de las
direcciones IP que asignamos a nuestros dispositivos. La interfaz de orden cero en el contenedor
de interfaces se va a corresponder a la direccin IP del nodo de orden cero en el contenedor de
nodos. La primera interfaz en el contenedor de las interfaces corresponde a la direccin IP del
primer nodo en el contenedor de nodos. As, en la primera lnea de cdigo, estamos creando el
ayudante donde indicamos en el primer atributo del constructor la direccin IP del servidor udp
echo y el segundo atributo le indicamos que enve los paquetes por el puerto nueve.
El atributo MaxPackets indica al cliente el nmero mximo de paquetes que permiten que enve
durante la simulacin. El atributo Interval indica al cliente el tiempo de espera entre los
paquetes, y el atributo PacketSize le dice al cliente qu tan grande debe ser su carga til de los
paquetes. Con esta combinacin de atributos, le estamos diciendo al cliente que enve un
paquete de 1024 bytes.
Al igual que en el caso del servidor de eco, le decimos al cliente echo iniciar y detener, pero aqu
se inicia el cliente un segundo despus de activar el servidor (a los dos segundos de la
simulacin).
UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));

Simulacin
Para ejecutar la simulacin, se utiliza la siguiente instruccin:
Simulator::Run ();
Cuando Simulator::Run se llama, el sistema comenzar a buscar por la lista de eventos
programados y ejecutarlas. En primer lugar, se ejecutar el evento en 1,0 segundos, lo que
comenzar la aplicacin de servidor de eco (este evento puede, a su vez, programar muchos
otros eventos). A continuacin, se ejecutar el evento programado para t=2,0 segundos, que se

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

iniciar la aplicacin cliente de eco. Una vez ms, este evento puede programar muchos ms
eventos. El evento de inicio de la aplicacin en la aplicacin cliente de eco se iniciar la fase de
transferencia de datos de la simulacin mediante el envo de un paquete al servidor.
Por ultimo lo que queda es limpiar. Esto se hace llamando a la funcin global Simulator::Destroy.
Simulator::Destroy ();
return 0;
}

Logging
Hay 7 niveles de mensajes de log aumentando el nivel de detalle de loggeo

LOG_ERROR: Log de mensajes de error (macro asociada: NS_LOG_ERROR)


LOG_WAR: Log de mensajes de warning (macro asociada: NS_LOG_WARN)
LOG_DEBUG: Log mensajes de debug (macro asociada: NS_LOG_DEBUG)
LOG_INFO: Log de mensajes de informacin acerca del programa en ejecucin(macro
asociada: NS_LOG_INFO)
LOG_FUNCTION: Mensaje de log que describe cada funcin llamada ( dos macros
asociadas NS_LOG_FUNCTION, usada para miembros de funciones y
NS_LOG_FUNCTION_NOARGS, usado para funciones estticas.
LOG_LOGIC: Mensajes de log que describen el flujo lgico dentro de una funcin
(macro asociada: NS_LOG_LOGIC)
LOG_ALL: Log con todo lo mencionado anteriormente (no hay macro asociada).

Para cada log_type tambin hay un LOG_LEVEL_TYPE que, si se utiliza, permite logear todos
los niveles por encima de este, adems de su nivel. (Como consecuencia de esto, LOG_ERROR
y LOG_LEVEL_ERROR y tambin LOG_ALL y LOG_LEVEL_ALL son funcionalmente
equivalentes.). Por ejemplo, lo que permite LOG_INFO slo permitir mensajes proporcionados
por NS_LOG_INFO macro, al tiempo que permite LOG_LEVEL_INFO tambin permitirn
mensajes proporcionados por NS_LOG_DEBUG, NS_LOG_WARN y macros NS_LOG_ERROR.

Habilitar loggin
Si ejecutamos el programa myfirst.cc veremos la salida de consola como se muestra a
continuacin:
Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3dev/build'
'build' finished successfully (0.413s)
Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
Received 1024 bytes from 10.1.1.2
Donde la siguiente lnea de cdigo habilita el LOG_LEVEL_INFO como nivel de log para el
UdpEchoClientApplication.

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
Con este habilitamos este nivel y los niveles por debajo de este, en este caso hemos habilitado
los niveles NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN y NS_LOG_ERROR.
Podemos incrementar el nivel y obtener ms informacin sin necesidad de cambiar el script y
volver a compilar a travs de las variables de entorno NS_LOG como se muestra en la siguiente
linea de cdigo:
export NS_LOG=UdpEchoClientApplication=level_all
La lnea anterior configura la variable de entorno NS_LOG a la cadena de caracteres:
UdpEchoClientApplication=level_all
El lado izquierdo de la asignacin es el nombre del componente de loggin que queremos ajustar,
y el lado derecho es el nivel de log que queremos usar. En este caso, vamos a habilitar todos los
niveles de loggin de la aplicacin. Si ejecuta el script con NS_LOG de esta manera, usted
debera ver el siguiente resultado:
Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3dev/build
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3dev/build'
'build' finished successfully (0.404s)
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SetDataSize(1024)
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientApplication:Send()
Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)
Received 1024 bytes from 10.1.1.2
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
Podemos agregarle ms detalle al log, como saber el prefijo del componente que utiliza tal
funcin (por ejemplo la funcin send no sabemos porque componente es llamado). Esto lo
hacemos a travs de la siguiente lnea de cdigo:
export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

En la lnea anterior habilitamos el prefijo para UdpEchoClientApplication, donde la salida es la


siguiente:
Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3dev/build'
'build' finished successfully (0.417s)
UdpEchoClientApplication:UdpEchoClient()
UdpEchoClientApplication:SetDataSize(1024)
UdpEchoClientApplication:StartApplication()
UdpEchoClientApplication:ScheduleTransmit()
UdpEchoClientApplication:Send()
UdpEchoClientApplication:Send(): Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)
UdpEchoClientApplication:HandleRead(): Received 1024 bytes from
10.1.1.2
UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
Para habilitar otro componte usamos la siguiente sintaxis como se muestra en el ejemplo
siguiente:
export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func:
UdpEchoServerApplication=level_all|prefix_func'
Tambin podemos habilitar el tiempo en que se ejecuta cada instruccin como se muestra a
continuacin:
export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func|
prefix_time:
UdpEchoServerApplication=level_all|prefix_func|
prefix_time'

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

En el siguiente log podemos ver como se muestra el tiempo en que se ejecuta cada instruccin:
Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3dev/build'
'build' finished successfully (0.418s)
0s UdpEchoServerApplication:UdpEchoServer()
0s UdpEchoClientApplication:UdpEchoClient()
0s UdpEchoClientApplication:SetDataSize(1024)
1s UdpEchoServerApplication:StartApplication()
2s UdpEchoClientApplication:StartApplication()
2s UdpEchoClientApplication:ScheduleTransmit()
2s UdpEchoClientApplication:Send()
2s UdpEchoClientApplication:Send(): Sent 1024 bytes to 10.1.1.2
2.00369s UdpEchoServerApplication:HandleRead(): Received 1024 bytes
from 10.1.1.1
2.00369s UdpEchoServerApplication:HandleRead(): Echoing packet
2.00737s UdpEchoClientApplication:HandleRead(0x624290, 0x624ad0)
2.00737s UdpEchoClientApplication:HandleRead(): Received 1024 bytes
from 10.1.1.2
10s UdpEchoServerApplication:StopApplication()
10s UdpEchoClientApplication:StopApplication()
UdpEchoClientApplication:DoDispose()
UdpEchoServerApplication:DoDispose()
UdpEchoClientApplication:~UdpEchoClient()
UdpEchoServerApplication:~UdpEchoServer()
Para Loggear todo tipo de componentes podemos usar comodines como el asterisco.
export 'NS_LOG=*=level_all|prefix_func|prefix_time'

Como este nivel de detalle de log es demasiado grande una buena prctica es redirigir la salida a
un archivo como se muestra a continuacin:
./waf --run scratch/myfirst > log.out 2>&1

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Usando parmetros de lnea de comando


El primer paso en el uso del sistema de argumento de lnea de comandos es declarar el
analizador de lnea de comandos. Esto se hace simplemente (en el programa principal) como en
el cdigo siguiente:
int
main (int argc, char *argv[])
{
...
CommandLine cmd;
cmd.Parse (argc, argv);
}

...

Por ejemplo con la siguiente lnea imprimimos la ayuda de la lnea de comandos.


./waf --run "scratch/myfirst --PrintHelp"
Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3dev/build'
'build' finished successfully (0.413s)
TcpL4Protocol:TcpStateMachine()
CommandLine:HandleArgument(): Handle arg name=PrintHelp value=
--PrintHelp: Print this help message.
--PrintGroups: Print the list of groups.
--PrintTypeIds: Print all TypeIds.
--PrintGroup=[group]: Print all TypeIds of group.
--PrintAttributes=[typeid]: Print all attributes of typeid.
--PrintGlobals: Print the list of globals.
Para imprimir los atributos de PointToPointNetDevice utilizamos el siguiente argumento:
./waf --run "scratch/myfirst
--PrintAttributes=ns3::PointToPointNetDevice"

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

El sistema imprimir todos los atributos de este dispositivo de red:


--ns3::PointToPointNetDevice::Mtu=[1500]: The MAC-level Maximum
Transmission Unit
--ns3::PointToPointNetDevice::Address=[ff:ff:ff:ff:ff:ff]: The MAC
address of this device.
--ns3::PointToPointNetDevice::DataRate=[32768bps]: The default data
rate for point to point links
--ns3::PointToPointNetDevice::ReceiveErrorModel=[0]: The receiver
error model used to simulate packet loss
--ns3::PointToPointNetDevice::InterframeGap=[+0.0ns]: The time to
wait between packet (frame) transmissions
--ns3::PointToPointNetDevice::TxQueue=[0]: A queue to use as the
transmit queue in the device.
Si queremos dar un nuevo valor de DataRate utilizando la lnea de comandos, podemos hacerlo
de la siguiente manera:
./waf --run "scratch/myfirst
--ns3::PointToPointNetDevice::DataRate=5Mbps"
Podemos configurar la velocidad y el retardo de la siguiente manera:
./waf --run "scratch/myfirst
--ns3::PointToPointNetDevice::DataRate=5Mbps
--ns3::PointToPointChannel::Delay=2ms"

Poner sus propios valores


Podemos asignar nuestros propios valores de lnea de comando a travs de 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);
...

Por ejemplo si queremos enviar 3 paquetes, escribimos lo siguiente:


./waf --run "scratch/myfirst --nPackets=3"

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Sistema de Seguimiento o traza (System Tracing)


El objetivo de una simulacin es generar una salida para su posterior estudio y el sistema de
seguimiento (System tracing) es el mecanismo principal para esto. Desde que ns-3 se escribe en
c++, es posible usar la salida estandar como traza del programa, por ejemplo:
#include <iostream>
...
int main ()
{
...
std::cout << "El valor de x es " << x << std::endl;
...
}
El objetivo bsico del sistema de seguimiento del ns-3 es:
Para las tareas bsicas, el sistema de seguimiento debe permitir al usuario
generar el rastreo estndar para fuentes de rastreo popular, y para personalizar
los objetos que generan el trazado.
Los usuarios intermedios deben ser capaces de ampliar el sistema de
seguimiento para modificar el formato de salida generada, o insertar nuevas
fuentes de rastreo, sin modificar el ncleo del simulador.
Los usuarios avanzados pueden modificar el ncleo simulador de aadir nuevas
fuentes de localizacin y sumideros.

Traza en formato ASCII (ASCII Tracing)


NS-3 proporciona la funcin auxiliar que envuelve el sistema de seguimiento de bajo nivel que le
ayude con los detalles necesarios para configurar algunas trazas de paquetes fciles de
entender. Si se activa esta funcin, ver una salida en un archivo de formato ASCII - de ah el
nombre. Para aquellos familiarizados con ns-2 de salida, este tipo de traza es anloga a la out.tr
generada por muchos guiones.
Para habilitar la traza en formato ascii, agregue las siguientes lneas en el script que hemos
estado analizando en todo el tutorial, como se muestra a continuacin:
AsciiTraceHelper ascii;
pointToPoint.EnableAsciiAll (ascii.CreateFileStream ("myfirst.tr"));
Las dos lneas anteriores crean un objeto AsciiTraceHelper el cual creara un archivo llamado
mifirst.tr que contendr la traza del programa.

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Analizar la traza Ascii


Una vez que terminamos de ejecutar el script (myfirst.cc) con la traza ascii habilitada podemos
ver una gran cantidad de informacin en una forma no muy denso, pero la primera cosa a notar
es que hay una serie de lneas distintas en este archivo.
Cada lnea del archivo corresponde a un evento de seguimiento. En este caso estamos
rastreando eventos en la cola de transmisin presentes en cada dispositivo de red punto a punto
de la simulacin. La cola de transmisin es una cola a travs del cual debe pasar cada paquete
destinado para un canal punto a punto. Tenga en cuenta que cada lnea en el archivo de
seguimiento comienza con un personaje solitario (tiene un espacio despus de la misma). Este
personaje tendr el siguiente significado:
+ : Una operacin en cola se produjo en la cola de dispositivo; - : La operacin de quitar de la
cola se produjo en la cola de dispositivo; d : Un paquete fue cado, por lo general debido a que la
cola estaba llena; R : Un paquete fue recibido por el dispositivo de red. Vamos a dar una visin
ms detallada de la primera lnea en el archivo de rastreo. Voy a dividirlo en secciones (con
sangra para mayor claridad) con un nmero de referencia en el lado izquierdo:
0 +
1 2
2 /NodeList/0/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Enqueue
3 ns3::PppHeader (
4 Point-to-Point Protocol: IP (0x0021))
5 ns3::Ipv4Header (
6
tos 0x0 ttl 64 id 0 protocol 17 offset 0 flags [none]
7
length: 1052 10.1.1.1 > 10.1.1.2)
8
ns3::UdpHeader (
9
length: 1032 49153 > 9)
10
Payload (size=1024)
La primera seccin (referencia 0) de este evento de la traza expandida es la operacin. Tenemos
un carcter +, por lo que esto corresponde a una operacin de encolamiento en la cola
transmitida. La segunda seccin (referencia 1) es el tiempo de la simulacin expresado en
segundos. Podemos recordar que le preguntamos al UdpEchoClientApplication para iniciar el
envo de paquetes a dos segundos. Aqu vemos la confirmacin de que este hecho sucede.
La siguiente seccin del ejemplo de la traza (Referencia 2) nos dice qu origen de seguimiento
origin este evento (en el espacio de rastreo). La raz del espacio de nombres es la lista de
nodos (NodeList). Esto corresponde a un contenedor administrado por el ncleo del ns-3,
contiene todos los nodos que se crean en un script. As como un sistema de archivos puede
tener directorios en la raz, podemos tener nmeros de nodo en la lista de nodos. La cadena
/NodeList/0 por lo tanto, se refiere al nodo cero en el NodeList que normalmente consideramos
como nodo 0. En cada nodo hay una lista de los dispositivos que se han instalado. Esta lista
aparece a continuacin en el espacio de nombres. Usted puede ver que este evento de
seguimiento viene de DeviceList/0/ , que es el dispositivo de cero instalado en el nodo.

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

La siguiente cadena ns3::PointToPointNetDevice dice que tipo de dispositivo hay en el nodo cero
de la lista de dispositivo. Recordemos que la operacin + encontrar en la referencia 00 significa
que una operacin de puesta en cola que sucedi en la cola de transmisin del dispositivo. Esto
se refleja en los segmentos finales de la ruta de rastreo, que son TXQUEUE/Enqueue.
Las secciones restantes de la traza debe ser bastante intuitiva. Referencias 3-4 indican que el
paquete se encapsula en el protocolo de punto a punto. Referencias 5-7 muestran que el
paquete tiene una IP versin cuatro cabecera y tiene su origen en la direccin IP 10.1.1.1 y est
destinado a 10.1.1.2. Referencias 8-9 muestran que este paquete tiene una cabecera UDP y,
finalmente, de referencia 10 muestra que la carga til es los esperados 1.024 bytes.
La siguiente lnea en el archivo de rastreo muestra el mismo paquete de ser quitadas de la cola
de transmisin en el mismo nodo.
La tercera lnea en el archivo de rastreo muestra el paquete de ser recibido por el dispositivo de
red en el nodo con el servidor de eco. He reproducido ese evento a continuacin.
0 r
1 2.25732
2 /NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/MacRx
3 ns3::Ipv4Header (
4
tos 0x0 ttl 64 id 0 protocol 17 offset 0 flags [none]
5
length: 1052 10.1.1.1 > 10.1.1.2)
6
ns3::UdpHeader (
7
length: 1032 49153 > 9)
8
Payload (size=1024)

Ahora la operacin de traza es r y el tiempo de simulacin se ha incrementado a 2,25732


segundos.
El espacio de nombres de entrada origen de seguimiento (referencia 02) ha cambiado para
reflejar que este evento est llegando desde el nodo 1 (/NodeList/1) y el origen de seguimiento
recepcin de paquetes (/MacRx).

Traza Pcap
NS-3 puede crear trazas en formato pcap para luego ser utilizadas por el programa Wireshark.
Para habilitar la traza en formato pcap se deben agregar las siguientes lineas en el script.
pointToPoint.EnablePcapAll ("myfirst");
Esto crea un archivo de rastreo para cada dispositivo de punto-a-punto en la simulacin. Los
nombres de archivo se construyen utilizando el prefijo, el nmero de nodo, el nmero de
dispositivo y un pcap. Sufijo.
En nuestro script de ejemplo, vamos a ver finalmente los archivos denominados MyFirst-00.pcap y MyFirst-1-0.pcap, que son las trazas pcap para el nodo 0, dispositivo 0 y nodo 1 de
dispositivo 0, respectivamente.
Una vez que haya agregado la lnea de cdigo para que pcap trazado, puede ejecutar la
secuencia de comandos de la forma habitual:
$ ./waf --run scratch/myfirst

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Lectura del archivo pcap con tcpdump


Para ver los archivos pcap usamos el tcpdump.
$ tcpdump -nn -tt -r myfirst-0-0.pcap
reading 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 1024
2.514648 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, length 1024
tcpdump -nn -tt -r myfirst-1-0.pcap
reading 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 1024
2.257324 IP 10.1.1.2.9 > 10.1.1.1.49153: UDP, length 1024
Se puede ver en el dump de MyFirst-0-0.pcap (el dispositivo cliente) que el paquete de eco se
enva a los 2 segundos en la simulacin. Si nos fijamos en el segundo dump(MyFirst-1-0.pcap)
se puede ver que el paquete que se recibe en 2,257324 segundos. Usted ve el paquete que se
hizo eco de vuelta en 2.257324 segundos del segundo dump, y, finalmente, se ve que el paquete
se recibe de nuevo al cliente en la primera descarga en 2.514648 segundos.

Construyendo una topologa


En esta seccin vamos a expandir nuestro dominio de dispositivos y canales de red en NS-3,
para cubrir un ejemplo de bus de red.
El dispositivo NS-3 CSMA modela una simple red con la base de Ethernet. Una Ethernet real
usa CSMA/CD (Acceso mltiple con deteccin de portadora y deteccin de colisiones). Esquema
con un incremento exponencial del backoff (tiempo de espera antes de volver a transmitir) para
la transmisin por el medio compartido. El dispositivo y canal NS-3 CSMA modela solo un
subconjunto de estos
As como hemos vistos objetos ayudantes de topologa punto a punto ( point-to-point topology
helper), veremos en esta seccin ayudantes de topologa CSMA. La apariencia y operaciones
de estos ayudantes son similares.
Para este caso usaremos el script llamado second.cc basado en el script first.cc, se puede ver
que vamos a ampliar nuestro ejemplo de punto a punto (el enlace entre los nodos n0 y n1 abajo)
donde del lado derecho tenemos un bus de red. Tenga en cuenta que esta es la topologa de red
por defecto, ya que en realidad se puede variar el nmero de nodos creados en la LAN. Si
establece nCsma a uno, habr un total de dos nodos en el (canal CSMA) LAN - un nodo
requerido y un nodo extra. Por defecto hay tres nodos extra, como se ve a continuacin:
// Default Network Topology
//
//
10.1.1.0
// n0 -------------- n1
n2
n3
n4
//
point-to-point |
|
|
|
//
================
//
LAN 10.1.2.0

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

El programa principal comienza con un toque ligeramente diferente. Utilizamos una flag para
determinar si los componentes loggin UdpEchoClientApplication y UdpEchoServerApplication
estn habilitados. Este flag est por defecto en true (los componentes de loggin estn
habilitadas), pero nos permite desactivar el registro de login durante la ejecucin por medio de la
lnea de comando.
Podremos cambiar el nmero de dispositivos en la red CSMA travs de un argumento de lnea
de comandos. La ltima lnea se asegura de que tiene al menos un nodo extra.
bool verbose = true;
uint32_t nCsma = 3;
CommandLine cmd;
cmd.AddValue ("nCsma", "Number of \"extra\" CSMA nodes/devices",
nCsma);
cmd.AddValue ("verbose", "Tell echo applications to log if true",
verbose);
cmd.Parse (argc, argv);
if (verbose)
{
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
}
nCsma = nCsma == 0 ? 1 : nCsma;

El siguiente paso es la creacin de dos nodos que vamos a conectar a travs del enlace punto a
punto. El NodeContainer se utiliza para hacer esto slo como se hizo en first.cc.
NodeContainer p2pNodes;
p2pNodes.Create(2);
A continuacin, se declara otro NodeContainer para mantener los nodos que formarn parte de
la red de buses (CSMA). En primer lugar, acabamos de crear una instancia del objeto contenedor
en s.
NodeContainer csmaNodes;
csmaNodes.Add (p2pNodes.Get(1));
csmaNodes.Create (nCsma);
La siguiente lnea de cdigo Obtiene el primer nodo (como en la que tiene un ndice de uno)
desde el contenedor de nodos punto a punto y se agrega al contenedor de nodos CSMA. El nodo
en cuestin va a terminar con un dispositivo de punto a punto y un dispositivo de CSMA. Luego
creamos una serie de nodos extra que componen el resto de la red CSMA. Como ya tenemos
un nodo en la red CSMA - el que va a tener tanto un punto-a-punto y el dispositivo de red CSMA,
el nmero de nodos extra significa que los nmero nodos que desee en la seccin CSMA
menos uno.

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

El siguiente fragmento de cdigo debe ser muy familiar a estas alturas. Tenemos una instancia
de un PointToPointHelper y establecemos el valor predeterminado asociados a los atributos para
que podamos crear un dispositivo de cinco megabits por segundo y dos milsimas de segundo
retraso del canal.
PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
NetDeviceContainer p2pDevices;
p2pDevices = pointToPoint.Install (p2pNodes);
A continuacin, una instancia de un NetDeviceContainer hacer un seguimiento de los dispositivos
de red de punto a punto pasndole a travs del mtodo install los nodos punto a punto.
Ya hemos mencionado que iba a ver a un ayudante para los dispositivos y canales CSMA, y las
siguientes lneas se muestra esto. El CsmaHelper funciona como un PointToPointHelper , sino
que crea y conecta los dispositivos y canales CSMA. En el caso de un dispositivo de CSMA y par
de canales, observe que la tasa de datos se especifica por un canal de Atributo en lugar de un
dispositivo de Atributo. Esto se debe a una red CSMA verdadera no permite una para mezclar,
por ejemplo, dispositivos de 100Base-T 10Base-T y en un canal dado. Establecemos primero la
Velocidad de datos de 100 megabits por segundo, y luego ajustar el retardo Velocidad de la luz
del canal para 6560 nano-segundos (elegido arbitrariamente como 1 nanosegundo por pie sobre
un segmento de 100 metros). Tenga en cuenta que puede establecer un atributo con el tipo de
datos nativo.
CsmaHelper csma;
csma.SetChannelAttribute ("DataRate", StringValue ("100Mbps"));
csma.SetChannelAttribute ("Delay", TimeValue (NanoSeconds (6560)));
NetDeviceContainer csmaDevices;
csmaDevices = csma.Install (csmaNodes);
As como hemos creado una NetDeviceContainer para mantener los dispositivos creados por el
PointToPointHelper creamos un NetDeviceContainer para mantener los dispositivos creados por
nuestro CsmaHelper. Llamamos al mtodo install del CsmaHelper para agregar los dispositivos
en los nodos csmaNodes NodeContainer.
Ahora tenemos nuestros nodos, dispositivos y canales creados, pero no tenemos pilas de
protocolos presentes. Al igual que en el script first.cc, vamos a utilizar el InternetStackHelper
para instalar estas pilas.
InternetStackHelper stack;
stack.Install (p2pNodes.Get (0));
stack.Install (csmaNodes);

Recordemos que tomamos uno de los nodos del contenedor p2pNodes y aadimos el
csmaNodes contenedor. Por lo tanto slo tenemos que instalar las pilas en el resto p2pNodes
nodo y todos los nodos de la csmaNodes contenedor para cubrir todos los nodos de la
simulacin.

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Al igual que en el script first.cc de ejemplo, vamos a utilizar el Ipv4AddressHelper para asignar
direcciones IP a las interfaces del dispositivo. En primer lugar se utiliza la red 10.1.1.0 para crear
las dos direcciones necesarias para nuestros dos dispositivos punto-a-punto.
Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer p2pInterfaces;
p2pInterfaces = address.Assign (p2pDevices);

Recordemos que salvamos las interfaces creadas en un contendedor para que sea fcil de sacar
informacin de direccionamiento ms tarde para su uso en la creacin de las aplicaciones.
Ahora tenemos que asignar direcciones IP a los interfaces de los dispositivos CSMA. La
operacin funciona igual que se hizo en el caso de punto a punto, excepto que ahora estamos
realizando la operacin en un contenedor que tiene un nmero variable de dispositivos CSMA recuerde que nosotros hicimos que el nmero de dispositivos CSMA sea variable por el
argumento de la lnea de comandos. Los dispositivos CSMA estarn asociados con las
direcciones IP de nmero de red 10.1.2.0 en este caso, como se ve a continuacin.
address.SetBase ("10.1.2.0", "255.255.255.0");
Ipv4InterfaceContainer csmaInterfaces;
csmaInterfaces = address.Assign (csmaDevices);
Ahora tenemos una topologa construida, pero necesitamos aplicaciones. En esta seccin va a
ser similar a la seccin de aplicaciones del script first.cc, pero vamos a crear una instancia del
servidor en uno de los nodos que tiene un dispositivo de CSMA y el cliente en el nodo que tiene
solamente un dispositivo de punto a punto.
En primer lugar, hemos creado el servidor de eco. Creamos un UdpEchoServerHelper y
configuramos los atributos al constructor que es el nmero de puerto del servidor. Recordemos
que este puerto se puede cambiar ms adelante mediante el metodo SetAttribute, si lo desea,
pero le exigimos que sea proporcionada al constructor.
UdpEchoServerHelper echoServer (9);
ApplicationContainer serverApps = echoServer.Install (csmaNodes.Get
(nCsma));
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));
Recordemos que el csmaNodes NodeContainer contiene uno de los nodos creados para la red
de punto a punto y el nCsma los nodos extra. Lo que queremos obtener es el ltimo de los
nodos extra. La entrada cero del contenedor csmaNodes ser el nodo de punto-a-punto. La
forma ms fcil de pensar en esto, entonces, es si creamos un nodo CSMA extra, entonces
ser el ndice de uno de los contenedores csmaNodes. Por induccin, si creamos nCsma nodos
extra el ltimo ser en el ndice nCsma . Esto se ve expuesto en el Get de la primera lnea de
cdigo.

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

La aplicacin cliente est configurada exactamente como lo hicimos en el script first.cc de


ejemplo. Una vez ms, configuramos los atributos del UdpEchoClientHelper en el constructor (en
este caso, la direccin y el puerto remoto). Le decimos al cliente para enviar paquetes al servidor
que acaba de instalar en el ltimo de los nodos CSMA extra. Instalamos el cliente en el nodo de
punto a punto ms a la izquierda se ve en la ilustracin de topologa.
UdpEchoClientHelper echoClient (csmaInterfaces.GetAddress (nCsma), 9);
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
ApplicationContainer clientApps = echoClient.Install (p2pNodes.Get
(0));
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));
Dado que en realidad hemos construido un conjunto de redes aqu, necesitamos algn tipo de
enrutamiento de redes. NS-3 responde a lo que llamamos enrutamiento global para ayudarle.
El enrutamiento Global se aprovecha del hecho de que toda la internetwork es accesible en la
simulacin y se ejecuta a travs de la totalidad de los nodos creados para la simulacin - que
hace el trabajo duro de la creacin de enrutamiento para usted sin tener que configurar routers.
Bsicamente, lo que pasa es que cada nodo se comporta como si fuera un enrutador OSPF que
se comunica al instante y por arte de magia con todos los dems routers detrs de las escenas.
Cada nodo genera avisos de enlaces y las comunica directamente a un gestor de ruta global que
utiliza esta informacin global para construir las tablas de enrutamiento para cada nodo. La
creacin de este tipo de enrutamiento es una sola lnea:
Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
Ahora habilitamos la traza pcap. La primera linea del script habilita la traza pcap en el ayudante
punto a punto. La segunda linea habilita la traza pcap en el ayudante CSMA y hay un parametro
extra que an no se ha mostrado.
pointToPoint.EnablePcapAll ("second");
csma.EnablePcap ("second", csmaDevices.Get (1), true);

La red CSMA es una red multi-punto-a-punto. Esto significa que no puede (y se encuentran en
este caso) mltiples puntos finales en un medio compartido. Cada uno de estos puntos finales
tienen un dispositivo de red asociado con l. Hay dos alternativas bsicas para recopilar
informacin de seguimiento de este tipo de red. Una forma es la de crear un archivo de rastreo
para cada dispositivo de red y almacenar slo los paquetes que son emitidos o consumidos por
el ese dispositivo de red. Otra forma es elegir uno de los dispositivos y colocarlo en modo
promiscuo. Este dispositivo solo luego sniffs la red para todos los paquetes y los almacena en
un nico archivo pcap. Esta es la forma en tcpdump, por ejemplo, funciona. Ese ltimo parmetro
indica al ayudante CSMA si desea o no realizar la captura de paquetes en modo promiscuo.
En este ejemplo, vamos a seleccionar uno de los dispositivos en la red CSMA y le pedir que
funcione en modo promiscuo en la red, emulando as como tcpdump lo hara. Si estuvieras en
una mquina Linux podra hacer algo como tcpdump -i eth0 para obtener la traza. En este caso,
se especifica el dispositivo utilizando csmaDevices.Get (1), que selecciona el primer dispositivo

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

en el contenedor. Configurando el ltimo parmetro como true habilita capturas promiscuas.


La ltima seccin del cdigo slo se ejecuta y se limpia la simulacin como el ejemplo first.cc.
Simulator::Run ();
Simulator::Destroy ();
return 0;
}

Para ejecutar este ejemplo, copie el script second.cc en el directorio stratch y use waf para
compilar, tal como se hizo en el ejemplo fist.cc. Si est parado en el directorio de nivel superior
del repositorio, escriba lo siguiente:
cp examples/tutorial/second.cc stratch/mysecond.cc
./waf

Para ejecutar el ejemplo antes debemos limpiar la variable de entorno con el siguiente comando:
export'NS_LOG='
En caso que quisieramos loggear con mayor detalle ponemos la variable de entorno como:
export'NS_LOG=UdpEchoClientApplication=level_all|prefix_func|
prefix_time:UdpEchoServerApplication=level_all|prefix_func|prefix_time'
Ahora ejecutamos el script de la siguiente forma:
./waf --run "scratch/mysecond"
La salida que veremos al ejecutar el script second.cc ser la siguiente:
Waf: Entering directory `/home/latys/simulador-ns3/ns-allinone-3.17/ns3.17/build'
Waf: Leaving directory `/home/latys/simulador-ns3/ns-allinone-3.17/ns3.17/build'
'build' finished successfully (1.688s)
At time 2s client sent 1024 bytes to 10.1.2.4 port 9
At time 2.0038s server received 1024 bytes from 10.1.1.1 port 49153
At time 2.0038s server sent 1024 bytes to 10.1.1.1 port 49153
At time 2.00761s client received 1024 bytes from 10.1.2.4 port 9
Recordemos que la primera linea sent 1024 bytes to 10.1.2.4, es el cliente UDP echo que enva
una paquete al servidor. En este caso, el servidor est en una red diferente (10.1.2.0). El
segundo mensaje received 1024 bytes from 10.1.1.1, es del UDP echo server, generado
cuando recibe el paquete echo del cliente. El mensaje final received 1024 bytes from 10.1.2.4
es del cliente echo. Indicando que ha recibido este paquete echo desde el servidor.
Si miramos en el directorio actual donde se ejecut el script, veremos los tres archivos de traza:
second-0-0.pcap

second-1-0.pcap

second-2-0.pcap

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Estos archivos tienen la misma forma, <name>-<node>-<device>.pcap. Por ejemplo, el primer


archivo en la lista es second-0-0.pcap el cual es una traza pcap del nodo cero, dispositivo cero.
Este es el dispositivo punto a punto del nodo cero. El archivo second-1-0.pcap es la traza pcap
del dispositivo cero en el nodo uno, tambien un dispositivo punto a punto; y el archivo second-20.pcap es la traza pcap para el dispositivo zero en el nodo dos.
Si hacemos referencia a la ilustracin de la topologa del comienzo de esta seccin, veremos que
el nodo cero es el nodo ms a la izquierda del enlace punto a punto y el nodo uno es el nodo que
tiene tanto un dispositivos punto a punto y un dispositivo CSMA. El nodo dos es el primer nodo
extra en la red CSMA y este dispositivo cero fue seleccionado como el dispositivo para capturar
la traza en modo promiscuo.
Ahora vamos hacer un tcpdump para ver el primer archivo que es la red punto a punto.
$ tcpdump -nn -tt -r second-0-0.pcap
Deberamos ver las siguientes lneas de traza
reading from file second-0-0.pcap, link-type PPP (PPP)
2.000000 IP 10.1.1.1.49153 > 10.1.2.4.9: UDP, length 1024
2.007607 IP 10.1.2.4.9 > 10.1.1.1.49153: UDP, length 1024
La primera lnea del dump indica que el tipo de link (conexin o enlace) es PPP (Point-to-Point).
Luego vemos que el paquete echo deja nodo cero mediante el dispositivo asociado con la
direccin IP 10.1.1.1 dirigindose por la direccin IP 10.1.2.4 (el nodo ms a la derecha de
CSMA), este paquete se mover sobre un enlace punto a punto y recibido por el dispositivo
punto a punto del nodo uno. Veamos ahora la segunda traza:
$ tcpdump -nn -tt -r second-1-0.pcap
Veremos lo siguiente:
reading from file second-1-0.pcap, link-type PPP (PPP)
2.003686 IP 10.1.1.1.49153 > 10.1.2.4.9: UDP, length 1024
2.003921 IP 10.1.2.4.9 > 10.1.1.1.49153: UDP, length 1024
Aqu vemos que el tipo de enlace es tambin PPP, como era de esperar. Vemos que el paquete
con direccin IP 10.1.1.1 (que fue enviado en el tiempo de 2.000000 segundos) es dirigido hacia
la direccin IP 10.1.2.4 aparece en esta interface. Ahora, internamente, desde este nodo, el
paquete ser reenviado (forwarded) a la interface CSMA y deberamos ver que el dispositivo final
recibe este paquete
Recordemos que seleccionamos el nodo 2 como en modo promiscuo para la red CSMA, as que
veamos el tercer archivo de traza second-2-0.pcap
$ tcpdump -nn -tt -r second-2-0.pcap

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Veremos lo siguiente
reading from file second-2-0.pcap, link-type EN10MB (Ethernet)
2.003698 ARP, Request who-has 10.1.2.4 (ff:ff:ff:ff:ff:ff) tell
10.1.2.1, length 50
2.003710 ARP, Reply 10.1.2.4 is-at 00:00:00:00:00:06, length 50
2.003803 IP 10.1.1.1.49153 > 10.1.2.4.9: UDP, length 1024
2.003815 ARP, Request who-has 10.1.2.1 (ff:ff:ff:ff:ff:ff) tell
10.1.2.4, length 50
2.003828 ARP, Reply 10.1.2.1 is-at 00:00:00:00:00:03, length 50
2.003921 IP 10.1.2.4.9 > 10.1.1.1.49153: UDP, length 1024

Como puede ver, el tipo de enlace es ahora Ethernet. Algo nuevo ha aparecido, sin embargo.
La red ethernet usa ARP (Address Resolution Protocol). El Nodo sabe que tiene que enviar el
paquete a la direccin IP 10.1.2.4, pero que no sabe la direccin MAC del nodo correspondiente.
Se emite en la red CSMA un brodcast (FF: FF: FF: FF: FF: FF) preguntando por el dispositivo
que tiene la direccin IP 10.1.2.4. En este caso, las respuestas del nodo ms a la derecha que
dice que su direccin MAC es 00:00:00:00:00:06. Este intercambio se ve en las siguientes lneas:
2.003696 arp who-has 10.1.2.4 (ff:ff:ff:ff:ff:ff) tell 10.1.2.1
2.003707 arp reply 10.1.2.4 is-at 00:00:00:00:00:06
A continuacin, el nodo uno dispositivo uno enva el paquete de eco al servidor de eco UDP con
la direccin IP destino 10.1.2.4.
2.003801 IP 10.1.1.1.49153> 10.1.2.4.9: UDP, longitud 1024
El servidor recibe la solicitud de eco y est tratando de enviarlo de vuelta a la fuente. El servidor
sabe que esta direccin est en otra red que llega a travs de la direccin IP 10.1.2.1. Esto se
debe a que hemos inicializado el enrutamiento global. Sin embargo, el nodo de servidor de eco
no conoce la direccin MAC del primer nodo CSMA, por lo que tiene que hacer una peticin ARP.
2.003811 arp who-has 10.1.2.1 (ff:ff:ff:ff:ff:ff) tell 10.1.2.4
2.003822 arp reply 10.1.2.1 is-at 00:00:00:00:00:03
El servidor enva el eco de vuelta al nodo origen.
2.003915 IP 10.1.2.4.9 > 10.1.1.1.49153: UDP, length 1024
Mirando hacia atrs en el nodo ms a la derecha del enlace punto a punto,
tcpdump -nn -tt -r second-1-0.pcap
Ahora se puede ver que el paquete de eco que viene de nuevo en el enlace punto a punto en la
ltima lnea de la traza.
reading from file second-1-0.pcap, link-type PPP (PPP)
2.003686 IP 10.1.1.1.49153 > 10.1.2.4.9: UDP, length 1024
2.003915 IP 10.1.2.4.9 > 10.1.1.1.49153: UDP, length 1024

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Por ltimo, se puede mirar hacia atrs en el nodo que origin el eco
tcpdump-nn-tt-r segundo-0-0.pcap
y ver que el paquete de eco llega de vuelta a la fuente en 2.007602 segundos
reading from file second-0-0.pcap, link-type PPP (PPP)
2.000000 IP 10.1.1.1.49153 > 10.1.2.4.9: UDP, length 1024
2.007602 IP 10.1.2.4.9 > 10.1.1.1.49153: UDP, length 1024
Por ltimo, recordamos que hemos aadido la capacidad de controlar el nmero de dispositivos
CSMA en la simulacin por el argumento de lnea de comandos. Puede cambiar este argumento
en la misma forma que cuando nos fijamos en el cambio del nmero de paquetes de eco en el
script first.cc. Intentemos ejecutar el programa con el nmero de dispositivos extra a cuatro:
./waf --run "scratch/mysecond --nCsma=4"
Donde la salida ser:
Waf: Entering directory `/home/latys/simulador-ns3/ns-allinone-3.17/ns3.17/build'
Waf: Leaving directory `/home/latys/simulador-ns3/ns-allinone-3.17/ns3.17/build'
'build' finished successfully (1.696s)
At time 2s client sent 1024 bytes to 10.1.2.5 port 9
At time 2.0038s server received 1024 bytes from 10.1.1.1 port 49153
At time 2.0038s server sent 1024 bytes to 10.1.1.1 port 49153
At time 2.00761s client received 1024 bytes from 10.1.2.5 port 9
Se observa que el servidor de eco ha vuelto a poner al ltimo nodo CSMA, que es 10.1.2.5 en
lugar del nodo por defecto, 10.1.2.4.
Es posible que usted no est satisfecho con un archivo de seguimiento generado en la red
CSMA. Es posible que realmente quiera tener una huella de un solo dispositivo y es posible que
no ests interesado en cualquier otro trfico en la red. Usted puede hacer esto con bastante
facilidad.
Veamos el script mysecond.cc y agreguemos el cdigo que nos permite hacer esto, ns-3
proporciona ayudantes con mtodos que se le pasen el nmero de nodo y el nmero de
dispositivo como parmetros. Sustituir las llamadas EnablePcap con el siguiente cdigo:
pointToPoint.EnablePcap ("second", p2pNodes.Get (0)->GetId (), 0);
csma.EnablePcap ("second", csmaNodes.Get (nCsma)->GetId (), 0, false);
csma.EnablePcap ("second", csmaNodes.Get (nCsma-1)->GetId (), 0,
false);
Sabemos que queremos crear un archivo pcap con el nombre base second y tambin sabemos
que el dispositivo de intereses en ambos casos va a ser cero, por lo que los parmetros no son
realmente interesantes.
Con el fin de obtener el nmero de nodo, tenemos dos opciones: primero, los nodos se numeran
de forma creciente a partir de cero en el orden en que los ha creado. Una forma de obtener un
nmero de nodo es calcular esta cifra a cabo de forma manual en la contemplacin de la orden
de la creacin del nodo. Si miramos la ilustracin de la topologa de red al inicio del archivo,
puede ver que el ltimo nodo CSMA va a ser el nmero de nodo nCsma + 1. Este enfoque puede

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

llegar a ser molesto difcil en simulaciones ms grandes.


Una forma alternativa, que utilizamos aqu es darse cuenta de que los NodeContainers contienen
punteros a ns-3 Nodo Objetos. El Nodo de objeto tiene un mtodo llamado getId que devolver
ID de ese nodo, que es el nmero de nodo que buscamos.
Vamos a borrar los archivos de rastreo viejos del directorio de nivel superior para evitar la
confusin acerca de lo que est pasando,
rm *.pcap
rm *.tr
Para el caso de 100 nodos extras:
./waf --run "scratch/mysecond --nCsma=100"
La salida ser la siguiente:
Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3dev/build'
'build' finished successfully (0.407s)
Sent 1024 bytes to 10.1.2.101
Received 1024 bytes from 10.1.1.1
Received 1024 bytes from 10.1.2.101
El servidor de eco se encuentra ubicado en 10.1.2.101 que corresponde a tener 100 nodos
CSMA extra con el servidor de eco en el ltimo. Si listamos los archivos pcap en el directorio de
nivel superior se ver:
second-0-0.pcap

second-100-0.pcap

second-101-0.pcap

El archivo de rastreo second-0-0.pcap es el dispositivo de punto a punto de izquierda, que es el


origen del paquete de eco. El archivo de second-101-0.pcap correspondiente al dispositivo
CSMA ms a la derecha que es donde reside el servidor de eco. Vemos que el ltimo parmetro
en la llamada pcap en el nodo del servidor de eco esta configurado en false. Esto significa que la
traza obtenida en ese nodo estaba en modo no promiscuo.
Para ilustrar la diferencia entre las traza promiscua y no promiscua, tambin pedimos una traza
no promiscuo para el penltimo nodo. Veamos el tcpdump para el archivo second-100-0.pcap.
tcpdump -nn -tt -r second-100-0.pcap
Podemos ver que el nodo 100 es realmente un espectador el intercambio de eco. Los nicos
paquetes que recibe son las peticiones ARP que se transmiten a toda la red CSMA.
reading from file second-100-0.pcap, link-type EN10MB (Ethernet)
2.003696 arp who-has 10.1.2.101 (ff:ff:ff:ff:ff:ff) tell 10.1.2.1
2.003811 arp who-has 10.1.2.1 (ff:ff:ff:ff:ff:ff) tell 10.1.2.101
Ahora veamos el tcpdump por second-101-0.pcap.
tcpdump -nn -tt -r second-101-0.pcap

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

El nodo 101 es realmente el participante en el intercambio de eco.


reading from file second-101-0.pcap, link-type EN10MB (Ethernet)
2.003696 arp who-has 10.1.2.101 (ff:ff:ff:ff:ff:ff) tell 10.1.2.1
2.003696 arp reply 10.1.2.101 is-at 00:00:00:00:00:67
2.003801 IP 10.1.1.1.49153 > 10.1.2.101.9: UDP, length 1024
2.003801 arp who-has 10.1.2.1 (ff:ff:ff:ff:ff:ff) tell 10.1.2.101
2.003822 arp reply 10.1.2.1 is-at 00:00:00:00:00:03
2.003822 IP 10.1.2.101.9 > 10.1.1.1.49153: UDP, length 1024

Construyendo una topologia de red Wireless


En esta seccin vamos a ampliar nuestro conocimiento de los dispositivos y canales de red NS-3
para cubrir un ejemplo de una red inalmbrica. NS-3 proporciona un conjunto de modelos 802,11
que tratan de proporcionar una implementacin precisa de la especificacin del nivel MAC
802.11 y un modelo no tan lento para el nivel fsico de la especificacin 802.11a.
As como hemos visto, objetos ayudantes punto a punto y CSMA en la construccin de la
topologa punto a punto de topologas, veremos ayudantes wifi equivalentes. La apariencia y el
funcionamiento de estos ayudantes deben parecer muy familiar para usted.
Veremos un script de ejemplo llamado third.cc que es una extensin del script second.cc en la
que se agrega una red wifi.
En el script se puede ver la topologa de red, donde en el lado izquierdo esta la parte
inalmbrica, es una red por defecto, en la que se puede variar el nmero de nodos creados en la
red cableada como inalmbrica. Al igual que el script second.cc, si se cambia la variable nCsma,
en la que se define el nmero de nodos CSMA extras, del mismo modo se define la variable
nWifi para controlar el nmero de STA que crean nodos (estaciones) en la simulacin. Siempre
habr un punto de acceso (AP) en la red inalmbrica. Por defecto hay tres nodos CSMA extras y
tres nodos inalmbricos STA.
El cdigo comienza por la carga de las libreras como se hizo en el script second.cc. Hay un par
de nuevas libraras que corresponde al mdulo wifi y al mdulo mobility.
#include
#include
#include
#include
#include
#include
#include
#include

"ns3/core-module.h"
"ns3/point-to-point-module.h"
"ns3/network-module.h"
"ns3/applications-module.h"
"ns3/wifi-module.h"
"ns3/mobility-module.h"
"ns3/csma-module.h"
"ns3/internet-module.h"

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

La topologa de red es la siguiente:


// Default Network Topology
//
//
Wifi 10.1.3.0
//
AP
// *
*
*
*
// |
|
|
|
10.1.1.0
// n5
n6
n7
n0 -------------- n1
n2
n3
n4
//
point-to-point |
|
|
|
//
================
//
LAN 10.1.2.0
Podemos ver que se agreg un nuevo dispositivo de red, en el nodo en el lado izquierdo del
enlace punto a punto en que se convierte en una access point de red inalmbrica. Un nmero de
nodos wireless STA son creados para la nueva red 10.1.3.0 como se muestra en el lado
izquierdo de la ilustracin
El programa principal comienza igual que el script second.cc, al que se le agregan lneas de
parmetros para habilitar o deshabilitar los componentes de loggin y cambiar el nmero de
dispositivos a crear.
bool verbose = true;
uint32_t nCsma = 3;
uint32_t nWifi = 3;
CommandLine cmd;
cmd.AddValue ("nCsma", "Number of \"extra\" CSMA nodes/devices",
nCsma);
cmd.AddValue ("nWifi", "Number of wifi STA devices", nWifi);
cmd.AddValue ("verbose", "Tell echo applications to log if true",
verbose);
cmd.Parse (argc,argv);
if (verbose)
{
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
}
Al igual que en los pasos anteriores es crear dos nodos que vamos a conectar a travs del
enlace punto a punto.
NodeContainer p2pNodes;
p2pNodes.Create (2);

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

El siguiente paso es crear una instancia de PointToPointHelper y establecer los atributos por
defectos.
PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
NetDeviceContainer p2pDevices;
p2pDevices = pointToPoint.Install (p2pNodes);
Ahora vamos a declarar otro NodeContainer, para mantener los nodos que seran parate de la red
CSMA.
NodeContainer csmaNodes;
csmaNodes.Add (p2pNodes.Get (1));
csmaNodes.Create (nCsma);
La siguiente lnea del cdigo obtiene el primer nodo del punto a punto container y lo agrega al
container de CSMA (red Ethernet). El nodo en cuestin va a terminar con un nodo punto a punto
y un dispositivo CSMA. Luego creamos el nmero extra de nodos que componen la red Etherner
CSMA e instanciamos el CsmaHelper y le configuramos los atributos.
CsmaHelper csma;
csma.SetChannelAttribute ("DataRate", StringValue ("100Mbps"));
csma.SetChannelAttribute ("Delay", TimeValue (NanoSeconds (6560)));
NetDeviceContainer csmaDevices;
csmaDevices = csma.Install (csmaNodes);
En este punto vamos a crear un nodo que ser parte de la red wifi. Creamos el nmero de
estaciones especificado por el argumento de lnea de comando nWifi y el nodo ms a la
izquierda del enlace punto a punto, ser el que cumpla la funcin del access point.
NodeContainer wifiStaNodes;
wifiStaNodes.Create (nWifi);
NodeContainer wifiApNode = p2pNodes.Get (0);
El siguiente cdigo construye el dispositivo wifi y el canal de interconexin entre los nodos wifi.
Primero configuramos la capa fsica (PHY) y el ayudante de canal.
YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

Para simplificar, este cdigo utiliza la configuracin predeterminada de la capa fsica (PHY) y
modelos de canal que estn en la documentacin de la API doxygen para la
YansWifiChannelHelper :: Default y YansWifiPhyHelper :: Default mtodos. Una vez creados
estos objetos, podemos crear un objeto de canal y asociarlo a nuestra capa PHY administrador
de objetos para asegurarse de que todos los objetos de la capa PHY creados por el
YansWifiPhyHelper comparten el mismo canal subyacente, es decir, que comparten el mismo
medio wireless.
phy.SetChannel (channel.Create ());
Una vez configurado el ayudante PHY, podemos centrarnos en la capa MAC. Aqu elegimos
trabajar con los no-Qos MACs por lo que utilizar un objeto NqosWifiMacHelper para establecer
los parmetros de MAC.
WifiHelper wifi = WifiHelper::Default ();
wifi.SetRemoteStationManager ("ns3::AarfWifiManager");
NqosWifiMacHelper mac = NqosWifiMacHelper::Default ();
El mtodo SetRemoteStationManager le dice al ayudante el tipo de algoritmo de control de
velocidad usado, para este caso se usa algoritmo AARF.
A continuacin, configuramos el tipo de MAC, el SSID de la red de infraestructuras que
queremos configurar y asegurarse de que nuestras estaciones no funcionan activa sondeo:
Ssid ssid = Ssid ("ns-3-ssid");
mac.SetType ("ns3::StaWifiMac","Ssid", SsidValue
(ssid),"ActiveProbing", BooleanValue (false));
Este cdigo crea primero un objeto 802,11 Service Set Identifier (SSID) que se utiliza para
establecer el valor de la SSID Atributo de la implementacin de la capa MAC. El tipo particular
de la capa MAC que ser creado por el asistente es especificado por atributo como siendo del
tipo ns3 :: StaWifiMac. El uso de NqosWifiMacHelper se asegurar de que el QosSupported
atributo para objetos creados MAC tiene el valor false. La combinacin de estas dos
configuraciones significa que la instancia MAC prxima creado ser un no-QoS estacin de noAP (STA) en un BSS de infraestructura (es decir, un BSS con un AP). Por ltimo, el
ActiveProbing atributo se establece en false. Esto significa que las solicitudes de sonda no se
enviarn por MACs creados por esta ayuda.
Una vez que todos los parmetros especficos de la estacin estn completamente configurados,
tanto en el MAC y las capas PHY, podemos invocar al metodo install para crear los dispositivos
wifi:
NetDeviceContainer staDevices;
staDevices = wifi.Install (phy, mac, wifiStaNodes);
Hemos configurado Wifi para todos nuestros nodos STA, y ahora tenemos que configurar el AP
(punto de acceso) nodo. Comenzamos este proceso cambiando los predeterminados Atributos
del NqosWifiMacHelper para reflejar las necesidades de la AP.
mac.SetType ("ns3::ApWifiMac","Ssid", SsidValue (ssid));

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

En este caso, la NqosWifiMacHelper va ha crear capas MAC de NS3::ApWifiMac, este ltimo


especifica que una instancia MAC es configurada como un AP para ser creado, con el tipo de
ayudante lo que implica que la QosSupported Atributo se debe establecer en false - disabling
802.11e/WMM-style soporte QoS a los puntos de acceso creado.
El cdigo siguiente crea el AP que comparte el mismo conjunto de PHY-nivel Atributos (y el
canal) como las estaciones:
NetDeviceContainer apDevices;
apDevices = wifi.Install (phy, mac, wifiApNode);
Ahora, vamos a agregar un modelo de movilidad. Queremos que los nodos STA sean mviles,
paseando por el interior de un cuadro y con el nodo AP estacionario. Utilizamos la MobilityHelper
para esto. En primer lugar, creamos una instancia de un MobilityHelper objeto y establecemos
algunos atributos que controlan la funcionalidad de posicin localizacin
MobilityHelper movilidad;
mobility.SetPositionAllocator ("NS3 :: GridPositionAllocator",
"MinX", doubleValue (0.0),
"MinY", doubleValue (0.0),
"DeltaX", doubleValue (5.0),
"DeltaY", doubleValue (10.0),
"Gridwidth", UintegerValue (3),
"LayoutType", StringValue ("RowFirst"));

Este cdigo indica al ayudante de la movilidad para utilizar una rejilla de dos dimensiones para
colocar inicialmente los nodos STA.
Hemos organizado nuestros nodos en una red inicial, pero ahora tenemos que decirles cmo
moverse. Elegimos el RandomWalk2dMobilityModel que le toca mover nodos en una direccin
aleatoria a una velocidad aleatoria por el interior de un cuadro delimitador.
mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel",
"Bounds", RectangleValue (Rectangle (-50, 50, -50, 50)));
Ahora decimos al MobilityHelper para instalar los modelos de movilidad en los nodos STA.
mobility.Install (wifiStaNodes);
Queremos que el punto de acceso AP permanezca en una posicin fija durante la simulacin.
Logramos esto mediante el establecimiento del modelo de movilidad de este nodo como el ns3 ::
ConstantPositionMobilityModel:
mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
mobility.Install (wifiApNode);
Ahora tenemos nuestros nodos, dispositivos y canales creados y modelos de movilidad elegido
para los nodos Wifi, pero no tenemos pilas de protocolos presentes. Al igual que hemos hecho
anteriormente muchas veces, vamos a utilizar el InternetStackHelper para instalar estas pilas.

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

InternetStackHelper stack;
stack.Install (csmaNodes);
stack.Install (wifiApNode);
stack.Install (wifiStaNodes);
Al igual que en el script second.cc de ejemplo, vamos a utilizar el Ipv4AddressHelper para
asignar direcciones IP a los interfaces del dispositivo. En primer lugar se utiliza la red 10.1.1.0
para crear las dos direcciones necesarias para nuestros dos dispositivos de punto-a-punto.
Luego usamos la red 10.1.2.0 para asignar direcciones a la red CSMA y luego asignamos
direcciones de la red 10.1.3.0 a ambos dispositivos STA y el AP de la red inalmbrica.
Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer p2pInterfaces;
p2pInterfaces = address.Assign (p2pDevices);
address.SetBase ("10.1.2.0", "255.255.255.0");
Ipv4InterfaceContainer csmaInterfaces;
csmaInterfaces = address.Assign (csmaDevices);
address.SetBase ("10.1.3.0", "255.255.255.0");
address.Assign (staDevices);
address.Assign (apDevices);
Configuramos el servidor de eco
UdpEchoServerHelper echoServer (9);
ApplicationContainer serverApps = echoServer.Install (csmaNodes.Get
(nCsma));
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));
Y ponemos el cliente de eco en el ltimo nodo STA que hemos creado, que apunta al servidor de
la red CSMA.
UdpEchoClientHelper echoClient (csmaInterfaces.GetAddress (nCsma), 9);
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
ApplicationContainer clientApps =
(nWifi - 1));
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));

echoClient.Install (wifiStaNodes.Get

Habilitamos el enrutamiento inter-red


Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
creado nunca para naturalmente. Esto se debe a que le preguntamos al punto de acceso
inalmbrico para generar balizas (Beacons). Se generar balizas para siempre, y esto se

39

LATyS

Documentacin Simulador NS-3

Documento N:0000000001
Revisin: 1.0

Fecha: 19/11/2013

traducir en eventos simulador est programado en el futuro de forma indefinida, por lo que debe
decir el simulador para detener a pesar de que puede tener eventos de generacin de balizas
programadas. La siguiente lnea de cdigo indica al simulador para detener lo que no simulamos
balizas siempre y entramos en lo que es esencialmente un bucle sin fin
Simulator::Stop (Seconds (10.0));
Creamos suficiente trazas para cubrir las tres redes:
pointToPoint.EnablePcapAll ("third");
phy.EnablePcap ("third", apDevices.Get (0));
csma.EnablePcap ("third", csmaDevices.Get (0), true);
Estas tres lneas de cdigo iniciar la traza pcap en los dos nodos de punto a punto que sirve
como nuestra columna vertebral, se iniciar un rastreo modo promiscuo (monitor) en la red Wifi,
y se inicie un rastreo promiscua en la red CSMA. Esto nos permitir ver todo el trfico con un
nmero mnimo de archivos de rastreo.
Por ltimo, ejecutamos la simulacin
Simulador :: Destroy ();
return 0;
}

39

You might also like