PTC29008: Apresentação

De MediaWiki do Campus São José
Revisão de 15h42min de 12 de fevereiro de 2019 por Iago.ss (discussão | contribs) (→‎Protocolos reais)
Ir para navegação Ir para pesquisar

Próxima aula



  • Caracterização de protocolos por meio de um exemplo: sintaxe, comportamento, temporização, semântica. Princípios de projeto e propriedades desejáveis de protocolos. Análise de um protocolo real.


  • Projeto 1: um protocolo de comunicação
  • Projeto 2: um protocolo de aplicação
  • Projeto 3: verificação formal do protocolo de comunicação

Um protocolo é uma parte muito importante de um sistema de comunicação. A comunicação de dados pode ser entendida como troca de informação entre dois dispositivos através de algum meio de comunicação. A comunicação ocorre no âmbito de um sistema de telecomunicações, composto por equipamentos (hardware) e programas (softwares). Um sistema básico de comunicação de dados se constitui de cinco componentes:


Rede-intro-1.png


  1. A mensagem: a informação a ser transmitida. O conteúdo da mensagem, seja um texto, música, video, ou qualquer outro tipo de informação, é representada por conjuntos de bits (dígitos binários).
  2. Transmissor: dispositivo que transmite a mensagem.
  3. Receptor: dispositivo que recebe a mensagem.
  4. Meio de comunicação: caminho físico por onde viaja a mensagem do transmissor até o receptor.
  5. Protocolo: conjunto de regras que governa a comunicação de dados.


Os sistemas de comunicação reais, incluídas as redes de computadores, são bem mais complexos do que esse modelo simplificado. No entanto, todos podem ser entendidos, em alguma medida, a partir desse modelo. Nesta disciplina estudam-se princípios e técnicas para projeto de protocolos, incluindo formas de verificar a consistência e correção de seu funcionamento.


Serviço e Protocolo

Um sistema de comunicação provê serviços para as aplicações ou usuários realizarem ações que envolvam a comunicação entre sistemas através de uma rede. Por exemplo, existem serviços para transferência de arquivos, reprodução remota de videos e músicas, execução remota de programas, pesquisa por informação, e muitos outros. O conceito de serviço está relacionado ao de protocolo. Um serviço é provido por entidades que interagem de acordo com um protocolo. Assim, um serviço é um dos elementos envolvidos na especificação de um protocolo. As figuras a seguir mostram a relação entre esses conceitos, primeiro apresentando somente a visão de um serviço para um usuário, e, em seguida, a relação entre serviço e protocolo.

PTC-Servico1.png
Um serviço visto por um usuário


PTC-Protocolo1.png
O serviço provido pelo protocolo

Protocolos reais

Que protocolos existentes despertam suas curiosidades sobre os detalhes de seus projetos ? Identifiquem alguns protocolos, e anotem suas finalidades e características.

Protocolo Finalidade Características
NTP Sincronizar os relógios dos computadores ligados a rede. Utiliza uma versão do algoritmo de Marzullo para determinar o tempo dos servidores corrigindo os efeitos da variação da latência da rede. Utiliza uma hierarquia mestre-escravo onde o servidor envia o horário UTC aos equipamentos da rede, enviando as informações por UDP.
FTP Transferência de arquivos entre máquinas em uma rede TCP/IP Utiliza um modelo cliente-servidor para a transferência de arquivos em ambas as direções (download e upload) de maneira eficaz. Estabelece duas conexões TCP paralelas: uma para controle (persistente) e outra para dados (não-persistente). Caracteriza-se por ser um protocolo de padrão aberto.
SIP Iniciar, modificar ou terminar sessões ou chamadas multimídias entre usuários. É um protocolo da camada de sessão do modelo OSI que utiliza um modelo requisição-resposta que é capaz de estabelecer, mudar e terminar sessões de comunicação de um ou mais usuários em uma rede via Protocolo IP, sendo totalmente independente do conteúdo de dados da chamada, tendo 5060 como porta de serviço para as trocas de informações entre "cliente-servidor".
SNMP Protocolo que possibilita a troca de informações entre os dispositivos na rede, a fim de permitir o monitoramento desses componentes por um sistema de gerenciamento. O protocolo é composto por agentes instalados nos dispositivos finais e que são responsáveis por gerar alarmes, coletar informações e responder solicitações do sistema de gerenciamento. Uma mensagem SNMP é codificada com um padrão designado de ASN.1 e as versões recentes do protocolo (v2 e v3) implementam melhorias na segurança das informações trafegadas.
MQTT Transferência de mensagens para redes TCP/IP. Utiliza o paradigma publish/subscribe. É composto por duas entidades, um broker e diversos clientes. O broker é um servidor que recebe mensagens dos clientes. Os clientes assinam um tópico de mensagens no broker e publicam no mesmo. Desenvolvido para baixo consumo de banda de rede e hardware extremamente simples e leve.
SMTP Protocolo para envios de emails pela Internet. O SMTP é o protocolo padrão para envio de emails pela Internet, através de uma conexão confiável (TCP). Utiliza as portas 587 ou 465 para enviar emails para um servidor de email. O SMTP não permite fazer a leitura de emails recebidos.
TR069 Gerenciamento e configuração remota O TR-069 é uma técnica do Broadband Forum que define um protocolo de camada de aplicação para gerenciamento remoto de equipamento nas instalações do cliente (CPE) conectado a uma rede IP (Internet Protocol).
RTP Sua função é transmitir dados de aúdio e vídeo na rede IP. O RTP é um protocolo da camada de transporte que utiliza o UDP para envio de dados em comunicações em tempo real, muito comum em VoIP. Se utiliza do protocolo RTCP para o controle de fluxo com o objetivo de diminuir as perdas de pacotes.
MPCP Utilizado para controlar a rede EPON. O MPCP é definido na camada MAC e permite controlar a largura de banda de cada usuário, auto-discovery e ranging. Utiliza quadros Ethernet padão, o Optical Line Terminal (OLT) transmite os quadros para as Optical Network Units (ONUs) em broadcast, os quadros de controle são enviados na mesma conexão que trafegam os dados. Cada ONU transmite em turnos, quando autorizadas pelo OLT. A OLT regula a largura de banda upstream designada a cada ONU pelo tamanho da janela de transmissão.

Análise dos protocolos

De acordo com Gerard Holzmann, no capítulo 2 de seu livro Design and Validation of Computer Protocols, um protocolo é composto por cinco elementos:

  1. O serviço oferecido pelo protocolo. Ex: protocolo MPCP (outra descrição)
  2. As considerações sobre o ambiente em que o protocolo é executado
  3. O vocabulário de mensagens usadas para implementar o protocolo
  4. A codificação (ou formato) de cada mensagem do vocabulário
  5. O comportamento, definido por regras de intercâmbio responsáveis pela consistência das trocas de mensagens


Com base nesses elementos, deve-se complementar ou adequar a análise dos protocolos selecionados:

Protocolo Serviço Ambiente de execução Vocabulário Codificação Comportamento
NTP Sincronização dos relógios dos computadores ligados a rede. Usa um canal UDP para intercâmbio de mensagens. Pode perder mensagens. Latências de transmissão variáveis (ex: devido a congestionamentos) podem ocorrer. NTP Data packet binária (ver RFC 5905) Há um bom resumo neste documento.
FTP Transferência de arquivos entre computadores conectados em uma rede. Usa dois canais TCP paralelos para intercâmbio de de dados de controle e arquivos. Garante confiabilidade, ou seja, entrega do arquivo enquanto protege de erros de transmissão. Conjunto de comandos: USER, PASS, LIST, STOR, PORT, QUIT. Textual (ASCII ou EBCDIC) ou binária. ( ver RFC 959) 1- Cliente realiza conexão de controle (porta 21) com servidor (modo passivo ou ativo). 2- Com a confirmação positiva, servidor mantém a conexão de controle aberta e aguarda as solicitações de transferência. 3- Em modo de execução ativo o servidor inicia a conexão de dados. 4- Em modo de execução passivo o cliente inicia a conexão de dados para iniciar a transferência.

Atividade

Aplicações de bate-papo (chat) são bastante utilizadas, havendo diversas opções na Internet. Um bate-papo básico, em que se trocam somente mensagens de texto, pode ser implementado sem grande complexidade. Crie uma aplicação de bate-papo com estas características:

  • Modelo cliente-servidor: clientes são os usuários que desejam conversar, e servidor é a aplicação que intermedia as mensagens entre clientes
  • Identificação de usuários: cada usuário deve ser identificado por uma string, a qual é informada pelo próprio usuário ao iniciar o bate-papo
  • Mensagens puramente textuais: cada mensagem enviada ao bate-papo é mostrada ao demais usuários prefixada pela identificação do usuário que a escreveu
  • Mensagens privadas ou públicas: mensagens privadas são mostradas a um único usuário específico, e mensagens públicas são mostradas para todos usuários


O desenvolvimento dessa aplicação implica projetar e implementar um protocolo para o intercâmbio de mensagens. Para a transmissão de mensagens use alguma API de comunicação existente, tal como:

Revisão sobre sockets


O uso de sockets UDP usando a API de sockets pode ser resumida nos seguintes passos:

Cliente ou servidor:

  1. Criar um socket (socket)
  2. Vinculá-lo a um endereço e port (bind)
  3. Enviar e receber dados (sendto, recvfrom)
  4. Encerrá-lo (close)


A API de sockets em sua forma mais elementar é fornecida para linguagem C. Outras linguagens oferecem versões de mais alto nível dessa API, tais como:

Exemplos existem nos tutoriais indicados nos links no início desta seção. Porém para facilitar o uso de sockets foram criadas algumas classes C++:


Cada objeto da classe UDPSocket define um ponto final de comunicação UDP. A descrição de sua interface está em UDPSocket.h (ver comentários). Objetos dessas classes funcionam como sockets, porém com simplificações (não são necessários todos os passos da API de sockets do sistema operacional). Existe um exemplo de utilização nos arquivos uclient.cpp e userver.cpp:

Exemplo de cliente
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include "UDPSocket.h"

using namespace std;

/*
 * 
 */
int main(int argc, char** argv) {
    UDPSocket client;
    
    try {
      // conecta no servidor da wiki
      client.send("hello world ! \n\n", "localhost", 8000);
    } catch (UDPSocket::SocketException e) {
      perror("ao enviar");
    }
    
    
    return 0;
}
Exemplo de servidor
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include "UDPSocket.h"

using namespace std;

/*
 * 
 */
int main(int argc, char** argv) {
    UDPSocket server("0.0.0.0", 8000);
    
    while (true) {
      try {
        string addr;
        int port;

        string dados = server.recv(64, addr, port);
        cout << "Recebeu " << dados.size() << " caracteres de " << addr << ":" << port <<" --> " << dados << endl;
      } catch (UDPSocket::SocketException e) {
        perror("ao enviar");
      }
    }
    
    
    return 0;
}


... mas quem quiser tentar (ou conhecer) algo mais completo, pode experimentar a biblioteca Boost.Asio.