Mudanças entre as edições de "PTC29008: Apresentação"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 91: Linha 91:
 
|  ||  || ||  ||  ||
 
|  ||  || ||  ||  ||
 
|}
 
|}
 
<!--= 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 Multicast''': cada agente de usuário se comunica diretamente com demais agentes de usuário, sem processos intermediários
 
* '''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:
 
* [http://www.linuxhowtos.org/C_C++/socket.htm BSD Sockets] (se feito em C, C++ ou Python)
 
* [https://www.devmedia.com.br/java-socket-entendendo-a-classe-socket-e-a-serversocket-em-detalhes/31894 Java Sockets] (se feito em Java)
 
* [http://zeromq.org/ ZeroMQ] (qualquer linguagem)
 
* ... outra que ache mais conveniente !
 
 
 
A entrega da especificação e do protocolo implementado deve ser feita '''até dia 12/08'''.
 
* [https://moodle.sj.ifsc.edu.br/mod/assign/view.php?id=4217 Entrega da tarefa via Moodle]
 
-->
 
<!--
 
O protocolo [https://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol TFTP](ver também a [https://www.ietf.org/rfc/rfc1350.txt RFC 1350]) possibilita a transferência de arquivos de forma bastante simplificada. Ele não exige autenticação, e a transferência é feita de forma confiável com datagramas UDP. Um uso bastante comum desse protocolo é para transferir firmware ou configuração de equipamentos de rede, e mesmo realizar boot remoto. Sendo assim:
 
# Especifique um protocolo parecido com o TFTP e com essas mesmas características.
 
# Implemente esse protocolo na forma de uma API
 
# Escreva uma aplicação que use seu protocolo de forma a demonstrar seu funcionamento
 
-->
 
<!--
 
== Revisão sobre sockets ==
 
 
* [http://www.linuxhowtos.org/C_C++/socket.htm Um tutorial resumido sobre sockets]
 
* [http://tele.sj.ifsc.edu.br/~msobral/ptc/cs556-3rd-tutorial.pdf Outro tutorial mais completo (cópia no servidor de Tele)] ([http://www.csd.uoc.gr/~hy556/material/tutorials/cs556-3rd-tutorial.pdf versão original])
 
 
 
O uso de sockets UDP usando a API de sockets pode ser resumida nos seguintes passos:
 
 
'''Cliente ou servidor:'''
 
# Criar um socket ([http://manpages.ubuntu.com/manpages/trusty/man2/socket.2.html socket])
 
# Vinculá-lo a um endereço e port ([http://manpages.ubuntu.com/manpages/trusty/man2/bind.2.html bind])
 
# Enviar e receber dados ([http://manpages.ubuntu.com/manpages/trusty/man2/sendto.2.html sendto], [http://manpages.ubuntu.com/manpages/trusty/man2/recvfrom.2.html recvfrom])
 
# Encerrá-lo ([http://manpages.ubuntu.com/manpages/trusty/man2/close.2.html 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:
 
* '''Java:''' [https://www.devmedia.com.br/java-socket-entendendo-a-classe-socket-e-a-serversocket-em-detalhes/31894 Java Sockets]
 
* '''C++:''' [https://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio.html Boost Asio], [https://github.com/mmsobral/socketpp Socket++ (API simplificada)]
 
* '''Python:''' [https://docs.python.org/3/library/socket.html socket library], [https://docs.python.org/3/library/asyncio.html#module-asyncio asyncio], [https://docs.python.org/3/library/socketserver.html socketserver], [https://twistedmatrix.com/trac/ Twisted],
 
 
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++:
 
* [https://github.com/mmsobral/socketpp Socket++: classes para uso simplificado de socket TCP e UDP (versão no github)]
 
 
 
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'':
 
 
{{collapse top| Exemplo de cliente}}
 
<syntaxhighlight lang=c>
 
#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;
 
}
 
</syntaxhighlight>
 
{{collapse bottom}}
 
 
{{collapse top| Exemplo de servidor}}
 
<syntaxhighlight lang=c>
 
#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;
 
}
 
</syntaxhighlight>
 
{{collapse bottom}}
 
 
 
... mas quem quiser tentar (ou conhecer) algo mais completo, pode experimentar a [http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio.html biblioteca Boost.Asio].
 
-->
 

Edição das 16h34min de 14 de fevereiro de 2020

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.


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 com respeito às seguintes aplicações, e anotem suas finalidades e características.

  • Telefonia móvel
  • Automação industrial
  • Agricultura de precisão
  • Segurança
  • Sistema financeiro
  • Redes veiculares
  • IoT


Área de aplicação Protocolo Finalidade Características

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