Tutorial do MobiCS - INF

Propaganda
Tutorial do MobiCS
by Ricardo Couto Antunes da Rocha
NOTICE:
Table of contents
1 Visão Geral de uma Simulação Usando MobiCS................................................................................................................... 2
2 Implementação Passo-a-Passo do Protocolo RDP...................................................................................................................2
2.1 Implementação do protocolo.............................................................................................................................................. 2
2.2 Simulação............................................................................................................................................................................2
2.3 Compilação e Execução do Exemplo.................................................................................................................................3
3 Programando um Protocolo com Timers.................................................................................................................................3
4 Modo de Simulação Estocástico..............................................................................................................................................3
4.1 Introdução........................................................................................................................................................................... 3
4.2 Os Parâmetros de Simulação e a Criação de um Elemento...............................................................................................4
4.3 A Criação dos Modelos de Simulação...............................................................................................................................4
4.4 Etapas de Implementação da Simulação............................................................................................................................ 6
4.5 Exemplo.............................................................................................................................................................................. 6
5 Detalhes sobre Implementação de Protocolos......................................................................................................................... 6
5.1 Endereços de Hosts............................................................................................................................................................ 6
5.2 Criação de Mensagens........................................................................................................................................................7
© 2000-2004 IME-USP / PUC-Rio
Copyright © 2004 IME-USP/PUC-Rio. All rights reserved.
Tutorial do MobiCS
1 Visão Geral de uma Simulação Usando MobiCS
O tutorial abaixo corresponde a uma apresentação feita na aula de MAC 5743, no IME-USP. Nestes slides é mostrado um
exemplo de como um protocolo pode ser prototipado e simulado no MobiCS. O protocolo usado como exemplo foi o RDP. Há
também uma versão em postscript ( http://www.ime.usp.br/~sidam/Tools/MobiCS/aula02_mac5743.ps.gz) do documento.
•
•
•
Visão Geral ( http://www-di.inf.puc-rio.br/~endler/MobiCS/mobics-tutorial1.pdf) do MobiCS
Tutorial do MobiCS: Interfaces de Programação e Exemplos ( http://www.ime.usp.br/~sidam/Tools/MobiCS/aula2)
Exemplo de Uso ( http://www-di.inf.puc-rio.br/~endler/MobiCS/mobics-tutorial2.pdf)
Outras páginas com informações sobre simulação no MobiCS:
•
•
Página do MobiCS na PUC-Rio ( http://www-di.inf.puc-rio.br/~endler/MobiCS/) , do prof. Markus Endler
Página antiga ( http://www.lcpd.ime.usp.br/~mobics/old-site) do MobiCS
2 Implementação Passo-a-Passo do Protocolo RDP
Como exemplo passo-a-passo de implementação e simulação de um protocolo no MobiCS, vamos utilizar como exemplo o
protocolo RDP. Para maiores detalhes sobre este protocolo, favor conferir na página de exemplos ( samples.html#RDP) .
Nota
Observe que na página de exemplos há protocolos mais simples que o RDP!
Para implementar e simular o protocolo RDP do exemplo disponibilizado, é necessário seguir os seguintes passos:
2.1 Implementação do protocolo
1.
2.
3.
4.
Declarar as mensagens tratadas pelo protocolo. Todas as mensagens são declaradas como subclasses da classe Message.
Essas classes estão no pacote sidam.rdp.messages ( ../sample/sidam/rdp/messages) .
Definir as instâncias de implementação do protocolo. O RDP possui uma instância para Mss's e Mh's. Para efeito
de testes, criamos também uma instância do protocolo para servidores, que chamamos de RDPServer. Esta instância é
responsável apenas por responder um requisição Req, com uma mensagem Res. No script determinístico, o protocolo do
servidor
Declarar os micro-protocolos na forma de interfaces Java. A implementação do RDPMss, que é a mais complexa, contém
três micro-protocolos: RDPMssWireless ( ../sample/sidam/rdp/RDPMssWireless.java) , RDPMssWired ( ../sample/sidam/
rdp/RDPMssWired.java) e RDPMssHandoff ( ../sample/sidam/rdp/RDPHandoffModule.java) . Observe nos arquivos quais
mensagens são tratadas pelos micro-protocolos, comparando o nome dos métodos com as mensagens declaradas no item 1.
Implementar o protocolo. Para implementar um protocolo é necessário implementar as classes que implementam os
métodos de todos os micro-protocolos declarados. No caso do RDPMss, a implementação é feita na classe RDPMss.java
( ../sample/sidam/rdp/RDPMss.java) .
2.2 Simulação
1.
2.
Declarar os tipos de elementos simulados utilizados na simulação. Devem ser declaradas classes (em geral) que
definam elementos simulados com mesmo padrão de comportamento. Tipicamente, declara-se uma classe para cada Mss
e/ou Mh que possuem os mesmos protocolos encapsulados e padrão de comportamento durante a simulação. No exemplo
do RDP, foram declaradas duas classes: MyMss.java ( ../sample/MyMss.java) e MyMh.java ( ../sample/MyMh.java) .
Os construtores da classe simplesmente criam um objeto protocolo, que implementa o RDP para aquele elemento, e
incorporam ele ao elemento, que a partir daí é capaz que responder com o protocolo a todas as mensagens do RDP
recebidas.
Implementar a simulação determinística. Para isso, é necessário criar uma subclasse de DetermSimulation ( ../api/
mobics/simulation/DetermSimulation.html) e implementar os métodos configure e script. A simulação determinística está
implementada na classe MySimulation.java ( ../sample/MySimulation.java) . No método configure deve-se inicializar todos
© 2000-2004 IME-USP / PUC-Rio
Copyright © 2004 IME-USP/PUC-Rio. All rights reserved.
Page 2
3.
Tutorial do MobiCS
os elementos simulados (que foram declarados como atributos da classe), enquanto que no método script deve-se descrever
o script determinístico.
Incorporação e execução da simulação no programa do usuário. O programa do usuário é a classe MyApp.java ( ../
sample/MyApp.java) . Ela simplesmente cria um objeto da classe MySimulation e inicia a simulação, executando o método
start.
2.3 Compilação e Execução do Exemplo
1.
2.
3.
Faça o download do arquivo ( ../sample/exemplordp.tar) com o exemplo RDP. Descompacte o arquivo com o comando
tar -xvf exemplordp.tar (no Windows o próprio Winzip é capaz de gerar os arquivos a partir do .TAR).
Considerando que sua variável de ambiente CLASSPATH contém os caminhos para acesso às bibliotecas do JDK1.2.2,
adicione a ela as bibliotecas do MobiCS e do JGL. No caso da rede IME, você deve usar o comando export
CLASSPATH=$CLASSPATH:/home/posmac/rcarocha/lib/mobics.jar:/home/posmac/rcarocha/
lib/jgl3.1.0.jar:.
Compile o exemplo com o comando javac MyApp.java. Execute com o comando java MyApp.
3 Programando um Protocolo com Timers
O documento abaixo descreve como programar e simular um protocolo que utiliza timers, ou seja, que executa ações após
tempos pré-determinados.
•
Programação de Eventos de Tempo no MobiCS ( http://www.inf.puc-rio.br/~endler/MobiCS/timers.pdf)
4 Modo de Simulação Estocástico
4.1 Introdução
A simulação determinística foi utilizada para permitir testar o funcionamento do protocolo em situações bem específicas e
críticas, que eram programadas pelo usuário da simulação. O seu objetivo é permitir avaliar a corretude do protocolo.
Na simulação estocástica, o protocolo será submetido a um cenário aleatório e a uma simulação exaustiva, que deverão
permitir:
•
•
a avaliação do desempenho do protocolo
observação do comportamento do protocolo em cenários maiores e exaustivos, cuja descrição em script detemrinístico é
impraticável. Com isso, a estabilidade do protocolo poderá ser avaliada também.
A diferença básica da simulação determinística para a estocástica é a forma como o cenário de simulação é descrito.
Enquanto que na simulação determinística o usuário descrevia em um script um cenário bem específico e determinístico, na
estocástica o usuário deverá descrever os padrões de comportamento de todos os elementos de rede: máquinas fixas e móveis
e canais de comunicação. Por exemplo, se no script o usuário colocava explicitamente comandos MoveTo para realizar uma
migração de um Mh, na simulação estocástica o usuário deverá indicar em qual taxa o Mh migra de célula. Esses padrões de
comportamento são chamados de modelos de simulação. Vamos definir os seguintes termos:
•
•
•
Parâmetros de simulação: conjunto de parâmetros de entrada de um elemento simulado que definem como eventos
internos serão gerados surante a simulação.
Modelo de simulação: define quais são os parâmetros dos elementos simulados que definem seu comportamento e como
os eventos internos (como envio de mensagens e migrações) são gerados a partir desses parâmetros.
Eventos internos: quaisquer eventos que um elemento simulado pode gerar sem a interferência de outro, como enviar
mensagens, migrar (caso de Mh). Caso um elemento gere nenhum evento interno, ele será um elemento passivo na
simulação, que apenas executa alguma ação quando recebe uma mensagem de outro elemento.
A maioria dos simuladores define um modelo de simulação e o usuário define seus parâmetros quando quiser executar uma
simulação. O MobiCS é flexível o bastante para permitir que novos modelos de simulação possam ser implementados e usados
em simulações, e é justamente essa a tarefa que deverá ser feita no 2o. EP: implementar o modelo de simulação descrito
no trabalho e executar a simulação com diferentes parâmetros, observando o comportamento do protocolo. Para isso, não é
© 2000-2004 IME-USP / PUC-Rio
Copyright © 2004 IME-USP/PUC-Rio. All rights reserved.
Page 3
Tutorial do MobiCS
necessária nenhuma alteração no protocolo que foi desenvolvido, mas apenas modificar a classe Simulation ( ../api/mobics/
simulation/Simulation.html) .
4.2 Os Parâmetros de Simulação e a Criação de um Elemento
Toda a simulação deve criar objetos que representam os elemento simulados, desde estações móveis até canais de
comunicação. No exemplo do RDP, para se criar uma estação móvel utilizou-se o comando
mh = new MyMh("Mh",sim);
Na simulação estocástica será necessário acrescentar mais um parâmetro no construtor do objeto que será seu modelo de
simulação. O exemplo poderia então ser substituído por
mh = new MyMh("Mh",sim, new MySimulationModel(p1,p2,p3));
onde p1, p2 e p3 são os três parâmetros utilizados para o modelo de simulação. Assim, a classe MySimulationModel
define um modelo de simulação e p1, p2 e p3 os parâmetros de simulação do Mh. Observe que esse parâmetros
poderiam estar embutidos na implementação da classe MyMh e a chamada do construtor poderia ser como a
anterior. Caso não seja utilizado esse parâmetro, será criado um modelo de simulação nulo, no qual o elemento
de comporta de maneira passiva, ou seja, não gera nenhum evento (cf. os construtores de Mh ( ../api/mobics/
network/Mh.html#Mh(java.lang.String,%20mobics.simulation.Simulator)) e Mss ( ../api/mobics/network/
Mss.html#Mss(java.lang.String,%20mobics.simulation.Simulator,%20mobics.network.Cell)) )
Da mesma forma como os elementos, o construtor dos canais de simulação também precisa receber como parâmetro o seu
modelo de simulação. Só que no caso de canais, o modelo não define a geração de eventos internos, mas o desempenho do
canal, sua taxa de envio de dados. No caso de canais WiredLink, esse modelo de simulação é trivial e deve indicar a taxa de
envio de dados pelo canal para cada mensagem. O caso dos canais WirelessLink pode ser um pouco mais complicado, pois a
taxa de envio de dados é dependente da distância entre Mss e Mh e da própria mobilidade do Mh; entretanto para descrever
esse modelo no 2o. EP, essas informações não serão utilizadas e esse canal terá uma taxa fixa de envio de dados tal como um
canal WiredLink.
4.3 A Criação dos Modelos de Simulação
Conforme comentado anteriormente, para realizar uma simulação estocástica é necessário definir, no mínimo, dois modelos de
simulação: um para os canais de comunicação e outro para os elementos de rede simulados.
4.3.1 Para canais de comunicação
Um modelo de simulação para canais de simulação é bastante simples. Sua única função é definir o atraso associado ao envio
de uma mensagem dada. Quando um modelo é associado a um canal, ele é chamado durante o envio de cada mensagem para
calcular o atraso de envio da mensagem e determinar o timestamp da mensagem quando ela chega ao destinatário.
Para definir um modelo basta implementar uma subclasse de LinkSimModel ( ../api/mobics/simulation/
models/LinkSimModel.html) , que implementa o método delaySend ( ../api/mobics/simulation/models/
LinkSimModel.html#delaySend(mobics.network.NetMessage)) . que recebe como parâmetro a mensagem de rede NetMessage
( ../api/mobics/network/NetMessage.html) a ser enviada. O método deve retornar um long que indica o atraso referente ao
envio daquela mensagem.
O programador do modelo de simulação define a complexidade do seu modelo, de acordo com as
características que deseja simular. Tipicamente, o método delaySend ( ../api/mobics/simulation/models/
LinkSimModel.html#delaySend(mobics.network.NetMessage)) retorna um valor proporcional ao tamanho da mensagem e
associado ao throughput do canal (que é um parâmetro de simulação a ser recebido no construtor do modelo de simulação).
Para canais de comunicação sem fio, a implementação pode ser bastante complexa. O modelo, além de avaliar o tamanho da
mensagem a ser enviada, pode avaliar como a distância entre emissor e receptor da mensagem influencia nesse atraso.
© 2000-2004 IME-USP / PUC-Rio
Copyright © 2004 IME-USP/PUC-Rio. All rights reserved.
Page 4
Tutorial do MobiCS
4.3.2 Para elementos de rede simulados
A definição de modelos de simulação para elementos de rede é mais complexa que para canais de comunicação. O diagrama
básico do modelo de simulação, que daqui para frente será chamado de gerador de eventos, está mostrado na figura abaixo.
O modelo de simulação é implementado em uma subclasse de EventGenerator ( ../api/mobics/simulation/models/
EventGenerator.html) . Esse gerador de eventos é responsável por criar os eventos de simulação internos do elemento e
adicioná-los à fila de eventos EventQueue ( ../api/mobics/simulation/models/EventQueue.html) . Esses eventos são retirados da
fila pela camada de simulação e executados.
A geração dos eventos é feita no método run() ( ../api/mobics/simulation/models/EventGenerator.html#run())
do gerador de eventos. Há duas formas de fazê-lo: adicionando os elementos da fila de eventos já ordenados
segundo o seu timestamp (usando o método EventQueue.putEvent(SimEvent)) ( ../api/mobics/simulation/
models/EventQueue.html#pushEvent(mobics.simulation.models.SimEvent)) ou adicionar os eventos fora
de ordem (usando o método EventQueue.putAsynchEvent(SimEvent)) ( ../api/mobics/simulation/models/
EventQueue.html#pushAsynchEvent(mobics.simulation.models.SimEvent)) e depois indicar o término da geração de eventos
ou um timestamp limite até onde os eventos estão ordenados (método EventQueue.setCurrentLimitTimer(long)) ( ../api/
mobics/simulation/models/EventQueue.html#setCurrentLimitTimer(long)) .
O timerScheduler ( ../api/mobics/simulation/models/EventGenerator.html#timerScheduler) auxilia o programador
a definir geração de eventos periódicos. O programador do modelo de simulação pode adicionar um modelo de
geração de evento, subclasse de EventModel ( ../api/mobics/simulation/models/EventModel.html) , ao timerScheduler
informando qual é o período de geração do evento (cf. método TimerScheduler.addEvent(long, SimEvent)) ( ../api/
mobics/simulation/models/TimerScheduler.html#addEvent(long,%20mobics.simulation.models.EventModel)) . Neste
períodos o timerScheduler irá executar o método EventModel.generateEvent(Element) ( ../api/mobics/simulation/models/
EventModel.html#generateEvent(mobics.network.Element)) que irá retornar um novo evento de simulação (por exemplo uma
nova migração) ou um null, indicando que nenhum evento será gerado naquele timestamp (o método pode testar de acordo
com uma probabilidade dada e o gerador de números aleatórios, se um novo evento será gerado ou não; no caso de eventos
realmente periódicos um novo evento será gerado sempre que o scheduler chamar o método).
Há ainda um gerador de número aleatórios ( ../api/mobics/simulation/models/RandomGenerator.html) que pode auxiliar na
programação no modelo de geração de eventos.
© 2000-2004 IME-USP / PUC-Rio
Copyright © 2004 IME-USP/PUC-Rio. All rights reserved.
Page 5
Tutorial do MobiCS
4.4 Etapas de Implementação da Simulação
Para implementar uma simulação estocástica devem ser seguidos o seguintes passos:
1.
2.
3.
4.
5.
6.
7.
8.
Definir todos os parâmetros de simulação e como os eventos serão gerados a partir desses parâmetros.
Implementar subclasses de LinkSimModel ( ../api/mobics/simulation/models/LinkSimModel.html) que definir os modelos
de simulação dos canais de comunicação, tanto wireless como wired. Implementar os respectivos métodos delaySend ( ../
api/mobics/simulation/models/LinkSimModel.html#delaySend(mobics.network.NetMessage)) .
Implementar subclasses de EventGenerator ( ../api/mobics/simulation/models/EventGenerator.html) que definem os
modelos de simulação para cada um dos elementos simulados com diferente modelo de simulação.
1. Declarar uma subclasse de EventModel ( ../api/mobics/simulation/models/EventModel.html) para cada tipo de evento
a ser gerado periodicamente. Implementar seu método EventModel.generateEvent(Element) ( ../api/mobics/simulation/
models/EventModel.html#generateEvent(mobics.network.Element)) .
2. Adicionar todos os modelos de eventos criados acima no timerScheduler ( ../api/mobics/simulation/models/
EventGenerator.html#timerScheduler) , no código do construtor do EventGenerator ( ../api/mobics/simulation/models/
EventGenerator.html) indicando o timestamp periódico em que a tarefa deve ser testada OU
3. Modificar o método run() ( ../api/mobics/simulation/models/EventGenerator.html#run()) do gerador de eventos,
indicando todos os eventos a serem incluidos na EventQueue ( ../api/mobics/simulation/models/EventQueue.html) e
modificar o timestamp limite dos eventos ordenados quando for necessário.
Criar uma simulação estocástica em uma subclasse de StochSimulation ( ../api/mobics/simulation/StochSimulation.html) ,
assim como feito anteriormente com uma simulação determinística.
Criar objetos dos modelos de simulação criados, passando-os como parâmetro dos construtores dos canais e elementos
simulados. Todos esses objetos devem ser criados na classe simulação estocástica.
Na aplicação executar o método StochSimulation.start() ( ../api/mobics/simulation/StochSimulation.html#start()) para
iniciar a simulação.
Avaliar o resultado obtido
Testar para outros parâmetros de simulação.
4.5 Exemplo
No diretório do RDP ( http://www.ime.usp.br/~rcarocha/mobics/exemplo/) há também um exemplo de simulação estocástica.
5 Detalhes sobre Implementação de Protocolos
5.1 Endereços de Hosts
Toda máquina de rede simulada possui um endereço, declarado como um objeto da classe Address ( ../api/mobics/network/
Address.html) . Esse endereço é um identificador único e está relacionado à interface de rede com a qual o elemento envia
mensagens para outra máquina. Mh's também possuem um endereço que identifica a sua interface de rede sem fio e para a qual
o MSS responsável pode enviar mensagens.
Atenção
Esse endereço não pode ser usado por outras máquinas da rede para enviar mensagens para o Mh, pois é um endereço de interface sem fio e
não existe nenhum método de reencaminhamento de mensagens (como o protocolo RDP) previamente utilizado nos elementos simulados.
Para obter o endereço de qualquer elemento de rede, basta chamar o método getAddress ( ../api/mobics/network/
Element.html#getAddress()) , declarado na classe Element ( ../api/mobics/network/Element.html) .
O envio de mensagens é feito sempre com o método send(Address, Message) ( ../api/mobics/network/
Element.html#send(mobics.network.Element,%20mobics.ppi.message.Message)) . Caso a mensagem não possa ser
enviada para o endereço fixo indicado, o método retorna a exceção HostNotReachedException ( ../api/mobics/exception/
HostNotReachedException.html) , o que é válido apenas para o envio entre máquinas fixas de rede como, por exemplo,
entre Mss's. No caso de envio de mensagens pelo canal sem fio (entre Mss e Mh), a primitiva send não é confiável e ela não
© 2000-2004 IME-USP / PUC-Rio
Copyright © 2004 IME-USP/PUC-Rio. All rights reserved.
Page 6
Tutorial do MobiCS
garante que o endereço utilizado é correto ou que o Mh está na célula no momento do envio. Para se ter garantias quanto ao
envio de mensagens pelo meio sem fio, deve-se adicionar confirmações ao protocolos ou utilizar o método rSend ( http://
www.lcpd.ime.usp.br/~mobics/rsend) , que implementa uma confirmação simples do recebimento da mensagem. Caso a
mensagens não tenha sido recebida, é recebida a exceção MessageNotAcknowledged ( http://www.lcpd.ime.usp.br/~mobics/
g) (observe que a própria mensagem de confirmação pode ser perdida). O método send ( http://www.lcpd.ime.usp.br/~mobics/
g) e rSend ( http://www.lcpd.ime.usp.br/~mobics/g) para Mh's só contém o parâmetro Message, já que um Mh só pode enviar
mensagens para o seu Mss responsável.
Não há nenhum protocolo previamente adicionado aos elementos de uma rede simulada no MobiCS, nem mesmo protocolos
de encaminhamento de mensagens pela rede fixa. Por isso, uma máquina fixa como um Mss, só pode enviar mensagens
diretamente para as máquinas fixas para as quais possuem canais WiredLink ( ../api/mobics/network/WiredLink.html) .
Para realizar um broadcast de uma mensagem, basta colocar como destinatário da mensagem o endereco Address.bCast
( ../api/mobics/network/Address.html#bCast) , que é um endereço estático do tipo BCastAddress ( ../api/mobics/network/
BCastAddress.html) declarado na classe Address ( ../api/mobics/network/Address.html) . Esse tipo de endereço é válido tanto
para realizar broadcasts pelo meio conectado como pelo meio sem fio. É importante observar que no caso de um broadcast
pela rede fixa, uma máquina envia mensagens apenas para as demais máquinas conectadas a ela por canais WiredLink ( ../api/
mobics/network/WiredLink.html) .
Em scripts determinísticos é possível enviar mensagens usando apenas a referência ao elemento simulado, ao invés de seu
endereço. Por exemplo, ao invés de send(mss1.getAddress(),mesg1) pode-se usar send(mss1,mesg1).
5.2 Criação de Mensagens
Na declaração de mensagens duas coisas nunca devem ser esquecidas. A primeira delas é chamar o construtor de Message
( ../api/mobics/ppi/message/Message.html) , passando como parâmetro a classe (com extensão .class) do protocolo que
é responsável por manipular aquele tipo de mensagem. No exemplo do RDP, na declaração da mensagem PList ( http://
www.ime.usp.br/~rcarocha/mobics/exemplo/sidam/rdp/messages/PList.java) há uma chamada super(RDPMss.class)
no construtor da mensagem, indicado que a classe RDPMss implementa o tratamento da mensagem. Caso isso não
seja feito, quando o Mss receber a mensagem, será gerada a exceção MsgHandleException ( ../api/mobics/exception/
MsgHandleException.html) .
Outra informação que não deve ser esquecida diz respeito ao handler da mensagem. A classe Message ( ../
api/mobics/ppi/message/Message.html) implementa um método callHandler ( ../api/mobics/ppi/message/
Message.html#callHandler(mobics.ppi.protocol.Protocol)) , que é responsável por definir qual é o método do objeto protocolo
responsável por tratar aquela mensagem. No caso do exemplo citado acima, callHandler define qual o método do objeto da
classe RDPMss.class que será chamado quando o elemento receber a mensagem PList.
A classe Message implementa uma funcionalidade básica para o método, na qual é chamado o método do protocolo que
possui exatamente o mesmo nome da classe da mensagem recebida. No exemplo, o método chamado será PList (observe que a
assinatura do método deve ser idêntica à da classe, obedecendo o uso de maiúsculas e minúsculas). O usuário pode definir um
novo método como handler da mensagem, bastanto para isso reimplementar o método callHandler. No exemplo da mensagem
PList, para associar como handler da mensagem o método pList2, basta adicionar a seguinte declaração de método na classe
PList:
public void callHandler(Protocol prot){
((RDPMss) prot).pList2(this);
}
Usando o callHandler default, caso o método handler não exista é gerada a exceção durante a simulação. No caso acima, erro
ocorre durante a compilação da classe PList.
© 2000-2004 IME-USP / PUC-Rio
© 2000-2004 IME-USP / PUC-Rio
Copyright © 2004 IME-USP/PUC-Rio. All rights reserved.
Page 7
Download