Documentación NS3
Documentación NS3
Documentación NS3
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
Revisin
Fecha
Responsable
Descripcin
39
LATyS
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
39
LATyS
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
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
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.
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
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
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
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
3)
39
LATyS
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
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.
39
LATyS
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
39
LATyS
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),
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
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
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
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
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
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);
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
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
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
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
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
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
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
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
39
LATyS
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
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
...
39
LATyS
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
39
LATyS
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
39
LATyS
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
39
LATyS
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)
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
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
39
LATyS
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
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
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
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
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
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
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
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
39
LATyS
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
39
LATyS
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
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
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
second-100-0.pcap
second-101-0.pcap
39
LATyS
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
"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
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
39
LATyS
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
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
Documento N:0000000001
Revisin: 1.0
Fecha: 19/11/2013
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
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
39
LATyS
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