Simulação do Protocolo de Tolerância a
Falhas de MSS
por
Marcelo Ferreira Moreno
Professor: Markus Endler
Relatório de implementação apresentado como parte dos requisitos de avaliação da disciplina “Introdução à Computação Móvel”, 2º semestre de 2003
1
Introdução
Por toda a evolução das aplicações para redes móveis nota-se a crescente necessidade de se manter dados de estado das estações móveis nos MSS’s, principalmente para a redução do consumo de energia, da utilização de disco e do custo da comunicação como um todo. MSS’s passaram a ser pontos centrais de armazenamento de informações de grande importância o funcionamento adequado de programas. Tal centralização torna o sistema vulnerável em pontos específicos, sobre os quais recai especial interesse para a utilização de mecanismos de tolerância a falhas.
Na presença de falha de um MSS, informações de estado de várias estações móveis são perdidas. Essas estações ficam obrigadas a aguardar a recuperação do MSS ou, ainda, migrar para a área de atuação de outro MSS. Porém, em qualquer um dos casos, aquela informação vital para a continuidade de execução dos programas em andamento não pode ser recuperada.
Assim, a proposta de [Alagar93] é manter um mecanismo de replicação das informações de estado de cada um das estações móveis entre vários MSS’s secundários. No trabalho citado são apresentados dois esquemas de replicação. No primeiro, chamado de pessimista, o encaminhamento efetivo de uma mensagem de dados (que modifica o estado do Mh) pelo MSS somente é feito após a recepção de reconhecimentos (Acks) vindos de todos os MSS secundários para os quais foram enviadas cópias da mensagem para atualização local do estado. Dessa forma, assegura-se a consistência da informação replicada, mesmo na presença de falha do MSS em qualquer momento. O segundo esquema, chamado otimista, não aguarda os reconhecimentos de mensagens de cópia para o encaminhamento. Assim, pode ser que um MSS secundário não receba a cópia da mensagem e cause uma inconsistência entre as informações armazenadas nos MSS, caso o MSS primário falhe. Para que este segundo esquema possa ser realmente utilizado, a rede deve prover primitivas de comunicação que garantam a entrega de mensagens em trânsito. Uma outra opção seria a execução de um rollback na estação móvel para um estado consistente com o MSS secundário.
Além das estratégias de replicação, o trabalho de Alagar define estratégias para a eleição dos MSS secundários. O MSS primário de um Mh é sempre o MSS responsável pela célula atual. Para os MSS secundários, a primeira estratégia os elege de acordo com o padrão de mobilidade da estação móvel, válida apenas em situações nas quais tal parâmetro pode ser inferido. Com isso, qualquer que seja a célula visitada, o MSS responsável possuirá as informações de estado atualizadas, podendo ser usados caso se torne um MSS primário. A segunda estratégia de eleição dos MSS baseia-se no conjunto de células vizinhas à célula atual do Mh. Se Mh irá se mover, é muito provável que seja com destino a uma das células adjacentes à posição atual.
Quando um MSS se recupera de uma falha, tarefas simples devem ser executadas. Primeiro, toda a informação de estados anteriores à falha deve ser eliminada. Em seguida, o MSS deve informar a todos os outros sobre sua recuperação, habilitando-se a ser usado pelas estações móveis. Para toda estação móvel da qual o MSS recuperado é secundário, este deve obter a informação de estado atualizada.
Para a implementação da simulação no MOBICS, optou-se pelo esquema de replicação pessimista e a estratégia de eleição dos MSS’s vizinhos como secundários. O presente relatório encontra-se estruturado da seguinte forma. A Seção 2 descreve resumidamente o funcionamento do protocolo e suas mensagens. A Seção 3 descreve o funcionamento detalhado dos elementos da rede frente a chegada de cada uma das mensagens descritas na Seção 2. A Seção 4 mostra como foram implementadas as simulações determinísticas e os resultados obtidos. A Seção 5 traz a implementação da simulação estocástica também acompanha de seus resultados. A Seção 6 encerra o trabalho comentando as experiências e conclusões.
2
Descrição do protocolo
2.1 Operação normal:Quando um uma estação móvel (s) deseja enviar uma mensagem (m) para uma outra estação móvel (r), deve encaminhá-la ao seu MSS primário (mp(s)) e armazená-la em um buffer local. Após recebida uma confirmação (ack) do mp(s), o host s pode remover a mensagem m de seu buffer. Se, antes de tal confirmação, o host s receber uma mensagem notificando a falha de mp(s), s deve estabelecer conexão com um novo MSS primário e retransmitir a mensagem m. s mp(s) mp(r) r m m m ack ack ack
Figura 2.1 – Encaminhamento de mensagens de dados
Nota-se que, seja enviando ou recebendo uma mensagem, uma estação móvel h fica submetida à intermediação na comunicação por parte de seu MSS primário (mp(h)). Esse elemento fica, então, responsável por analisar cada mensagem enviada ou recebida por h, a fim de atualizar sua informação de estado (st_info(h)). Se uma mensagem m demanda essa atualização, mp(h) envia cópias (copy(h,m)) para todos os MSS secundários de h (ms(h)). Ao receber copy, cada ms(h) atualiza st_info(h) armazenado localmente e envia uma confirmação para mp(h). Na estratégia pessimista de replicação, mp(h) somente atualiza st_info(h) e encaminha a mensagem m após recebidas todas as confirmações de cópias dos ms(h). Na estratégia otimista, os reconhecimentos não são aguardados para atualização local e encaminhamento. m copy(h,m) copy(h,m) copy(h,m) ack ack ack ack m h ms(h) ms(h) ms(h) ms(h) mp(h)
Figura 2.2 – Atualização da informação de estado de uma estação móvel
2.2 Operação após uma falha:
Quando mp(h) falha, h deve procurar por um dos ms(h), por exemplo o MSS n. Agora que n se tornou o MSS primário de h, o conjunto ms(h) provavelmente mudou. Todos os novos MSS’s pertencentes a ms(h) recebem uma cópia de st_info(h), enquanto que os MSS’s que não mais são ms(h) devem apagar st_info(h). Se h decide por utilizar um MSS ausente da lista ms(h), então st_info(h) deve ser obtida a partir de um dos MSS pertencentes a ms(h). Nota-se que o procedimento de handoff é idêntico.
2.3 Tipos de mensagens
A Tabela 2.1 descreve de forma resumida os tipos de mensagens definidos pelo protocolo.
AckCopy ms(h) Mp(h) Confirmação da chegada de uma mensagem Copy. Significa que a informação de estado em um MSS secundário foi atualizada com sucesso. AckData_Mh_Mss r Mp(r) Confirmação da chegada de uma
mensagem de dados no destinatário. Significa que a mensagem de dados chegou ao host móvel destino.
AckData_Mss_Mh mp(s) S Confirmação da chegada de uma mensagem de dados no destinatário.
AckData_Mss mp(r) Mp(s) Confirmação da chegada de uma mensagem de dados no destinatário.
AckStateInfo ms(h) Mp(h) Confirmação da chegada de uma mensagem de informação do estado. Significa que um novo MSS secundário de h acaba de atualizar a informação de estado referente a ele.
Copy mp(h) ms(h) Cópia de uma mensagem de dados de/para h que demanda atualização na informação do estado em todos os MSS’s secundários. Data_App aplic. s Mensagem de dados criada pela aplicação
e que deve ser enviada para outra estação móvel
Data_Mh_Mss s mp(s) Mensagem de dados originada da estação móvel emissora para seu MSS primário, que deve realizar o encaminhamento. Data_Mss_Mh mp(r) r Mensagem de dados encaminhada do
MSS primário do receptor para este.
Data_Mss mp(s) mp(r) Mensagem de dados encaminhada do MSS primário do emissor para o MSS primário do receptor
MSSFail_Mh mp(h) H Notificação de falha do MSS enviada para as estações móveis as quais tem este MSS como primário
MSSFail_Mss MSS x MSS y Notificação da falha do MSS enviada para todos os outros MSS que compõem a rede StateInfo mp(h) ms(h) Informação do estado da estação móvel h
enviada para um novo MSS eleito como secundário. Pode ser usada também no caso de uso do novo MSS como primário sem que este fosse secundário anteriormente.
Tabela 2.1 – Mensagens definidas pelo protocolo.
Já a Tabela 2.2 ilustra algumas mensagens adicionais que foram necessárias para uma correta simulação do protocolo no Mobics.
DeleteStateInfo mp(h) Ex-ms(h) Pedido de remoção da informação de estado para um MSS que até então era secundário da estação móvel h.
FailNow Simul. MSS x Mensagem que provoca a falha do MSS destino, para efeitos de simulação
Welcome mp(h) H Mensagem de boas vindas para a estação móvel que acaba de migrar, para que esta cheque se há mensagens pendentes de confirmação caso a estação esteja vindo de uma falha de seu MSS primário anterior.
Tabela 2.2 – Mensagens definidas pelo protocolo.
3
Implementação dos elementos da rede
3.1 Ações tomadas pelos elementos da redeEstação móvel (Mh) Recebendo Data_App:
Esta é a mensagem de dados gerada pela aplicação, destinada a uma outra estação móvel.
o Coloca a mensagem de dados em um buffer
o Envia a mensagem de dados como Data_Mh_Mss ao seu MSS primário
Recebendo Data_Mss_Mh:
Esta é a mensagem de dados chegando ao seu destino final, a estação móvel receptora. o Envia confirmação do recebimento (AckData_Mh_Mss) para o seu MSS primário
Recebendo AckData_Mss_Mh:
Esta é a mensagem de confirmação vinda do MSS primário da estação móvel. Isso quer dizer que a mensagem de dados foi recebida com sucesso, podendo ser removida do buffer do transmissor.
o Remove a mensagem de dados correspondente ao reconhecimento do buffer local de mensagens
Recebendo MssFail_Mh:
Esta é a notificação de falha do MSS primário da estação. Com isso, ela deve esperar por uma migração e obtenção de um novo MSS primário.
o Levanta uma flag local de que a próxima migração é devido a uma falha do MSS primário.
Esta é a notificação de que a estação migrou com sucesso. Sabendo disso, ela pode verificar a flag de falha do MSS primário anterior. Caso seja verdade, a estação reenvia as mensagens de dados pendentes de confirmação.
o Se houve falha do MSS primário anterior e há mensagens pendentes de confirmação...
Envia cada mensagem de dados (Data_Mh_Mss) pendente para o novo MSS primário.
o Baixa a flag local de falha.
Estação rádio-base (MSS) Recebendo Copy:
Esta é a cópia da mensagem de dados enviada pela estação móvel. A cópia é enviada pelo MSS primário do remetente para os MSS secundários, somente se identificada a necessidade de atualização da informação de estado. O MSS secundário que recebe Copy deve atualizar a informação de estado da estação móvel em questão e notificar o sucesso da operação.
o Armazena o estado do Mh na sua lista de estados de estações para as quais o MSS é secundário
o Envia uma mensagem de confirmação (AckCopy) para o MSS de origem (primário do Mh)
Recebendo AckCopy:
AckCopy é a mensagem de confirmação da atualização do estado de um Mh gerada por um MSS secundário, enviada ao MSS primário. Com essa confirmação, o MSS primário pode considerar que reduzir o número de confirmações pendentes. Se já não há mais confirmações pendentes, a mensagem de dados pode ser encaminhada para o MSS primário do destino. A informação de estado do Mh também pode ser atualizada.
o Remove o MSS remetente da mensagem AckCopy da lista de pendentes de confirmação
o Se a lista de pendentes estiver vazia...
Recupera a mensagem de dados do buffer local.
Envia a mensagem de dados (Data_Mss) para o MSS primário do destinatário.
Recebendo Data_Mss:
Esta é a mensagem de dados encaminhada do MSS primário do remetente para o MSS primário do destinatário. Basta que o MSS reencaminhe a mensagem de dados à estação móvel receptora.
o Envia a mensagem de dados (Data_Mss_Mh) ao Mh de destino
Recebendo AckData_Mss:
AckData_Mss é a confirmação dada pelo MSS primário do destinatário ao MSS primário do remetente notificando o sucesso do envio da mensagem de dados. Ao recebê-la, o MSS primário do remetente pode eliminar a mensagem de dados do buffer e enviar uma confirmação do envio à estação móvel.
o Encaminha a mensagem de confirmação (AckData_Mss_Mh) para o Mh remetente.
o Remove a mensagem da lista de pendentes de confirmação
Recebendo Data_Mh_Mss:
Esta é a mensagem de dados enviada pela estação móvel ao seu MSS primário. Deve-se, então, armazená-la em buffer local, verificar se há a necessidade de atualização da informação de estado e, caso positivo, enviar cópias para os MSS secundários do remetente.
o Armazena a mensagem de dados na lista de mensagens pendentes de confirmação. o Se a mensagem de dados demanda uma atualização na informação de estado da
estação móvel...
Para todo MSS secundário da estação móvel remetente...
• Envia mensagem de cópia da mensagem de dados (Copy).
• Coloque o endereço do MSS secundário como pendente de confirmação.
o Senão demanda atualização...
Envia a mensagem de dados (Data_Mss) ao MSS primário do destino.
Recebendo AckData_Mh_Mss:
Esta é a confirmação do recebimento da mensagem de dados por parte da estação móvel destino para seu MSS primário. O MSS pode, assim, encaminhar a confirmação ao MSS primário da origem.
Recebendo StateInfo:
StateInfo é a informação completa do estado enviada por um MSS primário a um outro MSS que anteriormente não fazia parte da lista de MSS secundários e, portanto, não possuía informações sobre o estado do Mh em questão.
o Armazena o estado do Mh correspondente na lista de estados para os quais o MSS é secundário.
o Envia confirmação da atualização do estado ao MSS de origem.
Recebendo AckStateInfo:
Esta é a confirmação do recebimento de uma mensagem de informação do estado. Como não foi implementada uma lista de destinatários de StateInfo pendentes de confirmação, não há o que ser feito no recebimento deste Ack.
Recebendo DeleteStateInfo:
Esta mensagem sinaliza a necessidade de remoção de qualquer informação de estado que o MSS possua sobre um certo Mh, dado que ele não mais pertence à lista de MSS secundários (ou primário) do Mh.
o Remove a informação de estado do Mh especificado das listas de estado.
Recebendo Greet:
Esta é a mensagem de chegada de uma nova estação móvel à área de abrangência do MSS, que, por sua vez, deve se tornar MSS primário do Mh deslocado. Provavelmente, o MSS possuirá a informação de estado do Mh, devendo atualizar a lista de MSS’s secundários e dar as boas vindas ao Mh.
o Se o MSS possui informação de estado do Mh que migrou na lista de estados de Mh’s para os quais o MSS é secundário...
Transfere o estado da lista de MSS secundário para a lista de MSS primário.
o Caso contrário, atribuiremos valor nulo ao estado (poderíamos requisitar StateInfo de alguém, mas sendo a lista de secundários baseada na vizinhança, isto realmente não acontecerá).
o Para cada MSS na antiga lista de MSS secundários de Mh...
Envia mensagem DeleteStateInfo para remoção do estado em tal MSS Remove o MSS da lista de secundários.
o Coloca o MSS como primário do Mh que migrou. o Para cada célula vizinha à célula do MSS...
Envia mensagem StateInfo para o MSS responsável pela célula, para atualização do estado nos novos MSS secundários.
Insere o MSS responsável pela célula na lista de MSS secundários.
Recebendo FailNow:
Esta mensagem provoca a falha imediata do MSS. Todos os MSS vizinhos e Mh’s sob sua responsabilidade devem ser notificados desse evento.
o Para cada célula vizinha ao MSS...
Envia mensagem de notificação de falha para o MSS responsável pela célula (MSSFail_Mss)
o Para cada Mh sob responsabilidade do MSS...
Envia mensagem de notificação de falha (MSSFail_Mh) o Entra em estado inoperante.
Recebendo MssFail_Mss:
Esta mensagem notifica o MSS sobre a falha de um outro MSS vizinho. O MSS deve anular as entradas que apontam para o MSS inoperante. Se tal remoção esvazia a lista de confirmações pendentes para Copy, o MSS pode enviar a mensagem de dados correspondente para o MSS primário do destino.
o Para cada mensagem Copy pendente de confirmação...
Tenta remover o MSS que falhou da lista de destinos pendentes de confirmação.
Se a lista de destinos de Copy ficar vazia...
• Remove a mensagem da lista de pendentes de confirmação de Copy • Envia a mensagem de dados ao MSS primário do Mh receptor. 3.2 Estruturas de Dados
Ao longo da descrição das ações tomadas por Mh’s e MSS’s, foram citadas várias estruturas de dados que armazenam informações essenciais para o funcionamento do protocolo. Por serem um pouco complexas, é interessante uma descrição, mesmo que sucinta, sobre cada uma delas.
Estruturas presentes nos MSS’s:
Lista de MSS’s primários: É uma estrutura que associa o endereço de uma estação móvel com o endereço de seu MSS primário. Essa lista é global, única para toda a rede, implementada como atributo estático.
Lista de MSS’s secundários: Associa o endereço de uma estação móvel a uma lista de endereços contendo seus MSS secundários. Também é global e única.
Endereço de Mh Endereço de MSS Primário pri_mss
Endereço de Mh
sec_mss
Lista de mensagens de dados pendentes de confirmação: Associa identificadores a mensagens de dados que precisam ter suas confirmações recebidas pelo MSS. Portanto, cada MSS possui uma lista como esta.
Lista de informações de estado de Mh’s para os quais o MSS é primário: Associa o endereço de Mh’s às suas respectivas informações de estado, para os Mh’s que possuem o MSS como primário. Por isso, cada MSS possui sua lista.
Lista de informações de estado de Mh’s para os quais o MSS é secundário: Associa o endereço de Mh’s às suas respectivas informações de estado, para os Mh’s que possuem o MSS como secundário. Por isso, cada MSS possui sua lista.
Lista de destinos de mensagem Copy, pendentes de confirmação: Associa um identificador de mensagem Copy a uma lista de endereços dos MSS’s que estão para retornar a confirmação de recebimento da mensagem. Cada MSS possui sua lista de destinos pendentes.
Estruturas presentes nos Mh’s:
Lista de mensagens de dados pendentes de confirmação: Associa identificadores a mensagens de dados que precisam ter suas confirmações recebidas pelo Mh. Portanto, cada Mh possui uma lista como esta.
Flag para sinalização de falha do MSS primário: Sinaliza que o Mh foi desconectado do MSS primário por motivo de falha deste. Se essa flag estiver levantada no momento de uma migração, o Mh fica obrigado a reenviar as mensagens pendentes de confirmação. A flag está presente em cada elemento Mh da rede.
4
Simulações determinísticas
As simulações determinísticas foram elaboradas para a verificação do funcionamento do protocolo em momentos de operação normal (sem falhas), com e sem mobilidade das estações e em situações de falha de MSS’s. O script abaixo ilustra tais situações.
Identificador Msg Mensagem de dados dataMsgList
Endereço de Mh Informação de Estado Pri_StateInfo
Endereço de Mh Informação de Estado Sec_StateInfo
Identificador Msg
copyDestList
Endereços de MSS pendentes
public void script() {
acceptTurnOn(mh1, true); acceptTurnOn(mh2, true); ...
changeShowMode(mh1, SHOW, DetermElement.EVENT_MESSAGE_RECEIVING); ...
changeShowMode(mssA, SHOW, DetermElement.EVENT_MESSAGE_RECEIVING); ... next(SHOW, 0); mh1.moveTo(cellB); next(SHOW, 0); next(SHOW, 0); mh2.moveTo(cellB); next(SHOW, 0); next(SHOW, 0); mh3.moveTo(cellC); next(SHOW, 0); next(SHOW, 0); mh4.moveTo(cellD); next(SHOW, 0); next(SHOW, 0); mh1.moveTo(cellA); mh1.receive(new Data_App(mh1.getWlAddress(),mh2.getWlAddress(), "1","stinfo0000@N#&(!*",true)); next(SHOW, 0); next(SHOW, 0); mh2.moveTo(cellA); next(SHOW, 0); next(SHOW, 0); mh1.receive(new Data_App(mh1.getWlAddress(),mh2.getWlAddress(), "2","stinfo0001slkj82)",true)); next(SHOW, 0); next(SHOW, 0); mssA.receive(new FailNow()); mh1.receive(new Data_App(mh1.getWlAddress(),mh4.getWlAddress(), "3","stinfo0002iflepw)",true)); mh1.receive(new Data_App(mh1.getWlAddress(),mh4.getWlAddress(), "4","stinfo0003pqoisl)",true)); mh1.receive(new Data_App(mh1.getWlAddress(),mh4.getWlAddress(), "5","pqowid)",false)); next(SHOW, 0); mh1.moveTo(cellB); next(SHOW, 0); next(SHOW, 0); }
O script acima, conforme apresentado ao professor, gera resultados tais como o descrito a seguir:
==========MyApp Begin==========
MOBX SIMULATION>> ******* STEP FINISHED! ******* MOBX>> Mh <Mh1> is moving to Cell[MssB]
MOBX>> Element <MssB> receive message <class mobics.ppi.message.Greet> from host <Mh1> [PRFT Mss] Greet = Mh1
MOBX>> Element <MssA> receive message <class .StateInfo> from host <MssB> MOBX>> Element <MssD> receive message <class .StateInfo> from host <MssB> [PRFT Mss] StateInfo = #1076500953296
MOBX>> Element <MssB> receive message <class .AckStateInfo> from host <MssA> [PRFT Mss] StateInfo = #1076500953296
MOBX>> Element <MssB> receive message <class .AckStateInfo> from host <MssD> MOBX>> Element <Mh1> receive message <class .Welcome> from host <MssB> [PRFT Mss] AckStateInfo = #1076500953296 Sec_Mss MssA adicionado para Mh1 [PRFT Mss] AckStateInfo = #1076500953296 Sec_Mss MssD adicionado para Mh1 [PRFT Mh] Welcome from MssB
MOBX>> Mh <Mh2> is moving to Cell[MssB]
MOBX>> Element <MssB> receive message <class mobics.ppi.message.Greet> from host <Mh2> [PRFT Mss] Greet = Mh2
MOBX>> Element <MssA> receive message <class .StateInfo> from host <MssB> MOBX>> Element <MssD> receive message <class .StateInfo> from host <MssB> [PRFT Mss] StateInfo = #1076500953312
MOBX>> Element <Mh2> receive message <class .Welcome> from host <MssB> [PRFT Mh] Welcome from MssB
MOBX>> Element <MssB> receive message <class .AckStateInfo> from host <MssA> [PRFT Mss] StateInfo = #1076500953312
MOBX>> Element <MssB> receive message <class .AckStateInfo> from host <MssD> [PRFT Mss] AckStateInfo = #1076500953312 Sec_Mss MssA adicionado para Mh2 [PRFT Mss] AckStateInfo = #1076500953312 Sec_Mss MssD adicionado para Mh2 MOBX SIMULATION>> ******* STEP FINISHED! *******
MOBX SIMULATION>> ******* STEP FINISHED! ******* MOBX>> Mh <Mh3> is moving to Cell[MssC]
MOBX>> Element <MssC> receive message <class mobics.ppi.message.Greet> from host <Mh3> [PRFT Mss] Greet = Mh3
MOBX>> Element <MssA> receive message <class .StateInfo> from host <MssC> MOBX>> Element <MssD> receive message <class .StateInfo> from host <MssC> MOBX>> Element <Mh3> receive message <class .Welcome> from host <MssC> [PRFT Mss] StateInfo = #1076500953343
MOBX>> Element <MssC> receive message <class .AckStateInfo> from host <MssD> [PRFT Mss] StateInfo = #1076500953343
MOBX>> Element <MssC> receive message <class .AckStateInfo> from host <MssA> [PRFT Mss] AckStateInfo = #1076500953343 Sec_Mss MssD adicionado para Mh3 [PRFT Mss] AckStateInfo = #1076500953343 Sec_Mss MssA adicionado para Mh3 [PRFT Mh] Welcome from MssC
MOBX SIMULATION>> ******* STEP FINISHED! ******* MOBX SIMULATION>> ******* STEP FINISHED! ******* MOBX>> Mh <Mh4> is moving to Cell[MssD]
MOBX>> Element <MssD> receive message <class mobics.ppi.message.Greet> from host <Mh4> [PRFT Mss] Greet = Mh4
MOBX>> Element <MssB> receive message <class .StateInfo> from host <MssD> MOBX>> Element <MssC> receive message <class .StateInfo> from host <MssD> MOBX>> Element <Mh4> receive message <class .Welcome> from host <MssD> [PRFT Mss] StateInfo = #1076500953359
MOBX>> Element <MssD> receive message <class .AckStateInfo> from host <MssB> [PRFT Mss] StateInfo = #1076500953359
MOBX>> Element <MssD> receive message <class .AckStateInfo> from host <MssC> [PRFT Mh] Welcome from MssD
[PRFT Mss] AckStateInfo = #1076500953359 Sec_Mss MssB adicionado para Mh4 [PRFT Mss] AckStateInfo = #1076500953359 Sec_Mss MssC adicionado para Mh4 MOBX SIMULATION>> ******* STEP FINISHED! *******
MOBX SIMULATION>> ******* STEP FINISHED! ******* MOBX>> Mh <Mh1> is moving to Cell[MssA]
MOBX>> Element <MssA> receive message <class mobics.ppi.message.Greet> from host <Mh1> MOBX>> Element <Mh1> receive message <class .Data_App> from host <Null Address> [PRFT Mh] Data_App = 1
MOBX>> Element <MssA> receive message <class .Data_Mh_Mss> from host <Mh1> [PRFT Mss] Greet = Mh1
MOBX>> Element <MssA> receive message <class .DeleteStateInfo> from host <MssA> MOBX>> Element <MssD> receive message <class .DeleteStateInfo> from host <MssA> MOBX>> Element <MssB> receive message <class .StateInfo> from host <MssA> MOBX>> Element <MssC> receive message <class .StateInfo> from host <MssA> MOBX>> Element <Mh1> receive message <class .Welcome> from host <MssA> [PRFT Mss] Data_Mh_Mss = 1
MOBX>> Element <MssB> receive message <class .Copy> from host <MssA> MOBX>> Element <MssC> receive message <class .Copy> from host <MssA> [PRFT Mss] DeleteStateInfo = #1076500953390
[PRFT Mss] DeleteStateInfo = #1076500953390 [PRFT Mss] StateInfo = #1076500953390
MOBX>> Element <MssA> receive message <class .AckStateInfo> from host <MssB> [PRFT Mss] Copy = 1 - stinfo0000
MOBX>> Element <MssA> receive message <class .AckCopy> from host <MssB> [PRFT Mss] StateInfo = #1076500953390
MOBX>> Element <MssA> receive message <class .AckStateInfo> from host <MssC> [PRFT Mss] Copy = 1 - stinfo0000
MOBX>> Element <MssA> receive message <class .AckCopy> from host <MssC> [PRFT Mss] AckStateInfo = #1076500953390 Sec_Mss MssB adicionado para Mh1 [PRFT Mss] AckStateInfo = #1076500953390 Sec_Mss MssC adicionado para Mh1 [PRFT Mss] AckCopy = 1 - MssB
[PRFT Mss] AckCopy = 1 - MssC
MOBX>> Element <MssB> receive message <class .Data_Mss> from host <MssA> [PRFT Mss] Data_Mss = 1 - MssA
[PRFT Mh] Data_Mss_Mh = 1
MOBX>> Element <MssB> receive message <class .AckData_Mh_Mss> from host <Mh2> [PRFT Mss] AckData_Mh_Mss = 1
MOBX>> Element <MssA> receive message <class .AckData_Mss> from host <MssB> [PRFT Mss] AckData_Mss = 1
MOBX>> Element <Mh1> receive message <class .AckData_Mss_Mh> from host <MssA> [PRFT Mh] AckData_Mss_Mh = 1
MOBX SIMULATION>> ******* STEP FINISHED! ******* MOBX SIMULATION>> ******* STEP FINISHED! ******* MOBX>> Mh <Mh2> is moving to Cell[MssA]
MOBX>> Element <MssA> receive message <class mobics.ppi.message.Greet> from host <Mh2> [PRFT Mss] Greet = Mh2
MOBX>> Element <MssA> receive message <class .DeleteStateInfo> from host <MssA> MOBX>> Element <MssD> receive message <class .DeleteStateInfo> from host <MssA> MOBX>> Element <MssB> receive message <class .StateInfo> from host <MssA> MOBX>> Element <MssC> receive message <class .StateInfo> from host <MssA> MOBX>> Element <Mh2> receive message <class .Welcome> from host <MssA> [PRFT Mss] DeleteStateInfo = #1076500953421
[PRFT Mss] DeleteStateInfo = #1076500953421 [PRFT Mh] Welcome from MssA
[PRFT Mss] StateInfo = #1076500953421
MOBX>> Element <MssA> receive message <class .AckStateInfo> from host <MssC> [PRFT Mss] StateInfo = #1076500953421
MOBX>> Element <MssA> receive message <class .AckStateInfo> from host <MssB> [PRFT Mss] AckStateInfo = #1076500953421 Sec_Mss MssC adicionado para Mh2 [PRFT Mss] AckStateInfo = #1076500953421 Sec_Mss MssB adicionado para Mh2 MOBX SIMULATION>> ******* STEP FINISHED! *******
MOBX>> Element <Mh1> receive message <class .Data_App> from host <Null Address> [PRFT Mh] Data_App = 2
MOBX>> Element <MssA> receive message <class .Data_Mh_Mss> from host <Mh1> [PRFT Mss] Data_Mh_Mss = 2
MOBX>> Element <MssB> receive message <class .Copy> from host <MssA> MOBX>> Element <MssC> receive message <class .Copy> from host <MssA> [PRFT Mss] Copy = 2 - stinfo0001
MOBX>> Element <MssA> receive message <class .AckCopy> from host <MssB> [PRFT Mss] Copy = 2 - stinfo0001
MOBX>> Element <MssA> receive message <class .AckCopy> from host <MssC> [PRFT Mss] AckCopy = 2 - MssB
[PRFT Mss] AckCopy = 2 - MssC
MOBX>> Element <MssA> receive message <class .Data_Mss> from host <MssA> [PRFT Mss] Data_Mss = 2 - MssA
MOBX>> Element <Mh2> receive message <class .Data_Mss_Mh> from host <MssA> [PRFT Mh] Data_Mss_Mh = 2
MOBX>> Element <MssA> receive message <class .AckData_Mh_Mss> from host <Mh2> [PRFT Mss] AckData_Mh_Mss = 2
MOBX>> Element <MssA> receive message <class .AckData_Mss> from host <MssA> [PRFT Mss] AckData_Mss = 2
MOBX>> Element <Mh1> receive message <class .AckData_Mss_Mh> from host <MssA> [PRFT Mh] AckData_Mss_Mh = 2
MOBX SIMULATION>> ******* STEP FINISHED! ******* MOBX SIMULATION>> ******* STEP FINISHED! *******
MOBX>> Element <Mh1> receive message <class .Data_App> from host <Null Address> MOBX>> Element <MssA> receive message <class .FailNow> from host <Null Address> MOBX>> Element <Mh1> receive message <class .Data_App> from host <Null Address> MOBX>> Element <Mh1> receive message <class .Data_App> from host <Null Address> [PRFT Mss] FailNow = MssA
MOBX>> Element <MssB> receive message <class .MssFail_Mss> from host <MssA> MOBX>> Element <MssC> receive message <class .MssFail_Mss> from host <MssA> MOBX>> Element <Mh2> receive message <class .MssFail_Mh> from host <MssA> [PRFT Mh] Data_App = 3
MOBX>> Element <MssA> receive message <class .Data_Mh_Mss> from host <Mh1> [PRFT Mh] Data_App = 4
MOBX>> Element <MssA> receive message <class .Data_Mh_Mss> from host <Mh1> [PRFT Mh] Data_App = 5
MOBX>> Element <MssA> receive message <class .Data_Mh_Mss> from host <Mh1> [PRFT Mss] MssFail_Mss = MssA
MOBX>> Element <Mh1> receive message <class .MssFail_Mh> from host <MssA> [PRFT Mss] MssFail_Mss = MssA
[PRFT Mh] MssFail_Mh = MssA [PRFT Mh] MssFail_Mh = MssA
MOBX SIMULATION>> ******* STEP FINISHED! ******* MOBX>> Mh <Mh1> is moving to Cell[MssB]
MOBX>> Element <MssB> receive message <class mobics.ppi.message.Greet> from host <Mh1> [PRFT Mss] Greet = Mh1
[PRFT Mss] StateInfo = #1076500953500
MOBX>> Element <MssB> receive message <class .AckStateInfo> from host <MssD> MOBX>> Element <Mh1> receive message <class .Welcome> from host <MssB> [PRFT Mh] Welcome from MssB
MOBX>> Element <MssB> receive message <class .Data_Mh_Mss> from host <Mh1> MOBX>> Element <MssB> receive message <class .Data_Mh_Mss> from host <Mh1> MOBX>> Element <MssB> receive message <class .Data_Mh_Mss> from host <Mh1> [PRFT Mss] DeleteStateInfo = #1076500953500
[PRFT Mss] Data_Mh_Mss = 5
MOBX>> Element <MssD> receive message <class .Data_Mss> from host <MssB> [PRFT Mss] Data_Mh_Mss = 3
MOBX>> Element <MssD> receive message <class .Copy> from host <MssB> [PRFT Mss] AckStateInfo = #1076500953500 Sec_Mss MssD adicionado para Mh1 [PRFT Mss] Data_Mh_Mss = 4
MOBX>> Element <MssD> receive message <class .Copy> from host <MssB> [PRFT Mss] DeleteStateInfo = #1076500953500
[PRFT Mss] Data_Mss = 5 - MssB
MOBX>> Element <Mh4> receive message <class .Data_Mss_Mh> from host <MssD> [PRFT Mss] Copy = 3 - stinfo0002
MOBX>> Element <MssB> receive message <class .AckCopy> from host <MssD> [PRFT Mss] Copy = 4 - stinfo0003
MOBX>> Element <MssB> receive message <class .AckCopy> from host <MssD> [PRFT Mh] Data_Mss_Mh = 5
MOBX>> Element <MssD> receive message <class .AckData_Mh_Mss> from host <Mh4> [PRFT Mss] AckCopy = 3 - MssD
MOBX>> Element <MssD> receive message <class .Data_Mss> from host <MssB> [PRFT Mss] AckCopy = 4 - MssD
MOBX>> Element <MssD> receive message <class .Data_Mss> from host <MssB> [PRFT Mss] AckData_Mh_Mss = 5
MOBX>> Element <MssB> receive message <class .AckData_Mss> from host <MssD> [PRFT Mss] Data_Mss = 3 - MssB
[PRFT Mss] AckData_Mss = 5
MOBX>> Element <Mh1> receive message <class .AckData_Mss_Mh> from host <MssB> [PRFT Mh] AckData_Mss_Mh = 5
MOBX>> Element <Mh4> receive message <class .Data_Mss_Mh> from host <MssD> [PRFT Mss] Data_Mss = 4 - MssB
MOBX>> Element <Mh4> receive message <class .Data_Mss_Mh> from host <MssD> [PRFT Mh] Data_Mss_Mh = 3
MOBX>> Element <MssD> receive message <class .AckData_Mh_Mss> from host <Mh4> [PRFT Mh] Data_Mss_Mh = 4
MOBX>> Element <MssD> receive message <class .AckData_Mh_Mss> from host <Mh4> [PRFT Mss] AckData_Mh_Mss = 3
MOBX>> Element <MssB> receive message <class .AckData_Mss> from host <MssD> [PRFT Mss] AckData_Mss = 3
MOBX>> Element <Mh1> receive message <class .AckData_Mss_Mh> from host <MssB> [PRFT Mss] AckData_Mh_Mss = 4
MOBX>> Element <MssB> receive message <class .AckData_Mss> from host <MssD> [PRFT Mh] AckData_Mss_Mh = 3
[PRFT Mss] AckData_Mss = 4
MOBX>> Element <Mh1> receive message <class .AckData_Mss_Mh> from host <MssB> [PRFT Mh] AckData_Mss_Mh = 4
MOBX SIMULATION>> ******* STEP FINISHED! ******* ===========MyApp End===========
O bom funcionamento pode ser observado no momento da migração, quando os MSS secundários (MSS vizinhos) devem receber as informações de estado da estação móvel. Isso fica explícito nas linhas de recebimento de Greet (migração) que são em breve seguidas por mensagens StateInfo (informação do estado). As mensagens Welcome também foram geradas com sucesso.
No envio de mensagens de dados, foi verificado o envio das mensagens Copy caso a mensagem original demande a atualização do estado do Mh nos MSS’s. As confirmações também foram recebidas corretamente.
mensagens StateInfo para os MSS secundários atuais. Após esse tratamento, as mensagens de dados enviadas pela estação móvel foram corretamente entregues, acompanhadas de mensagens Copy quando necessárias.
5
Simulações Estocásticas
A análise das simulações estocásticas visou apresentar o desempenho do protocolo de tolerância a falhas em MSS através do acompanhamento (i) do overhead de mensagens de replicação frente à mobilidade, (ii) do número de mensagens de dados retransmitidas frente à mobilidade e (iii) do número de retransmissões devido à presença de falhas em MSS’s.
5.1 Mensagens de Replicação x Mobilidade
A comparação entre número de mensagens de replicação e probabilidade de migração é útil para observarmos o overhead inserido pelo algortimo conforme o comportamento das unidades móveis. Mensagens de replicação são as mensagens responsáveis pela manutenção do estado do Mh nos MSS secundários, o que inclui mensagens Copy, StateInfo e DeleteStateInfo. Para a exposição da Figura 5.1 não foram consideradas as mensagens de reconhecimento (Acks) e a rede simulada possui 120 Mh’s e 75 MSS’s.
Mensagens Replicação x Mobilidade
em simulações com 10000 mensagens de dados
20000 21000 22000 23000 24000 25000 26000 0,1 0,15 0,2 0,25 0,3 0,35 0,4 0,45 0,5 Mobilidade M en sag en s d e r ep lica çã o
Figura 5.1 Mensagens de Replicação x Mobilidade
DeleteStateInfo e StateInfo são trocadas entre os MSS’s. Pode-se concluir que o overhead é sempre maior que N vezes o número de mensagens de dados com atualização de estado.
5.2 Mensagens de Dados Retransmitidas x Mobilidade
Observar o número de mensagens retransmitidas conforme varia a migração das unidades móveis e torna interessante já que o protocolo implementa a função de encaminhamento de pacotes. Nota-se que a mobilidade pode levar à necessidade de retransmissão devido à ausência das unidades móveis transmissoras ou receptoras no momento da recepção de reconhecimentos e dos próprios dados, respectivamente. Nem todas as mensagens a serem retransmitidas realmente não chegaram a seu destino. Na mesma simulação utilizada no item anterior, obteve-se o gráfico da Figura 5.2. A taxa de mensagens retransmitidas é calculada através da divisão entre o número de mensagens efetivamente entregues (com reconhecimento) e o número de mensagens enviadas pelos MSS’s primários (Data_Mss).
Mensagens retransmmitidas x Mobilidade
em simulações com 10000 mensagens de dados
10,00% 15,00% 20,00% 25,00% 30,00% 35,00% 40,00% 45,00% 0,1 0,15 0,2 0,25 0,3 0,35 0,4 0,45 0,5 Mobilidade P er cen ta g em R et ran sm it id a
Figura 5.2 – Mensagens de dados retransmitidas x Mobilidade
Analisando o gráfico, nota-se um grande crescimento de mensagens retransmitidas até a taxa de mobilidade de 20%. A partir dos 25% de probabilidade de migração, a taxa de mensagens retransmitidas aumenta suavemente e tende a estabilizar em torno dos 42%.
5.3 Mensagens Retransmitidas x Presença de Falhas
probabilidade de migração nula (para isolarmos a análise), e os mesmo 75 MSS’s. Foi gerada a presença de erros em 3 a 11 MSS’s, ou seja, probabilidade de falha entre 4 e 14%.
Taxa de Retransmissão x Falhas
0,00% 2,00% 4,00% 6,00% 8,00% 10,00% 12,00% 14,00% 3 4 5 6 7 8 9 10 Número de Falhas Taxa de retransmissão
Figura 5.3 – Mensagens de dados retransmitidas x Falhas