390 likes | 538 Views
Estrutura Interna - Classes. Kalina Ramos Porto 08/08/2003. Roteiro. Nodos Endereçamento Formato de Pacotes Filas e escalonamento de pacotes Agentes Aplicações e Geradores de Tráfego. n0. n1. Port Classifier. Multicast Node. dmux_. Addr Classifier. classifier_. Node entry.
E N D
Estrutura Interna - Classes Kalina Ramos Porto 08/08/2003
Roteiro • Nodos • Endereçamento • Formato de Pacotes • Filas e escalonamento de pacotes • Agentes • Aplicações e Geradores de Tráfego
n0 n1 Port Classifier Multicast Node dmux_ Addr Classifier classifier_ Node entry Node entry dmux_ entry_ entry_ Multicast Classifier classifier_ multiclassifier_ Nodo Unicast Node set ns_ [new Simulator –multicast on] set n1 [ns_ node] set n0 [ns_ node]
Classificadores • Classificadores são responsáveis por encaminhar pacotes para outros objetos de simulação de acordo com um critério lógico. • Cada classificador contém uma tabela de objetos de simulação indexados por números de slot. • Os classificadores determinam o número de slot (de acordo com um critério lógico) associado com o pacote recebido e o encaminham para o objeto indexado pelo número de slot específico.
Endereçamento • Dois estilos básicos de endereçamento disponíveis: flat e hierárquico • Endereço flat padrão: 32 bits para o id do nodoe 32 bits para o idda porta • Endereço hierárquico padrão: • 3 níveis de hierarquia • 10 11 11 ou 1 9 11 11 se multicast é especificado • 32 bits para o id da porta
Endereçamento (Cont.) • O seguinte comando é utilizado para especificar endereçamento hierárquico: • O comando anterior permite configurar diferentes números de níveis hierárquicos com seus respectivos números de bits: • Exemplo: $ns set-address-format hierarchical $ns set-address-format hierarchical <# níveis hierárquicos> <# bits para nível 1> ... <# bits para o nível n> $ns set-address-format hierarchical 2 8 15
Nodo Hierárquico n2 Address classifier To Port demux Node entry Level 3 Level 2 Level 1
Utilizando Endereçamento Hierárquico • Habilita-se o modo hierárquico: • Definem-se o número de domínios, o número de clusters em cada domínio e o número de nodos em cada cluster: • Criam-se os nodos com os endereços hierárquicos: $ns set-address-format hierarchical AddrParams set domain_num_ 2 lappend cluster_num 2 2 AddrParams set cluster_num_ $cluster_num lappend eilastlevel 2 3 2 3 AddrParams set nodes_num_ $eilastlevel $ns node 0.0.1
Formato De Pacotes • Objetos da classe Packet são a unidade fundamental de troca entre objetos na simulação. • A classe Packet: • Provê informações para ligar um pacote a uma lista (PacketQueue, por exemplo); • Faz referência a uma área de armazenamento contendo os cabeçalhos do pacote (por protocolo); • Faz referência a uma área de armazenamento contendo dados do pacote.
ts_ cmn header ptype_ ip header uid_ tcp header size_ rtp header iface_ trace header ... Formato De Pacotes (Cont.) header data
Cabeçalhos • A estrutura hdr_cmn é o cabeçalho “comum” a todos os pacotes. • Principais campos: • ts_ -> instante em que o pacote foi criado. • ptype_ -> identifica o tipo do pacote. • uid_ -> identificador único de cada pacote. • size_ -> tamanho simulado do pacote em bytes. • iface_ -> identifica em qual link o pacote foi recebido.
Cabeçalhos (Cont.) • É comum que cada protocolo implemente o seu próprio cabeçalho. • Exemplo: Arquivo .h struct hdr_rtp { u_int32_t srcid_; int seqno_; u_int32_t& srcid() { return (srcid_); } int& seqno() { return (seqno_); } /* Packet header access functions */ static int offset_; inline static int& offset() { return offset_; } inline static hdr_rtp* access(const Packet* p) { return (hdr_rtp*) p->access(offset_);} }
Cabeçalhos (Cont.) Arquivo .cc • A estrutura hdr_rtp define o layout do cabeçalho. Usada pelo compilador apenas para definir o tamanho em bytes do cabeçalho (offset). • A variável offset_ é usada para encontrar a posição do cabeçalho rtp na área de memória em que o pacote é armazenado. static class RTPHeaderClass : public PacketHeaderClass { public: RTPHeaderClass() : PacketHeaderClass("PacketHeader/RTP", sizeof(hdr_rtp)) { bind_offset(&hdr_rtp::offset_); } } class_rtphdr;
Como Criar Um Novo Cabeçalho • Criar a estrutura do cabeçalho • Permitir tracing do novo cabeçalho (packet.h) enum packet_t { PT_TCP, …, PT_MESSAGE, PT_NTYPE // This MUST be the LAST one }; class p_info { …… name_[PT_MESSAGE] = “message”; name_[PT_NTYPE]= "undefined"; …… };
Como Criar Um Novo Cabeçalho (Cont.) • Criar classe estática para OTcl linkage • Registrar o novo cabeçalho em OTcl (tcl/lib/ns-packet.tcl) • Estes passos não se aplicam quando adicionamos um novo campo a um cabeçalho existente! foreach prot { { Common off_cmn_ } … { Message off_msg_ } } add-packet-header $prot
PacketHeader/Common next_ hdrlen_ bits_ PacketHeader/IP PacketHeader/TCP Como Funciona O Cabeçalho Packet size determined at compile time hdr_cmn size determined at compile time size determined at simulator startup time (PacketHeaderManager) hdr_ip size determined at compile time hdr_tcp ……
Node entry head_ enqT_ queue_ deqT_ link_ ttl_ drophead_ drpT_ tracing simplex link Gerenciamento De Filas • Filas são locais de armazenamento onde pacotes são contidos (ou descartados). • No ns, filas fazem parte dos enlaces entre nodos. Uso:ns_ duplex-link $n0 $n1 5Mb 2ms DropTail
Implementados pelas classes herdeiras. Gerenciamento De Filas (Cont.) • A classe Queue implementa as funcionalidades básicas de uma fila. • Principais métodos: • void enque(Packet*) • Packet* deque() • void block() • void unblock() • Os métodos block() e unblock() são utilizados para bloquear e desbloquear a fila. Este mecanismo é utilizado para simular atraso de transmissão.
Gerenciamento De Filas (Cont.) • O ns disponibiliza diferentes tipos de fila: • DropTail; • Fair Queueing (FQ), Stochastic Fair Queueing (SFQ) e Deficit Round Robin (DRR); • Gerenciamento de buffer RED; • Class-Based Queueing (CBQ) e CBQ/WRR (Weighted Round-Robin).
Gerenciamento De Filas (Cont.) • Objetos QueueMonitor são usados para monitorar um conjunto de informações como chegada e partida de pacotes e contadores de descartes em filas, além de gerar estatísticas como tamanho médio de fila. • Uso: • O ns permite criar um trace específico de uma fila pertencente a um enlace através do comando: $ns monitor-queue $n0 $n1 <trace> <intervalo> $ns trace-queue $n0 $n1 <trace>
Agentes • Agentes são endpoints onde pacotes são construídos e consumidos. • São usados na implementação de protocolos em várias camadas: • Protocolos da camada de transporte, por exemplo UDP e variações do TCP. • Protocolos de roteamento, por exemplo Distance-Vector.
Agentes (Cont.) • Vários agentes são disponibilizados pelo ns. Os mais conhecidos são: • TCP e suas variações (Vega, Reno, Newreno...); • TCPSink, um receptor TCP Reno ou Tahoe; • UDP • LossMonitor, um receptor de pacotes que produz estatísticas de perda de pacotes; • Null, um agente que descarta pacotes; • rtProto/DV, que simula o protocolo de roteamento distance-vector.
Agentes (Cont.) • Agentes são modelados pela classe Agent, implementada em C++ e OTcl (~ns/agent{.h,.cc} e ~ns/tcl/lib/ns-agent.tcl}). • Apresenta algumas variáveis utilizadas para inicializar campos dos pacotes criados: • addr_ -> endereço do nodo ao qual o agente está conectado; • dst_ -> endereço do nodo destino; • size_ -> tamanho do pacote gerado em bytes; • type_ -> tipo do pacote gerado.
Agentes (Cont.) • A classe Agent provê métodos para geração e recebimento de pacotes: • Packet* allocpkt() -> aloca um novo pacote e inicializa seus campos. • Packet* allocpkt(int n) -> aloca um novo pacote com um tamanho n de dados. • void recv(Packet*, Handler*) -> primeiro método invocado quando um pacote é recebido.
dst_=0.0 dst_=1.0 Agent/TCP Agent/TCPSink agents_ agents_ 0 1 1 0 Agentes (Cont.) n0 n1 Port Classifier Port Classifier Addr Classifier Addr Classifier 0 0 dmux_ dmux_ Link n0-n1 entry_ entry_ classifier_ classifier_ Link n1-n0
Utilizando Agentes • Cria-se agente emissor e o conecta ao nodo fonte: • Cria-se agente receptor e o conecta ao nodo sorvedouro: • Conectam-se os agentes emissor e receptor: set tcpSource [new Agent/TCP] $ns attach-agent $n0 $tcpSource set tcpSink [new Agent/TCPSink] $ns attach-agent $n1 $tcpSink $ns connect $tcpSource $tcpSink
Criando Um Novo Agente • Cria-se o cabeçalho do novo protocolo (conforme instruções anteriores). • Cria-se uma classe em C++ que estende a classe Agent. Arquivo .h class MeuAgente : public Agent { public: MeuAgente(); int command(int argc, const char*const* argv); void recv(Packet*, Handler*); };
Criando Um Novo Agente (Cont.) Arquivo .cc MeuAgente::MeuAgente() : Agent(PT_MEUAGENTE) { bind("packetSize_", &size_); } int MeuAgente::command(int argc, const char*const* argv) { ... } void MeuAgente::recv(Packet* pkt, Handler*) { ... }
Criando Um Novo Agente (Cont.) • Cria-se classe estática para OTcl linkage Arquivo .cc static class MeuAgenteClass : public TclClass { public: MeuAgenteClass() : TclClass("Agent/MeuAgente") {} TclObject* create(int, const char*const*) { return (new MeuAgente()); } } class_meuagente;
Criando Um Novo Agente (Cont.) • Inserir valores default para as variáveis do agente. • Adicionar o arquivo .o gerado na lista de arquivos objeto do ns no arquivo Makefile.in e executar ./configure. Arquivo ~ns/tcl/lib/ns-default.tcl Agente/MeuAgente set packetSize_ 64 sessionhelper.o delaymodel.o srm-ssm.o \ srm-topo.o \ ping.o \ $(LIB_DIR)int.Vec.o $(LIB_DIR)int.RVec.o
Implementados pelas classes herdeiras. Aplicações • Aplicações são construídas no topo dos protocolos de transporte. • Modeladas através da classe Application. • Principais métodos: • void send(int nbytes) • void recv(int nbytes) • void start() • void stop()
Aplicações (Cont.) • Utilizam os serviços dos protocolos de transporte através de chamadas para os seguintes métodos: • send(int nbytes) • sendmsg(int nbytes, const char* flags = 0) • close() • listen()
Application/FTP dst_=0.0 dst_=1.0 Aplicações (Cont.) n0 n1 Port Classifier Port Classifier Agent/TCPSink Addr Classifier Addr Classifier Agent/TCP 0 0 agents_ agents_ 0 1 dmux_ dmux_ entry_ entry_ classifier_ classifier_
Geradores De Tráfego • Tráfego é gerado em intervalos, que podem seguir uma determinada distribuição ou não. • Geradores de tráfego disponíveis: • Exponencial -> geram tráfego de acordo com uma distribuição Exponencial On/Off • Pareto -> geram tráfego de acordo com uma distribuição Pareto On/Off • CBR (Constant Bit Rate) -> geram tráfego a uma taxa constante
Geradores De Tráfego (Cont.) • Uso: set src [new Agent/UDP] set sink [new Agent/UDP] $ns_ attach-agent $n0 $src $ns_ attach-agent $n1 $sink $ns_ connect $src $sink set e [new Application/Traffic/Exponential] $e attach-agent $src $e set packetSize_ 210 $e set burst_time_ 500ms $e set idle_time_ 500ms $e set rate_ 100k
Geradores De Tráfego: Trace Driven • ns permite geração de tráfego a partir de arquivos de trace. • Uso: set tfile [new Tracefile] $tfile filename <file> set src [new Application/Traffic/Trace] $src attach-tracefile $tfile <file>: - Formato binário - inter-packet time (msec) e packet size (byte)
Aplicações Simuladas • ns permite a simulação de dois tipos de aplicações: • Application/FTP • Application/Telnet
Aplicações Simuladas (Cont.) • Uso set tcp1 [new Agent/TCP] $ns_ attach-agent $n0 $tcp1 set sink1 [new Agent/TCPSink] $ns_ attach-agent $n1 $sink1 $ns_ connect $tcp1 $sink1 set ftp1 [new Application/FTP] $ftp1 attach-agent $agent
dst_=0.0 dst_=1.0 0 1 1 0 Encaminhando Pacotes n0 n1 Application/FTP Port Classifier Port Classifier Agent/TCPSink Addr Classifier Addr Classifier Agent/TCP 0 0 Link n0-n1 entry_ entry_ Link n1-n0