Mudanças entre as edições de "PTC29008: Projeto 1: Controle de erros"
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
- Implementação de Checksum
- Implementação de CRC em software
- Implementação do CRC-16 para PPP (RFC 1662)
- A Painless Guide to CRC Error Detection Algorithms, 3rd Edition por Ross Williams
- Um pequeno resumo sobre CRC (obtido do livro Comunicação de Dados e Redes de Computadores, de William Stallings)
- Tabela de polinômios geradores para CRC
O controle de erros envolve:
- Detecção de erros: cada mensagem recebida deve ter verificada a integridade de seu conteúdo. Mensagens corrompidas devem ser rejeitadas (descartadas)
- 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.
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
- Analise e escolha uma das técnicas para detecção de erros para seu protocolo.
- 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
|