1 24 de outubro de 2012 1 Prof. DSc. do Curso de Ciência da Computação da UESPI
Sumário Introdução 1 Introdução Características Instalação Como instalar o NS3 2 3 Arquivo de saída Filtrar resultados
Características Instalação Como instalar o NS3 Sobre o O que é o NS3 NS3 a é um simulador para sistemas de Internet baseado em eventos discretos (definido por unidade de tempo) Desenvolvido para fins de pesquisa e educational Software livre e de código aberto (C++ e/ou Python) a www.nsnam.org Comunidade Permite que desenvolvedores da comunidade de redes contribuam em seu código a Lista de usuários do NS3 b a www.nsnam.org/developers/overview/ b groups.google.com/group/ns-3-users
Sobre o NS3 (Cont.) Introdução Características Instalação Como instalar o NS3 NS3 a vs NS2 b a www.nsnam.org/docs/release/3.15/tutorial-pt-br/ns-3-tutorial.pdf b nsnam.isi.edu/nsnam/index.php/main_page O NS3 não é uma extensão do NS2 Não suporta as APIs do NS2 Algumas funcionalidades do NS2 foram portadas para o NS3 É um simulador novo
Pré-requisitos Introdução Características Instalação Como instalar o NS3 Aplicativos e bibliotecas Para que o NS3 funcione juntamente com geração de documentação, plotagem de gráficos e outras funcionalidades, é necessário a instalação de alguns pacotes Pacotes recomendados para os usuários do Ubuntu a a www.nsnam.org/wiki/index.php/installation C++ e Python: >sudo apt-get install gcc g++ python python-dev Mercurial: >sudo apt-get install mercurial Árvore de desenvolvedores ns-3: >sudo apt-get install bzr Debugging: >sudo apt-get install gdb valgrind
Pré-requisitos (Cont.) Introdução Características Instalação Como instalar o NS3 Pacotes recomendados (Cont.) Modelos de erro para WiFi: >sudo apt-get install gsl-bin libgsl0-dev libgsl0ldbl Analisador léxico e parser: >sudo apt-get install flex bison libfl-dev Traces pcap: >sudo apt-get install tcpdump Database para estatística: >sudo apt-get install sqlite sqlite3 libsqlite3-dev Xml: >sudo apt-get install libxml2 libxml2-dev GTK: >sudo apt-get install libgtk2.0-0 libgtk2.0-dev Máquinas virtuais: >sudo apt-get install vtun lxc Utilitários: >sudo apt-get install uncrustify
Pré-requisitos (Cont.) Introdução Características Instalação Como instalar o NS3 Pacotes recomendados (Cont.) Documentação: >sudo apt-get install doxygen graphviz imagemagick texlive texlive-extra-utils texlive-latex-extra python-sphinx dia Visualizador: >sudo apt-get install python-pygraphviz python-kiwi python-pygoocanvas libgoocanvas-dev Openflow: >sudo apt-get install libboost-signals-dev libboost-filesystem-dev Emulador: >sudo apt-get install openmpi*
Características Instalação Como instalar o NS3 Passo a passo Recomendação de download O procedimento recomendado é baixar o NS3 através do Mercurial, pois a ferramenta copia o código do simulador no repositório Comandos >cd; mkdir repos; cd repos >hg clone http://code.nsnam.org/ns-3-allinone >./download.py -n ns-3-dev >ls -la Tempo de espera O tempo de download vai variar de acordo com a conexão da Internet, mas pode levar alguns minutos ou horas
Características Instalação Como instalar o NS3 Passo a passo Compilação Para gerar o executável do NS3 é necessário que os códigos fontes baixados sejam compilados Comandos >cd ns-3-allinone >./build.py enable-examples enable-tests >cd ns-3-dev; ls -la Teste Para verificar o funcionamento, use os seguintes comandos: >./test.py -c core >./waf run hello-simulator
Aprendendo com exemplos Onde encontrar? Todos os arquivos do tutorial estão localizados no diretório examples/tutorial Testando um exemplo Comandos para testar o cenário a ser simulado: >cp examples/tutorial/first.cc scratch/myfirst.cc >./waf >./waf run scratch/myfirst Logs gerados pela simulação Verifique o tipo de log que é gerado na simulação. Isto pode ser definido dentro do script de simulação ou através de parâmetros.
Logs da simulação Introdução O que são logs? São as mensagens do simulador e estão distribuídas em 7 níveis Níveis das mensagens NS_LOG_ERROR: erro NS_LOG_WARN: alertas NS_LOG_DEBUG: depuração NS_LOG_INFO: informativo NS_LOG_FUNCTION: descreve a função chamada NS_LOG_LOGIC: fluxo lógico dentro de uma função NS_LOG_ALL: tudo
Dissecando o código Introdução // Adicionar bibliotecas básicas contendo o núcleo do simulador, // os nós e enlaces. #include ns3/core-module.h #include ns3/simulator-module.h #include ns3/node-module.h #include ns3/helper-module.h using namespace ns3; // Definição do log NS_LOG_COMPONENT_DEFINE ( FirstScriptExample ); // Função principal do código int main (int argc, char *argv[])
{ // Tipo de log definido para a aplicação LogComponentEnable( UdpEchoClientApplication, LOG_LEVEL_INFO); LogComponentEnable( UdpEchoServerApplication, LOG_LEVEL_INFO); // Define e cria dois nós NodeContainer nodes; nodes.create (2); // Cria o enlace ponto a ponto entre dois nós PointToPointHelper pointtopoint;
// Configura a taxa da conexão do enlace pointtopoint.setdeviceattribute ( DataRate, StringValue ( 5Mbps )); // Configura o atraso do enlace pointtopoint.setchannelattribute ( Delay, StringValue ( 2ms )); // Configura o dispositivo de rede NetDeviceContainer devices; // Cria os dispositivos e associa-os ao enlace devices = pointtopoint.install (nodes);
// Configurar a pilha de protocolo IP nos nós InternetStackHelper stack; stack.install (nodes); // Configura o endereço IP da rede e sua máscara de subrede Ipv4AddressHelper address; address.setbase ( 10.1.1.0, 255.255.255.0 ); // Atribui os endereços IP as interfaces de rede Ipv4InterfaceContainer interfaces = address.assign (devices); // Cria o servidor da aplicação de Echo na porta 9 UdpEchoServerHelper echoserver (9);
// Configura o segundo nó como servidor da aplicação de Echo ApplicationContainer serverapps = echoserver.install (nodes.get (1)); // Define o tempo de início e final da aplicação no servidor serverapps.start (Seconds (1.0)); serverapps.stop (Seconds (10.0)); // Configura o endereço IP do servidor e a porta // no cliente da aplicação de Echo Ipv4Address serveraddress = interfaces.getaddress (1); UdpEchoClientHelper echoclient (serveraddress, 9);
// Configura o número máximo de pacotes enviados pelo cliente echoclient.setattribute ( MaxPackets, UintegerValue (1)); // Intervalo de tempo entre pacotes no cliente echoclient.setattribute ( Interval, TimeValue (Seconds (1.))); // Tamanho máximo do pacote no cliente echoclient.setattribute ( PacketSize, UintegerValue (1024)); // Configura o cliente da aplicação no primeiro nó ApplicationContainer clientapps = echoclient.install (nodes.get (0));
// Define o tempo de início e final da aplicação no cliente clientapps.start (Seconds (2.0)); clientapps.stop (Seconds (10.0)); // Carrega a simulação após todas as definições Simulator::Run (); // Encerra a simulação no final Simulator::Destroy (); return 0; }
Dissecando o código Introdução // Adicionar bibliotecas básicas contendo o núcleo do simulador, // os nós, enlaces multiponto (csma/ethernet) e roteamento. #include ns3/core-module.h #include ns3/network-module.h #include ns3/csma-module.h #include ns3/internet-module.h #include ns3/point-to-point-module.h #include ns3/applications-module.h #include ns3/ipv4-global-routing-helper.h
// Descrição da topologia multiponto // Default Network Topology // // 10.1.1.0 // n0 n1 n2 n3 n4 // point-to-point // // LAN 10.1.2.0 using namespace ns3; // Definição do log NS_LOG_COMPONENT_DEFINE ( SecondScriptExample );
// Função principal do código int main (int argc, char *argv[]) { // Variáveis criadas para enviar parâmetros por linha de comando // Variável para habilitar ou desabilitar o log bool verbose = true; // Variável para atribuir a quantidade mínima de nós (multiponto) uint32_t ncsma = 3; // Variável para receber os parâmetros da linha de comando CommandLine cmd;
// Atribui os valores das variáveis digitadas na linha de comando 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); // Verificar se o log será habilitado if (verbose) { LogComponentEnable( UdpEchoClientApplication, LOG_LEVEL_INFO); LogComponentEnable( UdpEchoServerApplication, LOG_LEVEL_INFO); }
// Caso não seja enviado o número de nós, garante o número // mínimo ncsma = ncsma == 0? 1 : ncsma; // Define e cria dois nós para o enlace ponto a ponto NodeContainer p2pnodes; p2pnodes.create (2); // Define e cria a quantidade mínima de nós para o enlace // multiponto e configura o primeiro nó para conectar na // rede ponto a ponto NodeContainer csmanodes; csmanodes.add (p2pnodes.get (1)); csmanodes.create (ncsma);
// Cria o enlace ponto a ponto entre dois nós PointToPointHelper pointtopoint; // Configura a taxa da conexão do enlace ponto a ponto pointtopoint.setdeviceattribute ( DataRate, StringValue ( 5Mbps )); // Configura o atraso do enlace ponto a ponto pointtopoint.setchannelattribute ( Delay, StringValue ( 2ms )); // Configura o dispositivo de rede no enlace ponto a ponto NetDeviceContainer p2pdevices; // Cria os dispositivos e associa-os ao enlace ponto a ponto p2pdevices = pointtopoint.install (p2pnodes);
// Cria o enlace multiponto CsmaHelper csma; // Configura a taxa da conexão do enlace multiponto csma.setchannelattribute ( DataRate, StringValue ( 100Mbps )); // Configura o atraso do enlace multiponto csma.setchannelattribute ( Delay, TimeValue (NanoSeconds (6560))); // Configura o dispositivo de rede no enlace multiponto NetDeviceContainer csmadevices; // Cria os dispositivos e associa-os ao enlace multiponto csmadevices = csma.install (csmanodes);
// Configurar a pilha de protocolo IP nos nós InternetStackHelper stack; // Somente o primeiro nó ponto a ponto é configurado aqui // pois o segundo nó já pertence ao enlace multiponto stack.install (p2pnodes.get (0)); stack.install (csmanodes); // Configura o endereço IP da rede e sua máscara de subrede // para os dispositivos do enlace ponto a ponto Ipv4AddressHelper address; address.setbase ( 10.1.1.0, 255.255.255.0 );
// Atribui os endereços IP as interfaces de rede // no enlace ponto a ponto Ipv4InterfaceContainer p2pinterfaces = address.assign (p2pdevices); // Configura o endereço IP da rede e sua máscara de subrede // para os dispositivos do enlace multiponto address.setbase ( 10.1.2.0, 255.255.255.0 ); // Atribui os endereços IP as interfaces de rede // no enlace multiponto Ipv4InterfaceContainer csmainterfaces = address.assign (csmadevices);
// Cria o servidor da aplicação de Echo na porta 9 UdpEchoServerHelper echoserver (9); // Configura o último nó do enlace multiponto como // servidor da aplicação de Echo ApplicationContainer serverapps = echoserver.install (csmanodes.get (ncsma)); // Define o tempo de início e final da aplicação no servidor serverapps.start (Seconds (1.0)); serverapps.stop (Seconds (10.0));
// Configura a porta no cliente da aplicação de Echo no // último nó do enlace multiponoto UdpEchoClientHelper echoclient (csmainterfaces.getaddress (ncsma), 9); // Configura o número máximo de pacotes enviados pelo cliente echoclient.setattribute ( MaxPackets, UintegerValue (1)); // Intervalo de tempo entre pacotes no cliente echoclient.setattribute ( Interval, TimeValue (Seconds (1.))); // Tamanho máximo do pacote no cliente echoclient.setattribute ( PacketSize, UintegerValue (1024));
// Configura o cliente da aplicação no primeiro nó // do enlace ponto a ponto ApplicationContainer clientapps = echoclient.install (p2pnodes.get (0)); // Define o tempo de início e final da aplicação no cliente clientapps.start (Seconds (2.0)); clientapps.stop (Seconds (10.0)); // Configura o roteamento global na rede, // cada nó funciona como se fosse um roteador OSPF Ipv4GlobalRoutingHelper::PopulateRoutingTables (); // Habilita o PCAP/Sniffer no enlace ponto a ponto pointtopoint.enablepcapall ( second );
// Habilita o PCAP/Sniffer no enlace multiponto // apenas no primeiro nó de uma rede compartilhada. // True para configurar a interface em modo promíscuo. // Use > tcpdump -nn -tt -r <nome>-<nó>-<dispositivo>.pcap // para rastrear os arquivos PCAP csma.enablepcap ( second, csmadevices.get (1), true); // Carrega a simulação após todas as definições Simulator::Run (); // Encerra a simulação no final Simulator::Destroy (); return 0; }
Dissecando o código Introdução // Adicionar bibliotecas básicas contendo o núcleo do simulador, // os nós, enlaces multiponto (csma/ethernet) e roteamento. #include ns3/core-module.h #include ns3/point-to-point-module.h #include ns3/network-module.h #include ns3/applications-module.h #include ns3/wifi-module.h #include ns3/mobility-module.h #include ns3/csma-module.h #include ns3/internet-module.h
// Descrição da topologia multiponto // 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 using namespace ns3;
// Definição do log NS_LOG_COMPONENT_DEFINE ( ThirdScriptExample ); // Função principal do código int main (int argc, char *argv[]) { // Variáveis criadas para enviar parâmetros por linha de comando // Variável para habilitar ou desabilitar o log bool verbose = true; // Variável para atribuir a quantidade mínima de nós (multiponto) uint32_t ncsma = 3; // Variável para atribuir a quantidade mínima de nós (sem fio) uint32_t nwifi = 3;
// Variável para receber os parâmetros da linha de comando CommandLine cmd; // Atribui os valores das variáveis digitadas na linha de comando 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); // Verificar se o log será habilitado if (verbose) {
LogComponentEnable( UdpEchoClientApplication, LOG_LEVEL_INFO); LogComponentEnable( UdpEchoServerApplication, LOG_LEVEL_INFO); } // Caso não seja enviado o número de nós, garante o número // mínimo ncsma = ncsma == 0? 1 : ncsma; // Define e cria dois nós para o enlace ponto a ponto NodeContainer p2pnodes; p2pnodes.create (2);
// Define e cria a quantidade mínima de nós para o enlace // multiponto e configura o primeiro nó para conectar na // rede ponto a ponto NodeContainer csmanodes; csmanodes.add (p2pnodes.get (1)); csmanodes.create (ncsma); // Cria o enlace ponto a ponto entre dois nós PointToPointHelper pointtopoint; // Configura a taxa da conexão do enlace ponto a ponto pointtopoint.setdeviceattribute ( DataRate, StringValue ( 5Mbps ));
// Configura o atraso do enlace ponto a ponto pointtopoint.setchannelattribute ( Delay, StringValue ( 2ms )); // Configura o dispositivo de rede no enlace ponto a ponto NetDeviceContainer p2pdevices; // Cria os dispositivos e associa-os ao enlace ponto a ponto p2pdevices = pointtopoint.install (p2pnodes); // Cria o enlace multiponto CsmaHelper csma; // Configura a taxa da conexão do enlace multiponto csma.setchannelattribute ( DataRate, StringValue ( 100Mbps ));
// Configura o atraso do enlace multiponto csma.setchannelattribute ( Delay, TimeValue (NanoSeconds (6560))); // Configura o dispositivo de rede no enlace multiponto NetDeviceContainer csmadevices; // Cria os dispositivos e associa-os ao enlace multiponto csmadevices = csma.install (csmanodes); // Define e cria a quantidade mínima de nós para o enlace // sem fio e configura o primeiro nó para ser o AP NodeContainer wifistanodes; wifistanodes.create (nwifi); NodeContainer wifiapnode = p2pnodes.get (0);
// Cria o canal e associa-o a camada física // da rede sem fio YansWifiChannelHelper channel = YansWifiChannelHelper:: Default (); YansWifiPhyHelper phy = YansWifiPhyHelper::Default (); phy.setchannel (channel.create ()); // Define a camada de enlace da rede sem fio // básica, sem QoS e usando AARF para controlar // a taxa do canal de dados WifiHelper wifi = WifiHelper::Default (); wifi.setremotestationmanager ( ns3::aarfwifimanager ); NqosWifiMacHelper mac = NqosWifiMacHelper::Default ();
// Configura o SSID da rede sem fio, com o tipo do MAC // e desabilita a sondagem nas STA (estações) Ssid ssid = Ssid ( ns-3-ssid ); mac.settype ( ns3::stawifimac, Ssid, SsidValue (ssid), ActiveProbing, BooleanValue (false)); // Configura o dispositivo de rede no enlace sem fio NetDeviceContainer stadevices; // Cria os dispositivos e associa-os ao enlace sem fio stadevices = wifi.install (phy, mac, wifistanodes);
// Configura o SSID da rede sem fio, como o tipo do MAC // no AP (ponto de acesso) mac.settype ( ns3::apwifimac, Ssid, SsidValue (ssid))); // Configura o dispositivo de rede no enlace sem fio NetDeviceContainer apdevices; // Cria o dispositivo e associa-o ao enlace sem fio apdevices = wifi.install (phy, mac, wifiapnode); // Configura o modelo de mobilidade para as estações, // definindo as dimenssões e o layout da grade MobilityHelper mobility; 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 )); // Define e instala o modelo de mobilidade aleatória, tanto // para direção quanto para velocidade nas estações mobility.setmobilitymodel ( ns3::randomwalk2dmobilitymodel, Bounds, RectangleValue (Rectangle (-50, 50, -50, 50))); mobility.install (wifistanodes);
// Define a posição constante (sem mobilidade) para o AP mobility.setmobilitymodel ( ns3::constantpositionmobilitymodel ); mobility.install (wifiapnode); // Configurar e instala a pilha de protocolo IP nos nós InternetStackHelper stack; stack.install (csmanodes); stack.install (wifiapnode); stack.install (wifistanodes); // Configura o endereço IP da rede e sua máscara de subrede // para os dispositivos dos enlaces ponto a ponto, // multiponto e sem fio Ipv4AddressHelper address;
address.setbase ( 10.1.1.0, 255.255.255.0 ); Ipv4InterfaceContainer p2pinterfaces = address.assign (p2pdevices); address.setbase ( 10.1.2.0, 255.255.255.0 ); Ipv4InterfaceContainer csmainterfaces = address.assign (csmadevices); address.setbase ( 10.1.3.0, 255.255.255.0 ); address.assign (stadevices); address.assign (apdevices);
// Cria o servidor da aplicação de Echo na porta 9 UdpEchoServerHelper echoserver (9); // Configura o último nó do enlace multiponto como // servidor da aplicação de Echo ApplicationContainer serverapps = echoserver.install (csmanodes.get (ncsma)); // Define o tempo de início e final da aplicação no servidor serverapps.start (Seconds (1.0)); serverapps.stop (Seconds (10.0));
// Configura a porta no cliente da aplicação de Echo no // último nó do enlace multiponoto UdpEchoClientHelper echoclient (csmainterfaces.getaddress (ncsma), 9); // Configura o número máximo de pacotes enviados pelo cliente echoclient.setattribute ( MaxPackets, UintegerValue (1)); // Intervalo de tempo entre pacotes no cliente echoclient.setattribute ( Interval, TimeValue (Seconds (1.))); // Tamanho máximo do pacote no cliente echoclient.setattribute ( PacketSize, UintegerValue (1024));
// Configura o cliente da aplicação no penultimo nó // do enlace sem fio apontando para o servidor no // enlace multiponto ApplicationContainer clientapps = echoclient.install (wifistanodes.get (nwifi - 1)); // Define o tempo de início e final da aplicação no cliente clientapps.start (Seconds (2.0)); clientapps.stop (Seconds (10.0)); // Configura o roteamento global na rede, // cada nó funciona como se fosse um roteador OSPF Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
// Evita que o AP crie pacotes sinalizadores // (beacons) indeterminadamente no simulador Simulator::Stop (Seconds (10.0)); // Habilita o PCAP/Sniffer no enlace ponto a ponto pointtopoint.enablepcapall ( third ); // Habilita o PCAP/Sniffer no enlace multiponto // apenas no primeiro nó de uma rede compartilhada. // True para configurar a interface em modo promíscuo. // Use > tcpdump -nn -tt -r <nome>-<nó>-<dispositivo>.pcap // para rastrear os arquivos PCAP csma.enablepcap ( second, csmadevices.get (0), true); // Habilita o PCAP/Sniffer no enlace sem fio phy.enablepcap ( third, apdevices.get (0));
// Carrega a simulação após todas as definições Simulator::Run (); // Encerra a simulação no final Simulator::Destroy (); return 0; }
Arquivo de saída Filtrar resultados Preparar o arquivo Como fazer? Existem várias ferramentas para tratar o arquivo de saída, entre elas estão as linguagens de script, as quais permitem filtrar, calcular e armazenar os resultados de acordo com as necessidades do usuário. Exemplos de ferramentas Shell Script Perl Python AWK GnuPlot O GnuPlot permite executar códigos AWK dentro de seus scripts.
Código exemplo com AWK Arquivo de saída Filtrar resultados BEGIN{ iip=0; iarp_rep=0; iarp_req=0; } { if ($2== IP ) { tempoip[iip]=$1; pacotesip[iip]=pacotesip[iip-1]+$8; iip++; };
Código exemplo com AWK Arquivo de saída Filtrar resultados if ($2== ARP, && $3== Request ) { tempoarp_req[iarp_req]=$1; pacotesarp_req[iarp_req]= pacotesarp_req[iarp_req-1]+$10; iarp_req++; }; if ($2== ARP, && $3== Reply ) { tempoarp_rep[iarp_rep]=$1; pacotesarp_rep[iarp_rep]= pacotesarp_rep[iarp_rep-1]+$8; iarp_rep++; }; }
Código exemplo com AWK Arquivo de saída Filtrar resultados END{ ip=0; arp_rep=0; arp_req=0; while (ip<iip) {print Bytes IP enviados pacotesip[ip] em tempoip[ip] segundos ; ip+=1;}; while (arp_rep<iarp_rep) {print Bytes ARP_REP enviados pacotesarp_rep[arp_rep] em tempoarp_rep[arp_rep] segundos ; arp_rep+=1;}; while (arp_req<iarp_req) {print Bytes ARP_REQ enviados pacotesarp_req[arp_req] em tempoarp_req[arp_req] segundos ; arp_req+=1;}; }
Executando o exemplo com AWK Arquivo de saída Filtrar resultados > tcpdump -nn -tt -r second-2-0.pcap awk -f exemplo1_awk.awk Saída (padrão/tela) do comando acima: Bytes IP enviados 1024 em 2.003803 segundos Bytes IP enviados 2048 em 2.003921 segundos Bytes ARP_REP enviados 50 em 2.003710 segundos Bytes ARP_REP enviados 100 em 2.003828 segundos Bytes ARP_REQ enviados 50 em 2.003698 segundos Bytes ARP_REQ enviados 100 em 2.003815 segundos
Executando o exemplo com AWK Arquivo de saída Filtrar resultados Comando para redirecionar a saída no arquivo de plotagem: > tcpdump -nn -tt -r second-2-0.pcap awk -f "exemplo1_awk.awk» plotagem.dat Não vai funcionar no Gnuplot, pois falta eliminar as strings/textos.