Estrutura Interna - Classes Kalina Ramos Porto 08/08/2003.
Transcript of Estrutura Interna - Classes Kalina Ramos Porto 08/08/2003.
Estrutura Interna - Classes
Kalina Ramos Porto08/08/2003
Roteiro
Nodos Endereçamento Formato de Pacotes Filas e escalonamento de pacotes Agentes Aplicações e Geradores de Tráfego
Nodo
n0 n1
Addr Classifier
Port Classifier
classifier_
dmux_
entry_
Node entry
Unicast Node
Multicast Classifier
classifier_
dmux_
entry_
Node entry
Multicast Node
multiclassifier_
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 nodo e 32 bits
para o id da 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
Nodeentry
Level 1Level 2
Level 3
Addressclassifier To Port
demux
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_ 2lappend cluster_num 2 2AddrParams set cluster_num_ $cluster_numlappend eilastlevel 2 3 2 3AddrParams 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.
Formato De Pacotes (Cont.)
header
dataip header
tcp header
rtp header
trace header
cmn header
...
ts_
ptype_
uid_
size_
iface_
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.)
static class RTPHeaderClass : public PacketHeaderClass {public:
RTPHeaderClass() : PacketHeaderClass("PacketHeader/RTP",sizeof(hdr_rtp)) {
bind_offset(&hdr_rtp::offset_);}
} class_rtphdr;
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.
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
Como Funciona O Cabeçalho
Packet
next_
hdrlen_
bits_ size determinedat compile time
size determinedat compile time
size determinedat compile time
……
hdr_cmn
hdr_ip
hdr_tcp
size determinedat simulatorstartup time
(PacketHeaderManager)
PacketHeader/Common
PacketHeader/IP
PacketHeader/TCP
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.
enqT_ queue_ deqT_
drophead_ drpT_
link_ ttl_
Nodeentryhead_
tracing simplex link
Uso: ns_ duplex-link $n0 $n1 5Mb 2ms DropTail
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.
Implementados pelas classes herdeiras.
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.
Agentes (Cont.)
0
1
n0 n1
Addr Classifier
Port Classifier
classifier_
dmux_
entry_
0 Agent/TCP
agents_
Addr Classifier
Port Classifier
classifier_
dmux_
entry_
1
0Link n0-n1
Link n1-n0
0 Agent/TCPSinkagents_
dst_=1.0 dst_=0.0
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.
class MeuAgente : public Agent { public:
MeuAgente(); int command(int argc, const char*const* argv); void recv(Packet*, Handler*);
};
Arquivo .h
Criando Um Novo Agente (Cont.)
MeuAgente::MeuAgente() : Agent(PT_MEUAGENTE) { bind("packetSize_", &size_);
}
int MeuAgente::command(int argc, const char*const* argv) {...
}
void MeuAgente::recv(Packet* pkt, Handler*) {...
}
Arquivo .cc
Criando Um Novo Agente (Cont.)
Cria-se classe estática para OTcl linkage
static class MeuAgenteClass : public TclClass { public:
MeuAgenteClass() : TclClass("Agent/MeuAgente") {} TclObject* create(int, const char*const*) {
return (new MeuAgente()); } } class_meuagente;
Arquivo .cc
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.
Agente/MeuAgente set packetSize_ 64
Arquivo ~ns/tcl/lib/ns-default.tcl
sessionhelper.o delaymodel.o srm-ssm.o \ srm-topo.o \ ping.o \ $(LIB_DIR)int.Vec.o $(LIB_DIR)int.RVec.o
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()
Implementados pelas classes herdeiras.
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()
Aplicações (Cont.)
n0 n1
Addr Classifier
Port Classifier
classifier_
dmux_
entry_
Agent/TCP
agents_
Addr Classifier
Port Classifier
classifier_
dmux_
entry_
Agent/TCPSink
agents_
dst_=1.0 dst_=0.0Application/FTP
0
0
1
0
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 $tcp1set sink1 [new Agent/TCPSink]$ns_ attach-agent $n1 $sink1$ns_ connect $tcp1 $sink1
set ftp1 [new Application/FTP]$ftp1 attach-agent $agent
Encaminhando Pacotes
0
1
n0 n1
Addr Classifier
Port Classifier
entry_
0 Agent/TCP Addr Classifier
Port Classifier
entry_
1
0Link n0-n1
Link n1-n0
0 Agent/TCPSink
dst_=1.0 dst_=0.0Application/FTP