Mudanças entre as edições de "PTC29008: Projeto 1: Controle de erros"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 7: Linha 7:
 
* [http://tele.sj.ifsc.edu.br/~msobral/ptc/docs/crc_v3.txt ''A Painless Guide to CRC Error Detection Algorithms, 3rd Edition'' por Ross Williams]
 
* [http://tele.sj.ifsc.edu.br/~msobral/ptc/docs/crc_v3.txt ''A Painless Guide to CRC Error Detection Algorithms, 3rd Edition'' por Ross Williams]
 
* [http://tele.sj.ifsc.edu.br/~msobral/ptc/crc.pdf Um pequeno resumo sobre CRC (obtido do livro ''Comunicação de Dados e Redes de Computadores'', de William Stallings)]
 
* [http://tele.sj.ifsc.edu.br/~msobral/ptc/crc.pdf Um pequeno resumo sobre CRC (obtido do livro ''Comunicação de Dados e Redes de Computadores'', de William Stallings)]
 +
* [https://pt.wikipedia.org/wiki/CRC#Padr%C3%B5es_e_Usos Tabela de polinômios geradores para CRC]
  
  

Edição das 14h55min de 8 de março de 2018

Próxima aula



O controle de erros envolve:

  1. Detecção de erros: cada mensagem recebida deve ter verificada a integridade de seu conteúdo. Mensagens corrompidas devem ser rejeitadas (descartadas)
  2. Recuperação de erros: mensagens descartadas devido a erros podem ser recuperadas. Existem duas abordagens:
    • Correção de erros: mensagens incluem bits de redundância que possibilita, dentro de certos limites, corrigir bits corrompidos.
    • Retransmissão: mensagens descartadas são simplesmente retransmitidas

O protocolo de comunicação a ser desenvolvido no projeto 1 deve receber apenas mensagens corretas. Para isso, pelo menos deve ser implementada uma função de detecção de erros.

Detecção de erros

A detecção de erros implica adiciona à mensagem transmitida uma certa quantidade de bits de redundância. Os valores desses bits são determinados com base no conteúdo da mensagem. Na recepção, calcula-se novamente o valor dos bits de redundância e compara-se com os bits de redundância incluídos na mensagem. Se forem iguais, presume-se que mensagem está correta.

PTC-Erros.png
Bits de redundância para detecção de erros


A detecção de erros envolve basicamente a escolha de uma dentre duas técnicas:

  • Checksum (soma de verificação): os bits de redundância são calculados como uma soma de todos os octetos da mensagem.
  • CRC (verificação de redundância cíclica): os bits de redundância são calculados usando uma forma de álgebra polinomial.

Atividade

  1. Analise e escolha uma das técnicas para detecção de erros para seu protocolo.
  2. Implemente a técnica escolhida.


Exemplo da classe Enquadramento com métodos para cálculo e verificação de CRC baseados no código de referência da RFC 1662 (protocolo PPP)
#ifndef FRAMING_H
#define FRAMING_H
 
#include <cstdint>
#include "Serial.h"
 
class Enquadramento {
 public:
  Enquadramento(Serial & dev, int bytes_min, int bytes_max);
  ~Enquadramento();
 
  // envia o quadro apontado por buffer
  // o tamanho do quadro é dado por bytes 
  void envia(char * buffer, int bytes);
 
  // espera e recebe um quadro, armazenando-o em buffer
  // retorna o tamanho do quadro recebido
  int recebe(char * buffer);
 
 private:
  int min_bytes, max_bytes; // tamanhos mínimo e máximo de quadro
  Serial & porta;  
  char buffer[4096]; // quadros no maximo de 4 kB (hardcoded)
 
  enum Estados {Q0, Q1, Q2};
 
  // bytes recebidos pela MEF até o momento  
  int n_bytes; 
 
  // estado atual da MEF
  int estado;
 
  // aqui se implementa a máquina de estados de recepção
  // retorna true se reconheceu um quadro completo
  bool handle(char byte);
 
  // verifica o CRC do conteúdo contido em "buffer". Os dois últimos 
  // bytes desse buffer contém o valor de CRC
  bool check_crc(char * buffer, int len);

  // gera o valor de CRC dos bytes contidos em buffer. O valor de CRC
  // é escrito em buffer[len] e buffer[len+1]
  void gen_crc(char * buffer, int len);

  // calcula o valor de CRC dos bytes contidos em "cp".
  // "fcs" deve ter o valor PPPINITFCS16
  // O resultado é o valor de CRC (16 bits)
  // OBS: adaptado da RFC 1662 (enquadramento no PPP)
  uint16_t pppfcs16(uint16_t fcs, char * cp, int len);

};
 
#endif