Detecção de Erros

André Moreira (andre@dei.isep.ipp.pt)
Professor Adjunto do Departamento de Engenharia Informática do ISEP

Durante a transmissão de uma trama é normal surgirem erros, em grande parte devidos a ruído existente na linha de transmissão.

Quando uma trama é recebida é importante saber se existem erros, se um erro não é detectado essa trama será utilizada pelos níveis superiores originando problemas diversos que se podem estender até às aplicações.

Não só é importante detectar os erros nas tramas como também devem existir mecanismos que permitam a sua correcção. Uma solução é utilizar um mecanismo de detecção de erros dito auto-corrector (“error-correcting code”). A outra solução é pedir ao emissor que efectue a retransmissão da trama (“backward error correction”), é o caso do ARQ ("Automatic Repeat Request").

Os mecanismos auto-correctores também conhecidos por “forward error correction” obrigam a um aumento muito grande da informação de controlo, no limite igual ao comprimento de dado. Por esta razão só é utilizada em situações muito especificas em que não há alternativa, por exemplo numa transmissão “simplex” (unidireccional).

Seja qual for o mecanismo pelo qual se efectua a detecção de erros envolve geralmente a inclusão na trama de um campo contendo informação calculada a partir dos dados ou de toda a trama. Quando o receptor recebe a trama executa o mesmo calculo e compara o valor obtido com o que foi colocado pelo emissor. Se são iguais supõe que não contém erros.

A verificação de paridade é um dos mecanismos mais simples para detecção de erros (“parity check”): a cada caractere transmitido é acrescentado um bit de tal modo que o total de bits 1 seja par (“even parity”) ou impar (“odd parity”). É habitual a utilização de paridade par para comunicações assíncronas e a paridade impar para comunicações síncronas.

Exemplo: usando a paridade par, ao transmitir o byte 01100111, será acrescentado um bit com o valor 1 (para tornar par, o número de bits 1). Quando a informação chega ao receptor este verifica se o número de bits 1 é par e assim saberá se existe algum erro.

A verificação de paridade funciona quando, devido à ocorrência de erros, um número impar de bits é invertido, se esse número é par então o erro não é detectado. Esta situação é vulgar quando existem picos de ruído na linha, que frequentemente induzem erros em vários bits consecutivos.

Existem mecanismos melhorado que utilizam a paridade e permitem diminuir significativamente a probabilidade de um erro não ser detectado.

O LRC (“Longitudinal Redundancy Check”) realiza a mesma operação longitudinalmente para os caracteres transmitidos numa trama. No final da trama é acrescentado um caractere de paridade. Cada bit desse caractere está associado aos mesmos bits dos caracteres transmitidos. A tabela seguinte exemplifica este mecanismo para uma trama de 10 caracteres de 8 bits cada:

A verificação da paridade de cada caractere é também conhecida por VRC (“Vertical Redundancy Check”).

Mais eficiente ainda é o CRC (“Cyclic Redundancy Check”). O CRC não utiliza bits de paridade, os frames transportam uma sequência de bits conhecida por FCS (“Frame Check Sequence”). O FCS é calculado pelo emissor de tal modo que quando concatenado aos bits de dados, o resultado final seja divisível por um número prédeterminado. Existem vários métodos de calcular manualmente o FCS, contudo não é um aspecto relevante, na prática pode ser implementado em hardware com circuitos que efectuam o “shift” de bits e operações lógicas simples.

Como é ilustrado na tabela seguinte, existem vários divisores (predeterminados):