martes, 5 de marzo de 2013

Simulación NS-3

Para realizar la simulación lo que utilice es ns-3, es un simulador de redes que se basa en eventos discretos, se pueden simular protocolos unicast y multicast, se utiliza mucho en la investigación de redes móviles ad-hoc. Implementa muchos protocolos tanto de redes alámbricas como inalámbricas , la versión que yo uso la ns-3 se usa para soportar el flujo de trabajo de una simulación desde configuración hasta recolección y análisis de tramas.

La finalidad de esta entrada es diseñar y ejecutar una simulación de prueba, además incluir algunas medidas de desempeño.
Lo importante es que haya nodos, tráfico y algunas medidas de desempeño. Lo primero que yo hice es comenzar a correr los ejemplos que ya vienen, es difícil ya que todos están C++ y no hay una API completa de Python, entonces hay que investigar bastante.

Yo diseñé la siguiente red:


Lo primero que se hace es crear los nodos, yo cree los nodos de las terminales en un arreglo, luego los de los switches. Después se tenía que definir los links y marcar los nodos que de hicieron con la finalidad de ser switches como tales. Aquí la parte del código:

print "Crea nodos"
terminals = ns.network.NodeContainer()
terminals.Create(5)
csmaSwitch = ns.network.NodeContainer()
csmaSwitch.Create(1)
csmaSwitch2 = ns.network.NodeContainer()
csmaSwitch2.Create(1)
print "Construye la topologia"
csma = ns.csma.CsmaHelper()
csma.SetChannelAttribute("DataRate", ns.network.DataRateValue(ns.network.DataRate(5000000)))
csma.SetChannelAttribute("Delay", ns.core.TimeValue(ns.core.MilliSeconds(2)))
# Crea los links de cada terminal al switch
terminalDevices = ns.network.NetDeviceContainer()
switchDevices = ns.network.NetDeviceContainer()
switchDevices2 = ns.network.NetDeviceContainer()
#se unen los cuatro nodos al primer switch
for i in range(4):
link = csma.Install(ns.network.NodeContainer(ns.network.NodeContainer(terminals.Get(i)), csmaSwitch))
terminalDevices.Add(link.Get(0))
switchDevices.Add(link.Get(1))
#se une un nodo al segundo switch
link = csma.Install(ns.network.NodeContainer(ns.network.NodeContainer(terminals.Get(2)), csmaSwitch2))
terminalDevices.Add(link.Get(0))
switchDevices2.Add(link.Get(1))
link = csma.Install(ns.network.NodeContainer(ns.network.NodeContainer(terminals.Get(4)), csmaSwitch2))
terminalDevices.Add(link.Get(0))
switchDevices2.Add(link.Get(1))
#se crean los puentes para enviar los paquetes
switchNode = csmaSwitch.Get(0)
bridgeDevice = ns.bridge.BridgeNetDevice()
switchNode.AddDevice(bridgeDevice)
switchNode2 = csmaSwitch2.Get(0)
bridgeDevice2 = ns.bridge.BridgeNetDevice()
switchNode2.AddDevice(bridgeDevice2)
for portIter in range(switchDevices.GetN()):
bridgeDevice.AddBridgePort(switchDevices.Get(portIter))
for portIter in range(switchDevices2.GetN()):
bridgeDevice2.AddBridgePort(switchDevices2.Get(portIter))
view raw gistfile1.py hosted with ❤ by GitHub


Despues se asignan las direcciones IP a las terminales:

# se agrega el internet a las terminales
internet = ns.internet.InternetStackHelper()
internet.Install(terminals)
# Se agregan las direcciones iP
print "Se asignan direcciones IP"
ipv4 = ns.internet.Ipv4AddressHelper()
ipv4.SetBase(ns.network.Ipv4Address("10.1.1.0"), ns.network.Ipv4Mask("255.255.255.0"))
ipv4.Assign(terminalDevices)
view raw gistfile1.py hosted with ❤ by GitHub


Enseguida se empieza a agregar el tráfico, en esta parte del código muestro como se envían datos del nodo 0 al 1, ademas de indicar que es UDP:

print "Create Applications."
port = 9
onoff = ns.applications.OnOffHelper("ns3::UdpSocketFactory",
ns.network.Address(ns.network.InetSocketAddress(ns.network.Ipv4Address("10.1.1.2"), port)))
onoff.SetConstantRate (ns.network.DataRate ("500kb/s"))
app = onoff.Install(ns.network.NodeContainer(terminals.Get(0)))
# empieza la aplicacion
app.Start(ns.core.Seconds(1.0))
sink = ns.applications.PacketSinkHelper("ns3::UdpSocketFactory",
ns.network.Address(ns.network.InetSocketAddress(ns.network.Ipv4Address.GetAny(), port)))
app = sink.Install(ns.network.NodeContainer(terminals.Get(1)))
app.Start(ns.core.Seconds(0.0))
view raw gistfile1.py hosted with ❤ by GitHub


En donde se estableció la velocidad de transferencia en 500kb/s y se establece la dirección IP del destino en este caso 10.1.1.2 corresponde al nodo 1.

En las demás transferencias también se establecieron cada una de esas características, aquí esta el resto de los nodos en los que varié la velocidad de transferencia:

# se envian paquetes del nodo 3 al 0
onoff.SetConstantRate (ns.network.DataRate ("100kb/s"))
onoff.SetAttribute("Remote",
ns.network.AddressValue(ns.network.InetSocketAddress(ns.network.Ipv4Address("10.1.1.1"), port)))
app = onoff.Install(ns.network.NodeContainer(terminals.Get(3)))
app.Start(ns.core.Seconds(1.1))
app = sink.Install(ns.network.NodeContainer(terminals.Get(0)))
app.Start(ns.core.Seconds(2.0))
#se envian paquetes del nodo 2 al 4
onoff.SetConstantRate (ns.network.DataRate ("300kb/s"))
onoff.SetAttribute("Remote",
ns.network.AddressValue(ns.network.InetSocketAddress(ns.network.Ipv4Address("10.1.1.6"), port)))
app = onoff.Install(ns.network.NodeContainer(terminals.Get(2)))
app.Start(ns.core.Seconds(1.1))
app = sink.Install(ns.network.NodeContainer(terminals.Get(4)))
app.Start(ns.core.Seconds(0.0))
#se envian paquetes del nodo 1 al 2
onoff.SetConstantRate (ns.network.DataRate ("160kb/s"))
onoff.SetAttribute("Remote",
ns.network.AddressValue(ns.network.InetSocketAddress(ns.network.Ipv4Address("10.1.1.3"), port)))
app = onoff.Install(ns.network.NodeContainer(terminals.Get(1)))
app.Start(ns.core.Seconds(1.1))
app = sink.Install(ns.network.NodeContainer(terminals.Get(2)))
app.Start(ns.core.Seconds(0.0))
csma.EnablePcapAll("csma-bridge", False)
#se envian paquetes del nodo 3 al 2
onoff.SetConstantRate (ns.network.DataRate ("800kb/s"))
onoff.SetAttribute("Remote",
ns.network.AddressValue(ns.network.InetSocketAddress(ns.network.Ipv4Address("10.1.1.3"), port)))
app = onoff.Install(ns.network.NodeContainer(terminals.Get(3)))
app.Start(ns.core.Seconds(1.1))
app = sink.Install(ns.network.NodeContainer(terminals.Get(2)))
app.Start(ns.core.Seconds(0.0))
csma.EnablePcapAll("csma-bridge", False)
#se envian paquetes del 4 al 2
onoff.SetAttribute("Remote",
ns.network.AddressValue(ns.network.InetSocketAddress(ns.network.Ipv4Address("10.1.1.5"), port)))
app = onoff.Install(ns.network.NodeContainer(terminals.Get(4)))
app.Start(ns.core.Seconds(1.1))
app = sink.Install(ns.network.NodeContainer(terminals.Get(2)))
app.Start(ns.core.Seconds(0.0))
view raw gistfile1.py hosted with ❤ by GitHub


En el código se puede ver que hay transferencia de los nodos:

3 al 0: Pasando por el switch0, y con una velocidad de transferencia de 100kb/s
2 al 4: Pasando por el switch1, y con una velocidad de transferencia de 300kb/s.
1 al 2: Pasando por el switch0, y con una velocidad de transferencia de 160kb/s.
3 al 2: Pasando por el switch0, y con una velocidad de transferencia de 800kb/s.
4 al 2: Pasando por el switch1, y con una velocidad de transferencia de 800kb/s

Este es el resultado de correr la simulación:

Empieza la simulacion
scanning topology: 7 nodes...
scanning topology: calling graphviz layout
scanning topology: all done.
FlowID: 1 (UDP 10.1.1.1/49153 --> 10.1.1.2/9)
Tx Bytes: 2267460
Rx Bytes: 2266920
Tx Packets: 4199
Rx Packets: 4198
Lost Packets: 0
Mean{Delay}: 0.00604608194188
Mean{Jitter}: 0.000512220537527
Mean{Hop Count}: 1.0
FlowID: 2 (UDP 10.1.1.4/49154 --> 10.1.1.3/9)
Tx Bytes: 3617460
Rx Bytes: 3616920
Tx Packets: 6699
Rx Packets: 6698
Lost Packets: 0
Mean{Delay}: 0.00701732511406
Mean{Jitter}: 0.0015147514075
Mean{Hop Count}: 1.0
FlowID: 3 (UDP 10.1.1.6/49153 --> 10.1.1.5/9)
Tx Bytes: 3617460
Rx Bytes: 3616920
Tx Packets: 6699
Rx Packets: 6698
Lost Packets: 0
Mean{Delay}: 0.00782599346073
Mean{Jitter}: 0.00141445805674
Mean{Hop Count}: 1.0
FlowID: 4 (UDP 10.1.1.5/49153 --> 10.1.1.6/9)
Tx Bytes: 1356480
Rx Bytes: 1355940
Tx Packets: 2512
Rx Packets: 2511
Lost Packets: 0
Mean{Delay}: 0.00860451551254
Mean{Jitter}: 0.00213814440797
Mean{Hop Count}: 1.0
FlowID: 5 (UDP 10.1.1.2/49153 --> 10.1.1.3/9)
Tx Bytes: 723060
Rx Bytes: 723060
Tx Packets: 1339
Rx Packets: 1339
Lost Packets: 0
Mean{Delay}: 0.00675767407991
Mean{Jitter}: 0.00117281030942
Mean{Hop Count}: 1.0
FlowID: 6 (UDP 10.1.1.4/49153 --> 10.1.1.1/9)
Tx Bytes: 451980
Rx Bytes: 451980
Tx Packets: 837
Rx Packets: 837
Lost Packets: 0
Mean{Delay}: 0.00580386284229
Mean{Jitter}: 1.8284687799e-05
Mean{Hop Count}: 1.0
Finaliza
view raw gistfile1.sh hosted with ❤ by GitHub


Este resultado muestra estadísticas para cada transferencia de datos que hicieron los nodos, por ejemplo del nodo 0 al 1, la transferencia es de la IP 10.1.1.1 a la 10.1.1.2, con sus cantidades de bytes de paquetes transmitidos y recibidos, ademas de el número de paquetes, indica que se perdieron 0 paquetes.

FlowID: 1 (UDP 10.1.1.1/49153 --> 10.1.1.2/9)

  Tx Bytes:  2267460
  Rx Bytes:  2266920
  Tx Packets:  4199
  Rx Packets:  4198
  Lost Packets:  0
  Mean{Delay}:  0.00604608194188
  Mean{Jitter}:  0.000512220537527
  Mean{Hop Count}:  1.0

También se muestra por ejemplo el Jitter de .0005 que de acuerdo a lo visto en la entrada pasada, es un valor bastante bueno para la comunicación. 
Las demás transmisiones muestran las mismas estadísticas.
Las medidas se obtuvieron así:

print " Mean{Delay}: ", (st.delaySum.GetSeconds() / st.rxPackets)
print " Mean{Jitter}: ", (st.jitterSum.GetSeconds() / (st.rxPackets-1))
print " Mean{Hop Count}: ", float(st.timesForwarded) / st.rxPackets + 1
view raw gistfile1.py hosted with ❤ by GitHub


Visualización

Para este último paso lo que había que hacer ya es importar la librería de visualizer y dibujar los nodos si es que queremos que aparezcan en alguna posición determinada, si no se dibujan solos, yo si establecí las posiciones:

#para dibujar los nodos
mobility = ns.mobility.ConstantPositionMobilityModel()
mobility.SetPosition(ns.core.Vector(95, 5, 0))
terminals.Get(0).AggregateObject(mobility)
mobility = ns.mobility.ConstantPositionMobilityModel()
mobility.SetPosition(ns.core.Vector(120,35, 0))
terminals.Get(1).AggregateObject(mobility)
mobility = ns.mobility.ConstantPositionMobilityModel()
mobility.SetPosition(ns.core.Vector(60,35, 0))
terminals.Get(2).AggregateObject(mobility)
mobility = ns.mobility.ConstantPositionMobilityModel()
mobility.SetPosition(ns.core.Vector(100,65, 0))
terminals.Get(3).AggregateObject(mobility)
mobility = ns.mobility.ConstantPositionMobilityModel()
mobility.SetPosition(ns.core.Vector(10,35, 0))
terminals.Get(4).AggregateObject(mobility)
mobility1 = ns.mobility.ConstantPositionMobilityModel()
mobility1.SetPosition(ns.core.Vector(90,45, 0))
csmaSwitch.Get(0).AggregateObject(mobility1)
mobility2 = ns.mobility.ConstantPositionMobilityModel()
mobility2.SetPosition(ns.core.Vector(40,40, 0))
csmaSwitch2.Get(0).AggregateObject(mobility2)
view raw gistfile1.py hosted with ❤ by GitHub


Resultados

Funcionando todos juntos



Nodo 5 (SWITCH)



Nodo 6 (SWITCH)



Código completo

Referencias

Ejemplo NS-3 Python
Instalación python

16 comentarios:

  1. Muy bien. No batallarás nada con las tareas que siguen. 7 pts.

    Quickmail comió mi comentario otra vez :/

    ResponderEliminar
  2. hola... Felicitaciones por tu trabajo...por favor, tengo que iniciar un proyecto de simulación en ns3 del protocolo de red de sensores leach, pero no tengo ni idea de como empezar... no tengo mucha experiencia en linux, me podría ayudar en "como empezar", en que programa escribo el código? Gracias...

    ResponderEliminar
    Respuestas
    1. Hola, disculpa como te va con el tema de implementar un nuevo protocolo en NS3?

      Eliminar
  3. Hola Benjamin, escribelo en Emacs, instala el ns3 y si tienes dudas puedes decirme

    ResponderEliminar
    Respuestas
    1. Hola Cecilia, estoy intentando realizar una simulacion en ns3 pero estoy bastante perdido, podrias darme una mano enviandome ejemplos o recomendandome bibliografia en castellano? desde ya muchas gracias espero tu respuesta

      Eliminar
  4. Como hago correr un ejemplo de ns-3?

    ResponderEliminar
  5. Como hago correr un ejemplo de ns-3?

    ResponderEliminar
  6. Hola cecilia, habra otra forma de comunicarnos. tengo un proyecto en ns3. me interesaria contar con tu trabajo. espero tu respuesta.

    ResponderEliminar
    Respuestas
    1. Hola Fercho, claro. Que es lo que ocupas en concreto para tu proyecto?

      Eliminar
  7. Srta. Cecilia buenos dias, estudie Ing. Electronica actualmente estoy cursando una maestria en telecomunicaciones y nos han dejado un trabajo de investigacion sobre 5G, mi inquietud era saber si existe un simulador de red para 5G, avriguando en la red encontre que con NS-3 se podia simular o modelar la capa fisica, agradeceria si me podria enviar el manual de instalacion del NS-3 y algun ejemplo sencilllo de como funciona este simulador, estuve revisando su trabajo esta muy bueno.

    ResponderEliminar
  8. Srta. Cecilia buenos dias, estudie Ing. Electronica actualmente estoy cursando una maestria en telecomunicaciones y nos han dejado un trabajo de investigacion sobre 5G, mi inquietud era saber si existe un simulador de red para 5G, avriguando en la red encontre que con NS-3 se podia simular o modelar la capa fisica, agradeceria si me podria enviar el manual de instalacion del NS-3 y algun ejemplo sencilllo de como funciona este simulador, estuve revisando su trabajo esta muy bueno.

    ResponderEliminar
  9. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  10. Buenas tardes Cecilia
    estoy realizando un trabajo de red Wifi con 3 o mas nodos que sean aleatorios con NS3, pero la cuestión es que soy nuevo con el programa de ns3. si me podrias ayudar con algunos ejemplos te lo agradeceria..

    ResponderEliminar
  11. Hola cecilia, tengo un proyecto en ns3, podria tener tu asesoria, es de gran interes para mi. Este es mi correo de contacto sergioaaza@gmail.com

    ResponderEliminar
  12. Buen día, disculpe pero quisiera saber si existe alguno otro medio por el cual nos podamos comunicar de forma un poco más personal, debido a que con mis compañeros de grado tenemos un proyecto sobre NS3 y estamos interesados en contar con su trabajo y de ser posible un poco de asesoramiento… Quedo atenta a una respuesta y de antemano muchas gracias.

    ResponderEliminar