Resumo:

O desenvolvimento de protocolos é uma tarefa não trivial que demanda muito tempo e esforço. Remover erros de um protocolo pode ser uma tarefa muito laboriosa e que pode resultar no seu abandono ou em uma . Ferramentas que facilitem a criação e depuração seriam bastante úteis.

As ferramentas existentes não são completas o suficiente para descrever protocolos complexos que podem utilizar TCP e UDP e ajudam muito pouco a criar um produto próximo do que foi projetado inicialmente, principalmente pelo fato de suas linguagens de descrição serem muito abstratas.

Para obter uma ajuda realmente significativa e gerar um código bem próximo do produto final, seria necessária uma ferramente que dispusesse de suporte a geração de protocolos em TCP, que forneça suporte a implementações mais complexas (tais como um servidor web multi-threaded), possuisse uma integração maior com as linguagens alvo, um esquema de definição de mensagens simples porém eficaz e se possível uma certa independência de plataforma.

De acordo com estas necessidades foi criado o protomake, que tenta satisfazer a todas estas premissas e pode gerar codigo em C e Java. Ele também possui a vantagem de gerar um plugin que descreve as mensagens do seu protocolo para a ferramenta Ethereal, um sniffer muito utilizado como debuger de protocolos. Desta forma ele pode ser amplamente utilizado para desenvolver e depurar protocolos de forma fácil e rápida.

Introdução

Trablhos realcionados:

APC

O protomake foi inicialmente uma extensão do APC. Este compilador utiliza uma	linguagem chamada APT, que é baseada em AP, para estruturar o protocol. É baseado em	eventos de recepção e timeout que desencandeiam uma sequência de ações e estados que serão	acionados. O seu foco principal é gerar um protocolo com algumas garantias (como...).

Os protocolos gerados são de aplicação sobre a o protocolo de transporte UDP.	Atualmente na versão 0.5, é o único que gera uma aplicação efetivamente entre os citados.	Segundo seu autor, não existe a intenção de fazer uma versão para TCP.

Estelle

Promela++

Prolac

É uma linguagem orientada a objetos criada para desenvolver protocolos de rede. A	linguagem é simples o suficiente para escrever protocolos complexos. O objetivo da linguagem	é facilitar o desenvolvimento de protocolos sem um compromisso com a corretude dele,	deixando isso a cargo do desenvolvedor. O protocolo TCP foi implementado como exemplo de	utilzação da linguagem

Funcionalidades

Definição de protocolos

A linguagem possui três seções de definição dadas por cabeçalho, mensagens e	processos. No cabeçalho ficam as definições que são usadas para gerar o plugin para o ethereal	(opcional). As mensagens são definidas na seção seguinte, da seguinte forma:

!@Author "Igor Chaves Cananea"

!@Email "icc@cin.ufpe.br"

!@Name "ProtoMake Temporary Test Protocol"

!@Abbrev "PTTP"

!@Port 9986

!@Transport tcp

message one

begin

flags : 3 bits,

length : 8 bits,

msg : length bytes,

command : 4 bytes

end

Os cabeçalhos começam com o símbol !@, seguidos de uma palavra chave e uma string	ou número. As possíveis palavras chaves são Author, Email, Name, Abbrev, Port e Transport.	Com exceção de Port (que ser um inteiro) e de Transport (que deve ser tcp ou udp), todas as	palavras chaves devem ser seguidas por uma string. Se não existerem cabeçalhos, o plugin não é	gerado.

As mensagens são definidas utilizando a palavra-chave message seguida pelo nome da mensagem. Logo após seguem os campos da mensagem agrupados num bloco begin / end. Os tipos de campos possíveis são bits e bytes que devem ser antecedidos pela quantidade respectiva de bits ou bytes. Poderá ser utilizado como quantificador também o nome de um campo previamente descrito, neste caso, o valor do campo vai ser utilizado como número.

Para utilizar código externo na definição do protocolo, construções do tipo behaviors	podem ser criadas. Eles serão uma ponte entre o código '.pm' e o código alvo.

Os processos descrevem o protocolo e devem ser definidos logo após as mensagens.	Deve ser definido no mínimo um processo chamado main. A seguir, um exemplo:

behavior Command

process main

var client: address

var a : integer

begin

rcv one from client -> Command.procces(one.command);

one.msg = "Ok!";

one.length = 3;

send one to client

end

O process main é responsável pelo loop principal do protocolo e pode ser definido como um bloco begin / end precedido de declarações de variáveis. As variáveis podem ser dos tipos integer, range (Intervalo entre numeros), address (endereço para envio e recepção de mensagens) e array, que por sua vez pode ter elementos dos tipos listados anteriormente.

O corpo do process é formado por ações que serão executadas caso suas guardas sejam satisfeitas. As guardas consistem em expressoes booleanas ou guardas timeout ou ainda guardas rcv.

As guardas timeout são ativadas toda vez que um comando act é executado.

As guardas rcv são ativadas quando uma mensagem (do tipo descrito na guarda) chega.

Os comandos permitidos na ação podem executar atribuições, diretivas send, behaviors, if (teste de expressão booleana), do (laço de repetição) e expressões aritméticas simples.

Geração de código

Ao compilar a especificação, o codígo poderá ser gerado em Java ou em C. O código gerado inclui a estrutura da mensagem e funções para codificar e decodificar a mensagem. É gerado também o plugin, caso seus dados tenham sido preenchidos no cabeçalho do arquivo.

Motor do protocolo

Plugin para o ethereal

O ethereal é um sniffer muito usado para monitorar pacotes que estão trafegando pela rede. Ele permite uma visualização detalhada do pacote com descrições de seu campos através de plugins de dissecação. O protomake pode gerar uma plugin para o protocolo especificado. Este plugin é simples porém útil o suficiente para visualizar as mensagens geradas pelo protocolo.

Exemplos

Conclusão

2004-01-14T09:31:06